Προς το περιεχόμενο

Ευρεση IAT και καταχωρηση σε αλλη Διευθυνση


ntaryl

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπερα

Ξερει κανεις εδω να μου πει πως μπορω να βρω το IAT απο μια συναρτηση ενος Dll και να μπορεσω να της αλλαξω διευθυνση με τον καταχωρητη JMP?

Ευχαριστω πολυ

Δημοσ.

Δοκίμασε αυτό:

>
char *szFuncName="OnomaSynartisis",*szDllName="OnomaDll";
DWORD dwMod=(DWORD)GetModuleHandle(0);
PIMAGE_THUNK_DATA pIAT,pINT;
PIMAGE_IMPORT_BY_NAME pNameImp;
PIMAGE_DOS_HEADER pDOS=(PIMAGE_DOS_HEADER)dwMod;
PIMAGE_NT_HEADERS pNT=(PIMAGE_NT_HEADERS)(dwMod+pDOS->e_lfanew);
PIMAGE_IMPORT_DESCRIPTOR pDesc=(PIMAGE_IMPORT_DESCRIPTOR)(dwMod+pNT->OptionalHeader.DataDirectory[iMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while (pDesc->FirstThunk) {
	if (!stricmp(szDllName,(char*)(dwMod+pDesc->Name))) {
		pIAT=(PIMAGE_THUNK_DATA)(dwMod+pDesc->FirstThunk);
		pINT=(PIMAGE_THUNK_DATA)(dwMod+pDesc->OriginalFirstThunk);
			while (pIAT->u1.Function) {
			pNameImp=(PIMAGE_IMPORT_BY_NAME)(dwMod+pINT->u1.AddressOfData);
				if (!stricmp(szFuncName,pNameImp->Name)) {
					/*Σε αυτό το σημείο, το pIAT->u1.Function είναι ένας
					pointer στη διεύθυνση της συνάρτησης σου, οπότε χρησιμοποιώντας τη VirtualProtect για να γίνει η μνήμη εγγράψιμη μπορείς να χρησιμοποιήσεις τη memcpy ή τη DetourFunction για να κάνεις τη συνάρτηση να κάνει jmp στη διεύθυνση που θέλεις*/
				}
				pIAT++;
				pINT++;
			}
	}
	pDesc++;
}

Ο κώδικας πρέπει να εκτελεστεί μέσα στο πρόγραμμα στο οποίο θες να γίνει το jmp. Επίσης πρέπει να σιγουρευτείς ότι το szFuncName είναι το ακριβές όνομα της συνάρτησης που γίνεται export από το dll.

Ένα παράδειγμα στο οποίο γίνεται hooking του MessageBoxA με τον παραπάνω κώδικα και τη χρήση detours:

>
#include <stdio.h>
#include <windows.h>
#include <detours.h>

DWORD dwEspFix;

int MsgBoxHook(HWND hWnd,char *szMsg,char *szTitle,int nFlags) {
printf("Hooked MessageBoxA called, Message: %s, Title: %s\n",szMsg,szTitle);
return 0;
}

int main() {
DWORD dwProt;
char *szFuncName="MessageBoxA",*szDllName="user32.dll";
DWORD dwMod=(DWORD)GetModuleHandle(0);
PIMAGE_THUNK_DATA pIAT,pINT;
PIMAGE_IMPORT_BY_NAME pNameImp;
PIMAGE_DOS_HEADER pDOS=(PIMAGE_DOS_HEADER)dwMod;
PIMAGE_NT_HEADERS pNT=(PIMAGE_NT_HEADERS)(dwMod+pDOS->e_lfanew);
PIMAGE_IMPORT_DESCRIPTOR pDesc=(PIMAGE_IMPORT_DESCRIPTOR)(dwMod+pNT->OptionalHeader.DataDirectory[iMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while (pDesc->FirstThunk) {
	if (!stricmp(szDllName,(char*)(dwMod+pDesc->Name))) {
		pIAT=(PIMAGE_THUNK_DATA)(dwMod+pDesc->FirstThunk);
		pINT=(PIMAGE_THUNK_DATA)(dwMod+pDesc->OriginalFirstThunk);
			while (pIAT->u1.Function) {
			pNameImp=(PIMAGE_IMPORT_BY_NAME)(dwMod+pINT->u1.AddressOfData);
				if (!stricmp(szFuncName,pNameImp->Name)) {
					VirtualProtect(&pIAT->u1.Function,4,PAGE_READWRITE,&dwProt);
					DetourFunction(pIAT->u1.Function,MsgBoxHook);
					VirtualProtect(&pIAT->u1.Function,4,dwProt,&dwProt);
				}
				pIAT++;
				pINT++;
			}
	}
	pDesc++;
}
MessageBox(0,"Test Message","Test Title",0);
printf("MessageBox called\n");
getchar();
exit(0);
}

Δημοσ.

καλημερα παιδια

Ευχαριστω πολυ φιλε

ψαχνω να βρω κατι σε Visual basic 6.0

παντως ευχαριστω πολυ

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...