J6 @ // 操作完毕!将这一块虚拟内存改回原来的保护状态 3 Y. q% q% X5 }, - P- n' Q dword dwoldprotect; 7 I0 B( A# ^2 j$ D _assert(virtualprotect(mbi_thunk.baseaddress, mbi_thunk.regionsize, 4 Q! G3 {" M- b; K$ p mbi_thunk.protect, &dwoldprotect)); / J5 Y- k& M. Y5 S7 J" q8 U x/ {7 g setlasterror(error_success); : S7 D4 c% o, Z return true; . x* |8 z6 O0 J9 p8 t } } // 访问image_thunk_data数组中的下一个元素 ' k! h% `) [+ C# Y, b5 ] porigthunk++; prealthunk++; / A5 g0 L* g: I0 o } return true; ; a' m, c" Z: ~; g3 a! z } 6 g' A# t0 P { 9 Y9 }: l" `6 m+ V' C; o3 q // getnamedimportdescriptor函数的实现 pimage_import_descriptor getnamedimportdescriptor(hmodule hmodule, lpcstr szimportmodule) { ! E1 s0 X V8 _0 A // 检测参数 3 [& X1 a: k- ` _assert(szimportmodule); _assert(hmodule); % }0 V! R% c# U' X7 v if ((szimportmodule == null) || (hmodule == null)) { ' K5 K7 p' h1 t/ ~% A _assert(false); 7 X! L9 e3 F9 T i# |/ A( j setlasterrorex(error_invalid_parameter, sle_error); 1 U& l/ [# f' I. q/ I% V/ h" w$ S return null; }
// 得到dos文件头 ' j9 @3 x0 l ~- W, m! d# M' ^4 h pimage_dos_header pdosheader = (pimage_dos_header) hmodule;
// 检测是否mz文件头 . I9 { e l7 F& E% K if (isbadreadptr(pdosheader, sizeof(image_dos_header)) || (pdosheader->e_magic != image_dos_signature)) { _assert(false); setlasterrorex(error_invalid_parameter, sle_error); return null; * _* M8 V2 y. w2 R }
// 取得pe文件头 ( u2 c# i' C+ \ u pimage_nt_headers pntheader = makeptr(pimage_nt_headers, pdosheader, pdosheader->e_lfanew); 8 t3 a# ~2 p4 p K P // 检测是否pe映像文件 : {1 N5 s5 r: h" L if (isbadreadptr(pntheader, sizeof(image_nt_headers)) || ) P, C7 }+ l5 }/ S (pntheader->signature != image_nt_signature)) % S' H1 B% ^6 X1 @ { _assert(false); setlasterrorex(error_invalid_parameter, sle_error); / P( r( k: A8 w! c/ B% I return null; } / i: ~" f& d( W ' ~& Q- C- X0 }9 }- m) K5 M8 \: w: Z1 m5 C // 检查pe文件的引入段(即 .idata section) if (pntheader->optionalheader.datadirectory[image_directory_entry_import].virtualaddress == 0) , i( R9 @ j, r return null; ) A; H; A0 C4 \) E) P
// 得到引入段(即 .idata section)的指针 pimage_import_descriptor pimportdesc = makeptr(pimage_import_descriptor, pdosheader, pntheader->optionalheader.datadirectory[image_directory_entry_import].virtualaddress); % ]; ]& N* V Q7 X8 t( P ( E, {/ f# k: @+ L) K. V+ G) A // 穷举pimage_import_descriptor数组寻找我们需要截获的函数所在的模块 while (pimportdesc->name) { pstr szcurrmod = makeptr(pstr, pdosheader, pimportdesc->name); ( T C9 G3 N3 F+ K8 |3 f3 M if (stricmp(szcurrmod, szimportmodule) == 0) 0 o; U$ W) U6 g6 B break; // 找到!中断循环 // 下一个元素 6 B$ @& N/ N7 K0 H( Z( m9 w pimportdesc++; }
// 如果没有找到,说明我们寻找的模块没有被当前的进程所引入! if (pimportdesc->name == null) & v p: R# x* H+ v3 Y9 _ return null; 7 S7 [) @( d; E& P // 返回函数所找到的模块描述符(import descriptor) 5 _7 a% }! m5 z return pimportdesc; } # N- h; {: p$ v // isnt()函数的实现 bool isnt() { osversioninfo stosvi; memset(&stos |