设为首页 加入收藏

TOP

屏幕取词的原理(五)
2011-05-19 23:25:59 来源: 作者: 【 】 浏览:3199
Tags:屏幕 原理
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
首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++ map的基本操作和使用 下一篇 C++ 的引用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: