改好了,用第一种方式实现的.
( z; W' i& ^. P F如果需要用到的系统头文件定义变量过多的话,可能不太适合,看你自己主要想实现什么功能吧
6 ~' O6 @* p) r# b/ D P9 C) z
% K, E5 w1 g$ ]$ {7 u代码先贴出来,gdi32.h里的东西是我从生成的gdi32.c里拷贝 分离出来的,原本是想改进一下, ' w. ?% l6 i# S9 ~* a8 x
让gdi32.c里#include <windows.h>正常使用,gdi32.h里放重复定义的导出函数 3 A# i$ U' W1 q
这样尽量减少自己需要自定义的结构. 这一步还没分离完成,不过仅仅是想HOOK ExtTextOutA的话已经够用了
0 Z% t+ P! E' Z3 E ^* d w3 m/ T $ Z1 O0 h( l4 W
5 {7 P) m) d" G- F- o
相对原始生成.c文件,修改的部分有
' c& w6 Z) i/ z! n2 { s, U1, //_ExtTextOutA = (void *)GetProcAddress(hm, "ExtTextOutA"); ' s% R9 Z4 |: g- q
_ExtTextOutA = (ExtTextOutA_)GetProcAddress(hm, "ExtTextOutA");
2 \. C7 P7 I6 `. ]+ w- y2,//PROXY_FUNCTION(ExtTextOutA)
c* S% @$ X& [5 ~ 由自己定义的钩子函数ExtTextOutA取代
" [' Y: ~$ c( s5 ^% \3,gcc宏移值
# M& q( L! z# d#define POP_EBP __asm{pop ebp} 1 I7 b" \- ?8 v, A' ]
#define PROXY_FUNCTION(FUNCTION_NAME) \\ $ P; N8 H3 G) a
PROXY_PROTOTYPE(*_##FUNCTION_NAME) = 0; \\ + h/ `9 c$ z x( c8 ?: r
PROXY_PROTOTYPE(FUNCTION_NAME) { \\
4 ^( R: t+ C9 s7 o q' V. D i POP_EBP __asm {jmp _##FUNCTION_NAME} \\
% f: P2 `2 p. t! ?* N2 B Q }
% J7 c) {4 O# _* |* D
* {- H8 u6 k) w. _ Z5 X记得为VC链接命令行添加 /DEF:"gdi32.def"
. z8 g- Y% L. z4 P4 HPS:APIhijack好像只是打钩子,而不是伪造DLL |