改好了,用第一种方式实现的. 6 g- V8 u) x5 `5 W$ E9 l7 p Y
如果需要用到的系统头文件定义变量过多的话,可能不太适合,看你自己主要想实现什么功能吧
* ?* `) ~9 p7 x; o
. S: c7 Q1 s7 S+ \ l) p3 O8 o ]代码先贴出来,gdi32.h里的东西是我从生成的gdi32.c里拷贝 分离出来的,原本是想改进一下,
/ \, J( ?1 C9 } X5 V' e2 u% Q让gdi32.c里#include <windows.h>正常使用,gdi32.h里放重复定义的导出函数
, M5 T$ X' n, t4 W这样尽量减少自己需要自定义的结构. 这一步还没分离完成,不过仅仅是想HOOK ExtTextOutA的话已经够用了
# W% Y, i# @- z! @* _ 9 f5 m- m! [, k1 |" i
# S- G+ P/ K- X9 W
相对原始生成.c文件,修改的部分有
3 ^5 |% _& Y3 i l$ ~1, //_ExtTextOutA = (void *)GetProcAddress(hm, "ExtTextOutA"); * m' W& O! Z9 C: e% `* \! D4 k$ U0 r
_ExtTextOutA = (ExtTextOutA_)GetProcAddress(hm, "ExtTextOutA"); # @3 s% j8 J/ U1 c, T7 H+ c
2,//PROXY_FUNCTION(ExtTextOutA)
/ D7 M, U8 `8 S1 L; `- ^2 x/ c 由自己定义的钩子函数ExtTextOutA取代 $ W/ x. P) v; Q$ s" S) p2 G
3,gcc宏移值 1 _: S- U6 y1 N* v, e2 v+ ^
#define POP_EBP __asm{pop ebp} - g9 s: b8 p8 C9 ?0 U# e1 h& }
#define PROXY_FUNCTION(FUNCTION_NAME) \\
4 {6 U( {+ ~+ R- Y& o PROXY_PROTOTYPE(*_##FUNCTION_NAME) = 0; \\
v% j" S+ f5 ~. j PROXY_PROTOTYPE(FUNCTION_NAME) { \\
. R) b* _, v6 G8 L POP_EBP __asm {jmp _##FUNCTION_NAME} \\ 3 V, ] {# y' e# I
}
8 L7 u! I/ u' z: I; p# v3 u# T( @! `; n; f
记得为VC链接命令行添加 /DEF:"gdi32.def" , D* {. { @: @" q" R- z4 Z7 r/ _
PS:APIhijack好像只是打钩子,而不是伪造DLL |