设为首页 加入收藏

TOP

屏幕取词的原理(二)
2011-05-19 23:25:59 】 浏览:4612
Tags:屏幕 原理
息,让它调用系统函数重画窗口。 5 [  B) x$ i* s
使用到的api函数:windowfrompoint,screentoclient,invalidaterect ) }% Z, i+ V5 H3 y
3. 截获对系统函数的调用,取得参数,也就是我们要取的词。 
对于大多数的windows应用程序来说,如果要取词,我们需要截获的是“gdi32.dll”中的“textouta”函数。 8 G2 z9 I- U& Y; b  J
我们先仿照textouta函数写一个自己的mytextouta函数,如: 
bool winapi mytextouta(hdc hdc, int nxstart, int nystart, lpcstr lpszstring,int cbstring) 
0 W1 N$ K* s: H' D; D
// 这里进行输出lpszstring的处理 
// 然后调用正版的textouta函数 . z" j, x' J# N' Z# }# M

把这个函数放在安装了钩子的动态连接库中,然后调用我们最后给出的hookimportfunction函数来截获进程 1 z3 L- i! y/ C2 o8 b1 a
对textouta函数的调用,跳转到我们的mytextouta函数,完成对输出字符串的捕捉。hookimportfunction的 
用法:   N7 u# L. o; m/ j: Q
hookfuncdesc hd; ; ]* y& s8 M$ k- e
proc porigfuns; 2 N. f+ n& r6 L
hd.szfunc="textouta"; ; O9 ^4 e3 b4 R1 l, u$ z6 ]
hd.pproc=(proc)mytextouta; 
hookimportfunction (afxgetinstancehandle(),"gdi32.dll",&hd,porigfuns); 
下面给出了hookimportfunction的源代码,相信详尽的注释一定不会让您觉得理解截获到底是怎么实现的 
很难,ok,let’s go: 

///////////////////////////////////////////// begin /////////////////////////////////////////////////////////////// 
#include <crtdbg.h> # y) [. b" J- H, A2 a

// 这里定义了一个产生指针的宏 ! ^% B; H" J( a- l/ s# K5 w
#define makeptr(cast, ptr, addvalue) (cast)((dword)(ptr)+(dword)(addvalue)) 

// 定义了hookfuncdesc结构,我们用这个结构作为参数传给hookimportfunction函数 
typedef struct tag_hookfuncdesc 
( `9 T' e$ ]/ f7 [7 z6
lpcstr szfunc; // the name of the function to hook. 9 Q. C" a1 l$ f
proc pproc; // the procedure to blast in. 
} hookfuncdesc , * lphookfuncdesc; 3 C/ O  M( ) i. w$ z: M0 r6 d
5 u1 A  P  J8 {% G% }
// 这个函数监测当前系统是否是windownt 
bool isnt(); 
0 z5 _' `' L( K
// 这个函数得到hmodule -- 即我们需要截获的函数所在的dll模块的引入描述符(import descriptor) & f6 ^/ h! f1 f! \% F9 M, _
pimage_import_descriptor getnamedimportdescriptor(hmodule hmodule, lpcstr szimportmodule); - G, `( d0 f1 `/ i4 v- z& J( K

, u9 c: {, x0 I& V
Top 
. Q+ l  Q. k0 y# B2 g. H4 ]) W! v
回复人: KylixMaster(阿Q) ( ) 信誉:100 2002-3-28 23:12:07 得分:0 ; S- M3 G( l# q$ V; b' L6 K
% m) V+ X4 L) t9 a5 a


// 我们的主函数 
bool hookimportfunction(hmodule hmodule, lpcstr szimportmodule, 0 P1 w: }  T% |% _' x
lphookfuncdesc pahookfunc, proc* paorigfuncs) 0 M/ Y# ^  z9 M/ }* R; x9 [7 d4 O

/////////////////////// 下面的代码检测参数的有效性 //////////////////////////// " X+ w5 e5 M( Y- i8 u$ H  C8 Y/ X
_assert(szimportmodule); 
_assert(!isbadreadptr(pahookfunc, sizeof(hookfuncdesc))); 
#ifdef _debug 3 t, v, _# v0 G
if (paorigfuncs) _assert(!isbadwriteptr(paorigfuncs, sizeof(proc))); 
_assert(pahookfunc.szfunc); 
_assert(*pahookfunc.szfunc != ’\0’);   x+ D* k: `6 E! X6 J1 O1 b
_assert(!isbadcodeptr(pahookfunc.pproc)); 
#endif 
if ((szimportmodule == null) || (isbadreadptr(pahookfunc, sizeof(hookfuncdesc)))) 

_assert(false); + F# W0 R' P. A/ i& ]& E4 D8 b
setlasterrorex(error_invalid_parameter, sle_error); : V7 ~. ^+ I/ I9 P5 o
return false; 
; D! J6 t* @+ |8 a# q5 U  R! n
////////////////////////////////////////////////////////////////////////////// 
$ J  ~! X) i$ x0 R
// 监测当前模块是否是在2gb虚拟内存空间之上 
首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++ map的基本操作和使用 下一篇 C++ 的引用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目