1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
1991
92
93
94
95
96
| PE_file * PE ) { HINSTANCE hInstance = ( HINSTANCE ) PE - > buf ; PIMAGE_DOS_HEADER pdosheader = ( PIMAGE_DOS_HEADER ) hInstance ; //pobieramy naglowki PIMAGE_NT_HEADERS pntheaders = ( PIMAGE_NT_HEADERS ) ( ( DWORD ) hInstance + pdosheader - > e_lfanew ) ; //i dalej... PIMAGE_SECTION_HEADER psectionheader = ( PIMAGE_SECTION_HEADER ) ( pntheaders + 1 ) ; PIMAGE_IMPORT_DESCRIPTOR pimportdescriptor = ( PIMAGE_IMPORT_DESCRIPTOR ) ( ( DWORD ) hInstance + PE - > RVA_to_RAW ( pntheaders - > OptionalHeader. DataDirectory [ 1 ] . VirtualAddress ) ) ; //znajdujemy adres IAT w naglowku PE ale jako ze szukamy w pliku a nie w procesie pamietamy o zamianie adresu z RVA na RAW PIMAGE_THUNK_DATA pthunkdatain, pthunkdataout ; PIMAGE_IMPORT_BY_NAME pimportbyname ; DWORD dw ; PCHAR ptr ; DWORD IB ; char * buf ; DWORD ImgSize ; PIMAGE_OPTIONAL_HEADER32 opt ; DWORD address ; DWORD IAT_adr ; DWORD read ; int i = 0 ; while ( pimportdescriptor - > TimeDateStamp ! = 0 || pimportdescriptor - > Name ! = 0 ) //pobieramy tak dlugo importy az sie skoncza :) { ptr = ( PCHAR ) ( ( DWORD ) hInstance + PE - > RVA_to_RAW ( ( DWORD ) pimportdescriptor - > Name ) ) ; //Nazwa biblioteki Dll i = 0 ; IB = FindModule ( ptr ) ; //Funkcja szukajaca ImageBase na podstawie nazwy biblioteki(omowie dalej) buf = LoadMod ( IB ) ; //opisana wczesniej funkcja ladujaca kod PE_file PE2 ( ( HMODULE ) buf ) ; //ladujemy kod do klasy opt = PE2. GetOptionalHeader ( ) ; //Pobieramy odpowiedni header ImgSize = opt - > SizeOfImage ; //pobieramy potrzebne nam pole z tego headera czyli ImageSize free ( buf ) ; //zwalniamy bufor pthunkdataout = ( PIMAGE_THUNK_DATA ) ( ( DWORD ) hInstance + PE - > RVA_to_RAW ( ( DWORD ) pimportdescriptor - > FirstThunk ) ) ; //pobieramy adres gdzie zaczynaja sie adresy w IAT if ( pimportdescriptor - > Characteristics == 0 ) { pthunkdatain = pthunkdataout ; //pobieramy adres struktury z ktorej pobierzemy nazwy funkcji } else { pthunkdatain = ( PIMAGE_THUNK_DATA ) ( ( DWORD ) hInstance + PE - > RVA_to_RAW ( ( DWORD ) pimportdescriptor - > Characteristics ) ) ; //to samo ;) } while ( pthunkdatain - > u1. AddressOfData ! = NULL ) //dopuki sa jeszcze jakies funkcje { if ( ( DWORD ) pthunkdatain - > u1. Ordinal & IMAGE_ORDINAL_FLAG ) //jesli Ordinal { LPSTR x = MAKEINTRESOURCE ( LOWORD ( pthunkdatain - > u1. Ordinal ) ) ; //Ordinal address = MainImageBase + ( pimportdescriptor - > FirstThunk + ( i * 4 ) ) ; //adres bufora na adres funkcji ReadProcessMemory ( hProc, ( LPCVOID ) address, & IAT_adr, 4 , & read ) ; //Odczytujemy adres funkcji znajdujacej sie pod adresem pobranym wyzej if ( IAT_adr < IB || IAT_adr > ( IB + ImgSize ) ) //sprawdzamy czy adres miesci sie w granicach swojego modułu { //jesli nie to sprawdzamy w jakim module znajduje sie funkcja DWORD HookBase = FindHookModule ( IAT_adr ) ; //pobieramy ImageBase modułu w ktorym znajduje sie ta funkcja.(Ta funkcje omowie pozniej) char modname [ 260 ] ; if ( HookBase == 0 ) //jesli nie ma takiego modulu oznacza ze jest to poprostu zaalokowana pamiec np. przez VirtualAllocEx { strcpy ( modname, "Virtual Memory" ) ; } else //jesli jest to pobieramy sciezke do tego modułu { GetModuleFileNameEx ( hProc, ( HMODULE ) HookBase,modname, 260 ) ; } printf ( "Ord: %x(%s) --- Hooked by %s(0x%.8x) \n " ,x,ptr,modname,IAT_adr ) ; //printfujemy wynik :) } } else { pimportbyname = ( PIMAGE_IMPORT_BY_NAME ) ( PE - > RVA_to_RAW ( ( DWORD ) pthunkdatain - > u1. AddressOfData ) + ( DWORD ) hInstance ) ; address = MainImageBase + ( pimportdescriptor - > FirstThunk + ( i * 4 ) ) ; //tutaj to samo co wyzej ReadProcessMemory ( hProc, ( LPCVOID ) address, & IAT_adr, 4 , & read ) ; if ( IAT_adr < IB || IAT_adr > ( IB + ImgSize ) ) { DWORD HookBase = FindHookModule ( IAT_adr ) ; char modname [ 260 ] ; if ( HookBase == 0 ) { strcpy ( modname, "Virtual Memory" ) ; } else { GetModuleFileNameEx ( hProc, ( HMODULE ) HookBase,modname, 260 ) ; } printf ( "%s(%s) --- Hooked by %s(0x%.8x) \n " , ( char * ) pimportbyname - > Name,ptr,modname,IAT_adr ) ; } } i ++ ; //nastepna funkcja pthunkdatain ++ ; pthunkdataout ++ ; } pimportdescriptor ++ ; //nastepna DLL`ka } } IAT void (* PE_file PE) (HINSTANCE hInstance = (HINSTANCE) PE -> buf; PIMAGE_DOS_HEADER pdosheader = (PIMAGE_DOS_HEADER) hInstance, / / Header holen PIMAGE_NT_HEADERS pntheaders = (PIMAGE_NT_HEADERS) ((DWORD) hInstance + pdosheader -> e_lfanew); / / und vieles mehr ... PIMAGE_SECTION_HEADER psectionheader = (PIMAGE_SECTION_HEADER) (pntheaders + 1); PIMAGE_IMPORT_DESCRIPTOR pimportdescriptor = (PIMAGE_IMPORT_DESCRIPTOR) ((DWORD) hInstance + PE -> RVA_to_RAW (pntheaders -> OptionalHeader. DataDirectory [1]. VirtualAddress)) / / finden Sie die Adresse des IAT in den PE-Header, sondern wie wir versuchen in der Datei und nicht in den Prozess, den wir pthunkdataout erinnere mich über das Ändern der Adresse des RVA, um RAW PIMAGE_THUNK_DATA pthunkdatain,; PIMAGE_IMPORT_BY_NAME pimportbyname; DWORD dw; PChar ptr, DWORD IB, char * buf, DWORD ImgSize; PIMAGE_OPTIONAL_HEADER32 opt; DWORD-Adresse; DWORD IAT_adr; DWORD lesen; int i = 0 while (pimportdescriptor -> TimeDateStamp! = 0 | | pimportdescriptor -> Name! = 0) / / fetch so lange, bis ich weg bin Imports:) (ptr = ( PChar) ((DWORD) hInstance + EP -> RVA_to_RAW ((DWORD) pimportdescriptor -> Name)) / / DLL name i = 0; FindModule IB = (ptr) / / Funktion ImageBase der Suche nach dem Namen der Bibliothek (Überblick unten) buf = LoadMod (IB) / / Funktion (zuvor beschriebenen Erhebung Code PE2 PE_file (HMODULE) buf); / / Lade den Code für die Klasse opt = PE2. GetOptionalHeader () / / Holen Sie sich das entsprechende Header-ImgSize = opt -> SizeOfImage / / wir müssen) packen die Kiste aus dem Header oder ImageSize free (buf; / / Lassen Sie die Puffer pthunkdataout = (PIMAGE_THUNK_DATA) ((DWORD) hInstance + PE -> RVA_to_RAW ((DWORD) pimportdescriptor -> FirstThunk)) / / fetch die Adresse, wo sie beginnen, die Adressen in der IAT if (pimportdescriptor -> Verhalten == 0) (pthunkdatain pthunkdataout = / / grab die Adresse, von der Sie Namen abzurufen, die Struktur-Funktion) else (pthunkdatain = (PIMAGE_THUNK_DATA) ((DWORD) hInstance + PE -> RVA_to_RAW ((DWORD) pimportdescriptor -> Verhalten)) / / dasselbe;)) while (pthunkdatain -> U1. AddressOfData! = NULL) / / wenn die Person noch einige Features (if ((DWORD) pthunkdatain -> U1. Ordinal & IMAGE_ORDINAL_FLAG) / / wenn Ordinal (LPSTR x = MAKEINTRESOURCE (LOWORD (pthunkdatain -> U1. Ordinal)); / / Ordinal-Adresse = MainImageBase + (pimportdescriptor -> FirstThunk + (und 4 *)) / / Adresse des Puffers an die Adresse Funktion ReadProcessMemory (hProc (LPCVOID) Adresse & IAT_adr, 4, & lesen); / / wahrnehmen, die Adresse der Funktion zu überprüfen gefunden in den oben heruntergeladen if (IAT_adr <IB | | IAT_adr> (IB + ImgSize)) / / wenn die Anschrift des Ortes ist August in seinem Modul (/ / wenn es nicht überprüfen das Modul, in dem es eine Funktion DWORD HookBase = FindHookModule (IAT_adr) / / grab der ImageBase das Modul, wo es diese Funktion. (Die Diskussion über die Funktionen später) char ModName [260]; if (HookBase == 0) / / Wenn es kein solches Modul bedeutet, dass es nur Memory zugewiesenen Speicher zum Beispiel durch VirtualAllocEx (strcpy (ModName, "Virtual");) else / / wenn es packen Sie den Pfad zu diesem Modul (GetModuleFileNameEx (hProc (HMODULE) HookBase, ModName, 260);) printf ("Ord: x% (% s)% s --- Hooked (0x% .8 x) \ n", x, ptr, ModName, IAT_adr) / / printfujemy Ergebnis:) ()) else pimportbyname = (PIMAGE_IMPORT_BY_NAME) (PE -> RVA_to_RAW ((DWORD) pthunkdatain -> U1. AddressOfData) + (DWORD) hInstance); address = MainImageBase + (pimportdescriptor -> FirstThunk + ( und * 4)) / / hier ist das gleiche wie oben ReadProcessMemory (hProc (LPCVOID) Adresse & IAT_adr, 4, & lesen); if (IAT_adr <IB | | IAT_adr> (IB + ImgSize)) (DWORD HookBase = FindHookModule (IAT_adr); char ModName [260]; if (HookBase == 0) (strcpy (ModName, "Virtual Memory");) else (GetModuleFileNameEx (hProc (HMODULE) HookBase, ModName, 260);) printf (" % s (% s)% s --- Hooked (0x% .8 x) \ n ", (char *) pimportbyname -> Name, ptr, ModName, IAT_adr))) und + / / nächste Funktion pthunkdatain + +; pthunkdataout + +;) pimportdescriptor + + / / nächste DLL `ka)) |