dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号6 k# z4 l, j ]7 T% A
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,: M7 r8 G% {6 U- y% F0 z! E
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_/ N4 W; a& E& B# E! _( c1 M- e
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作8 ~8 `/ ~8 ?* g; \2 h
9 h' w) i2 H3 K' _# v9 Y3 U5 X命令行输入
6 m' J; v% G, `+ k% ]/ V! qdllproxyskel.exe <input.dll>
5 K& |& A! R% a- open file D:\\项目\\dllproxyskel\\input.dll
- Q z. d0 A8 w: E2 T
4 ]5 [6 o7 h% ?0 M. a& B) J. \( x/ q% e, N5 g6 m% W
------------------------------------------------------------------
0 l+ B3 q! _7 O我们需要额外添加的代码! G7 O$ e8 h& ?. d6 C8 t+ `
#define _WINGDI_ //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
0 ]9 \6 ]0 S7 F3 H5 i//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
, }: O5 k w- k5 g& a//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值+ K$ I/ i6 D) c: X/ G
CALL_FUNCTION2(BOOL, ExtTextOutA,
0 }7 ^$ |5 u' S9 N5 z v; b8 [ HDC hdc,! m; C$ z" H& P5 q: W
INT x,% V$ a5 a6 B3 b# C7 K# i
INT y,
- I- N! X: h5 Q3 w& ? UINT flags,
5 [. }( V) m$ ^" [: M0 E const RECT* lprect,0 f7 ^! R Q k
LPCSTR str,
. ^8 L& i& Y4 k6 I UINT count,
7 T* K+ [$ U+ o9 y const INT* lpDx) U3 t9 ^: ]2 P" D7 W& h5 L
) {# Q |: M' \$ b
//这里可以做任何你想做的事了,HOOK成功2 Q( y: ]" U+ N% x
outputdebugstr("HOOK ExtTextOutA suscess!");
; \8 C1 a0 e: c- z6 ]/ { BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数
# ]5 [! p4 J, E. L7 k return(result);2 y0 o, s$ E: x
}( h0 e% c2 `5 h, Y+ t6 Q" K; @
% K: b) m6 q H
注意,生成的代码需要用gcc/mingw来编译,
* m- z F! y1 s主要是因为其中使用了gcc宏扩展5 f J, B$ i: Z8 L: j
#define CALLING_CONVENTION WINAPI // default for Windows DLLs
+ L0 ?. C" d7 a9 A/ F#define PROXY_FUNCTION(FUNCTION_NAME) /* for the proxified functions not modified */ \\4 J4 b+ a2 x! K
void CALLING_CONVENTION FUNCTION_NAME(void)" ?' e+ B/ p& g0 E7 q) A* K" U* ~
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\
7 `- i& J1 b' I' Y static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\
6 W, T" L+ }- G+ G PROXY_FUNCTION(FUNCTION_NAME) { \\
5 }9 O3 B* K0 B/ ] POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
5 y6 U5 X% W- S6 E. l' \0 K }
- Z/ M$ T( `- L( z- e' c#define CALL_FUNCTION(FUNCTION_NAME) \\
" ?9 R6 m% w6 M* I static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
8 J" b6 H% D8 q3 m) u CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
+ c6 J" j' B8 W#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\0 F4 B; s* [" o( z/ @9 e) F
static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\5 v6 S% M( n0 l2 V
CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS), m4 z& U' q- Z3 u- x0 n5 d
' k7 z, d z% a0 n7 O( Z7 {/ R/ U5 l1 q G4 T9 S& r, y& z
等我回头翻译到VC里/ q' b+ [: [" \7 \1 ]/ K M
待续 |