息,让它调用系统函数重画窗口。 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虚拟内存空间之上  |