改好了,用第一种方式实现的.
$ y$ o& F8 }0 \- s# k如果需要用到的系统头文件定义变量过多的话,可能不太适合,看你自己主要想实现什么功能吧 ; e2 ~, a j$ H X5 N
o) J. C. _/ H: ]/ x+ W
代码先贴出来,gdi32.h里的东西是我从生成的gdi32.c里拷贝 分离出来的,原本是想改进一下, 1 {+ t- V4 `- ?0 Q, c
让gdi32.c里#include <windows.h>正常使用,gdi32.h里放重复定义的导出函数 / ~" @) ]. H) A0 K; P2 R. _2 u
这样尽量减少自己需要自定义的结构. 这一步还没分离完成,不过仅仅是想HOOK ExtTextOutA的话已经够用了 $ v8 \# T; P' f9 {; l/ k
4 F( G( g1 ]" L$ F: k% A( m
6 E- j) |' t+ v1 C; B4 C5 {' Q. u5 u相对原始生成.c文件,修改的部分有 + H" v% a/ u' ]& ~( z
1, //_ExtTextOutA = (void *)GetProcAddress(hm, "ExtTextOutA"); . K" ]( `! A7 D& L2 q. O
_ExtTextOutA = (ExtTextOutA_)GetProcAddress(hm, "ExtTextOutA");
9 @. n( e$ Q% X; v9 s7 m! _2,//PROXY_FUNCTION(ExtTextOutA) 8 t# z y! W) K( |8 Z8 g
由自己定义的钩子函数ExtTextOutA取代 # p7 f5 F+ C2 a& X. p; z4 k$ S" Y
3,gcc宏移值 , i% V7 N+ k. Q4 d$ V
#define POP_EBP __asm{pop ebp}
0 ^$ s- B8 r9 y7 |( w; c& P#define PROXY_FUNCTION(FUNCTION_NAME) \\
) n9 X, Q T; z PROXY_PROTOTYPE(*_##FUNCTION_NAME) = 0; \\ 4 F2 P) [- {, o
PROXY_PROTOTYPE(FUNCTION_NAME) { \\
( c. r% m' M, `% S) j) b POP_EBP __asm {jmp _##FUNCTION_NAME} \\ 2 X" i" I' g: p% v# |5 m
} & }, ^; p, \% E2 Q' [
, _( N' x2 C) T
记得为VC链接命令行添加 /DEF:"gdi32.def"
. {3 n- _, d. aPS:APIhijack好像只是打钩子,而不是伪造DLL |