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
91
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 } } void IAT (* PE_file PE) (HINSTANCE hInstance = (HINSTANCE) PE - buf>; pdosheader PIMAGE_DOS_HEADER = (PIMAGE_DOS_HEADER) hInstance, / / on va chercher PIMAGE_NT_HEADERS têtes pntheaders = (PIMAGE_NT_HEADERS) ((DWORD) pdosheader + hInstance - e_lfanew>); / / ... et PIMAGE_SECTION_HEADER psectionheader plus = (PIMAGE_SECTION_HEADER) (pntheaders + 1); pimportdescriptor PIMAGE_IMPORT_DESCRIPTOR = (PIMAGE_IMPORT_DESCRIPTOR) ((DWORD) hInstance + PE -> RVA_to_RAW (pntheaders -> OptionalHeader. DataDirectory [1]. VirtualAddress)); / / trouver l'adresse du TAI dans l'en-tête PE, mais que nous cherchons dans le fichier et non pas dans le processus, nous nous souvenons de changer l'adresse de la RVA à RAW PIMAGE_THUNK_DATA pthunkdatain, pthunkdataout; pimportbyname PIMAGE_IMPORT_BY_NAME; DW DWORD; ptr PChar, DWORD IB, char * buf, DWORD ImgSize; PIMAGE_OPTIONAL_HEADER32 opt; adresse DWORD; DWORD IAT_adr; DWORD lire; int i = 0 while (pimportdescriptor -> TimeDateStamp! = 0 | | pimportdescriptor -> Nom! = 0) / / on va chercher si longtemps jusqu'à ce que je suis allé Importations:) (ptr = ( PChar) ((DWORD) hInstance + PE -> RVA_to_RAW ((DWORD) ->) Nom) / / DLL i = 0 pimportdescriptor nom; FindModule IB = (ptr) / / fonction ImageBase recherche le nom de la bibliothèque (aperçu ci-dessous) buf = LoadMod (IB) / / fonction décrite précédemment charge code PE_file PE2 ((HMODULE) buf); / / Chargement du code de la classe opt = PE2. GetOptionalHeader () / / Obtention de la ImgSize en-tête approprié = opt -> SizeOfImage / / nous avons besoin de récupérer la boîte de la tête ou le libre ImageSize (buf); / / Communiqué de l'pthunkdataout buffer = (PIMAGE_THUNK_DATA) ((DWORD) hInstance + PE -> RVA_to_RAW ((DWORD) pimportdescriptor -> FirstThunk)) / / récupération l'adresse où ils commencent les adresses dans le TAI if (pimportdescriptor -> Comportement == 0) (pthunkdataout pthunkdatain = / / récupère l'adresse de la structure à partir de laquelle vous récupérez le nom de la fonction) d'autre (pthunkdatain = (PIMAGE_THUNK_DATA) ((DWORD) hInstance + PE -> RVA_to_RAW ((DWORD) pimportdescriptor -> Comportement)) / / même;)) while (pthunkdatain -> U1. AddressOfData! = NULL) / / sauf si la personne sont encore de certaines fonctionnalités (if ((DWORD) pthunkdatain -> U1. ordinales et IMAGE_ORDINAL_FLAG) / / si ordinal (LPSTR x = MAKEINTRESOURCE (LOWORD (pthunkdatain -> U1. ordinales)); / / adresse ordinal = MainImageBase + (pimportdescriptor -> FirstThunk + (i * 4)) / / adresse du buffer à la fonction de l'adresse ReadProcessMemory (hProc (LPCVOID) adresse, et IAT_adr, 4, et en lecture); / / percevoir l'adresse de la fonction situé au-dessus-téléchargées (IAT_adr <IB | | IAT_adr> (IB + ImgSize)) / / vérifie si l'adresse de l'endroit est août au sein de son module (/ / si elle ne vérifie pas le module dans lequel il ya une fonction DWORD HookBase = FindHookModule (IAT_adr) / / saisir le ImageBase le module dans lequel la fonction est situé. (Cette discussion des fonctions plus tard) [ModName char 260]; if (HookBase == 0) / / s'il n'y a pas de module de tels moyens qu'il est juste la mémoire allouée par exemple, VirtualAllocEx (strcpy (ModName, «mémoire virtuelle»);) else / / si elle est de récupérer le chemin d'accès à ce module (GetModuleFileNameEx (hProc, (HMODULE) HookBase, ModName, 260);) printf ("Ord:% x (% s) --- Hooked% s (0x% .8 X) \ n", x, ptr, ModName, IAT_adr) / / Le résultat printfujemy:))) autre (pimportbyname = (PIMAGE_IMPORT_BY_NAME) (PE -> RVA_to_RAW ((DWORD) pthunkdatain -> U1. AddressOfData) + (DWORD) hInstance); address = MainImageBase + (pimportdescriptor -> FirstThunk + ( et * 4)) / / est ici le même que ci-dessus ReadProcessMemory (hProc (LPCVOID) adresse, et IAT_adr, 4, & lire), si (IAT_adr <IB | | IAT_adr> (IB + ImgSize)) (DWORD HookBase = FindHookModule (IAT_adr); [ModName char 260]; if (HookBase == 0) (strcpy (ModName, «mémoire virtuelle»);) autre (GetModuleFileNameEx (hProc, (HMODULE) HookBase, ModName, 260);) printf (" % s (% s) --- Hooked% s (0x% .8 X) \ n ", (char *) pimportbyname -> Nom, ptr, ModName, IAT_adr);)) + + i; / / pthunkdatain fonction suivante + +; pthunkdataout + +;) pimportdescriptor + + / / Next DLL »ka)) |