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 } } IAT недействительным (* PE_file PE) (HINSTANCE HINSTANCE = (HINSTANCE) PE -> ЬиЕ; PIMAGE_DOS_HEADER pdosheader = (PIMAGE_DOS_HEADER) ШпзЬапсе, / / извлечение заголовков PIMAGE_NT_HEADERS pntheaders = (PIMAGE_NT_HEADERS) ((DWORD) HINSTANCE pdosheader + -> e_lfanew) / / и многое другое ... 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)); / / найти адрес IAT в PE заголовка, но поскольку мы стремимся в файле, а не в процессе, мы помним об изменении адреса RVA в RAW PIMAGE_THUNK_DATA pthunkdatain, pthunkdataout; PIMAGE_IMPORT_BY_NAME pimportbyname; DWORD с.в.; PChar Указатель, DWORD IB, символ ЬиЕ *, DWORD ImgSize; PIMAGE_OPTIONAL_HEADER32 отказаться; DWORD адрес; DWORD IAT_adr; DWORD читать; Int я = 0, а (pimportdescriptor -> TimeDateStamp! = 0 | | pimportdescriptor -> имя! = 0) / / извлечение до тех пор, пока я не уйду Импорт:) (PTR = ( PChar) ((DWORD) HINSTANCE PE + -> RVA_to_RAW ((DWORD) pimportdescriptor -> Имя)) / / DLL имя = 0; FindModule IB = (PTR) / / функция ImageBase ищет имя библиотеки (обзор ниже) ЬиЕ = LoadMod (IB) / / функция, описанная ранее зарядки код PE_file ВЭ2 ((HMODULE) ЬиЕ); / / Загрузить исходный код для класса выбирают = ВЭ2. GetOptionalHeader () / / Получить соответствующие ImgSize заголовок = выбрать -> SizeOfImage / / нам необходимо взять коробку из заголовка или ImageSize свободный (ЬиЕ); / / освобождение буфера pthunkdataout = (PIMAGE_THUNK_DATA) ((DWORD) HINSTANCE + PE -> RVA_to_RAW ((DWORD) pimportdescriptor -> FirstThunk)) / / извлечение адрес, по которому они начинают адресов в IAT, если (pimportdescriptor -> Поведение == 0) (pthunkdatain pthunkdataout = / / взять адрес структуры, из которой получить имя функции) остальное (pthunkdatain = (PIMAGE_THUNK_DATA) ((DWORD) HINSTANCE + PE -> RVA_to_RAW ((DWORD) pimportdescriptor -> Поведение)) / / то же самое;)) а (pthunkdatain -> U1. AddressOfData! = NULL) / / если человек еще некоторые функции (если ((DWORD) pthunkdatain -> U1. Порядковые и IMAGE_ORDINAL_FLAG) / / если Порядковый (LPSTR х = MAKEINTRESOURCE (LOWORD (pthunkdatain -> U1. Порядковые)); / / Порядковый адрес = MainImageBase + (pimportdescriptor -> FirstThunk + (я * 4)) / / адрес буфера по адресу функции ReadProcessMemory (hProc (LPCVOID) адрес, и IAT_adr, 4, и чтение); / / воспринимают адрес функции находится в выше скачать, если (IAT_adr <IB | | IAT_adr> (IB + ImgSize)) / / проверяем, если адрес места августе в рамках своего модуля (/ /, если она не проверить модуль, в котором есть функция DWORD HookBase = FindHookModule (IAT_adr) / / загрузка ImageBase модуль, в котором эта функция находится. (Это обсуждение функций позже) спаг [ModName 260]; если (HookBase == 0) / / если нет такого модуля означает, что это просто выделить память например, VirtualAllocEx (зЬгсру (ModName, "Виртуальная память");) зе / / если это взять путь к этому модуль (GetModuleFileNameEx (hProc, (HMODULE) HookBase, ModName, 260);) Е ("Ред:% х (% ы) --- Увлеченные% ы (0x% 0,8 х) \ п", х, PTR, ModName, IAT_adr) / / printfujemy результат:))) остальное (pimportbyname = (PIMAGE_IMPORT_BY_NAME) (PE -> RVA_to_RAW ((DWORD) pthunkdatain -> U1. AddressOfData) + (DWORD) HINSTANCE); адрес = MainImageBase + (pimportdescriptor -> FirstThunk + ( и * 4)) / / здесь такое же, как и выше ReadProcessMemory (hProc (LPCVOID) адрес, и IAT_adr, 4, и читать), если (IAT_adr <IB | | IAT_adr> (IB + ImgSize)) (DWORD = HookBase FindHookModule (IAT_adr); сЬаг [ModName 260], если (HookBase == 0) (зЬгсру (ModName, "Виртуальная память");) остальное (GetModuleFileNameEx (hProc, (HMODULE) HookBase, ModName, 260);) Е (" % ы (% ы) --- Увлеченные% с (0,8% х 0x) \ п ", (символ *) pimportbyname -> Название, PTR, ModName, IAT_adr);)) я + +; / / Следующая функция pthunkdatain + +; pthunkdataout + +;) pimportdescriptor + + / / следующий DLL `ка)) |