// 操作完毕!将这一块虚拟内存改回原来的保护状态 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
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