使用到的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
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虚拟内存空间之上