ntaryl Δημοσ. 17 Απριλίου 2008 Δημοσ. 17 Απριλίου 2008 Καλησπερα Ξερει κανεις εδω να μου πει πως μπορω να βρω το IAT απο μια συναρτηση ενος Dll και να μπορεσω να της αλλαξω διευθυνση με τον καταχωρητη JMP? Ευχαριστω πολυ
Aesmade Δημοσ. 18 Απριλίου 2008 Δημοσ. 18 Απριλίου 2008 Δοκίμασε αυτό: > 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); }
ntaryl Δημοσ. 18 Απριλίου 2008 Μέλος Δημοσ. 18 Απριλίου 2008 καλημερα παιδια Ευχαριστω πολυ φιλε ψαχνω να βρω κατι σε Visual basic 6.0 παντως ευχαριστω πολυ
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.