dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号' ?2 V+ B; }/ i
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,$ b, g9 N0 v# q
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_- a' P! H' I, w: Q% k" U( q
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作6 d$ `, r* ?* ?; d
: v3 s) f2 p* E5 e
命令行输入
3 Q0 |" I5 e. Zdllproxyskel.exe <input.dll>
; j8 I* K( [! V- open file D:\\项目\\dllproxyskel\\input.dll
1 A& q' X$ b" {- J " x! [! N& Y, A: G& L
2 E- h/ P& j5 C6 {; f8 S. P4 @1 ^! l4 ]------------------------------------------------------------------" ]1 ]. t3 F* W- N: Z
我们需要额外添加的代码
' g% b3 I1 Q0 W5 \# O#define _WINGDI_ //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
2 h+ n {) B/ b; j2 I//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
- Z/ {/ |4 H# H) g7 e) C1 I//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值
0 o* Z3 u* y" Z, @5 CCALL_FUNCTION2(BOOL, ExtTextOutA,, x( }" f3 G9 t9 `% `
HDC hdc, p# `9 }2 @- K( N" k5 W
INT x,
. j) t5 V; @5 E8 N- Y8 H: J) z4 T INT y,
2 B' U# ]" X2 f# _1 B5 e- C; Y& z UINT flags,
8 ~. k" Z* J0 V9 q: G; e const RECT* lprect,0 W. C6 m: R0 }6 _5 q
LPCSTR str,- S+ Q! _/ s) t/ i U
UINT count,
0 C1 A; ^. d1 q! E7 n const INT* lpDx
$ m( G' X9 e; G$ B/ s+ G' Y) {
9 G; a9 h- f# I. j, K& t //这里可以做任何你想做的事了,HOOK成功. N5 h7 {: M Y5 `9 D! V+ f
outputdebugstr("HOOK ExtTextOutA suscess!");6 @5 H+ Y1 U8 M
BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数! y" C( J: t! x& Y S& j5 r+ Z
return(result);6 l9 _/ u0 g4 O! F3 d
}
! M& P' z- `% P; c
* ]3 E. |2 p( [( O注意,生成的代码需要用gcc/mingw来编译,
1 E$ f! Z* p9 v1 m% J( o8 s主要是因为其中使用了gcc宏扩展
J0 U$ d4 u! h% X1 d/ o h) v#define CALLING_CONVENTION WINAPI // default for Windows DLLs
+ i' A' q# R# q+ q#define PROXY_FUNCTION(FUNCTION_NAME) /* for the proxified functions not modified */ \\
! q+ A* O& X7 [8 x: a8 z/ C void CALLING_CONVENTION FUNCTION_NAME(void)
, N+ c9 A1 @" M9 ^9 {7 q9 R#define PROXY_FUNCTIONX(FUNCTION_NAME) \\: z& h: _ f% W+ Z& _
static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\
; `6 |3 `( p U6 A PROXY_FUNCTION(FUNCTION_NAME) { \\' K8 G3 q; W" {+ [% f0 Z5 w
POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\# D, i7 U! Z: A) N O
}
6 M' n5 z! n6 h$ j4 Y#define CALL_FUNCTION(FUNCTION_NAME) \\) l9 O/ i) L; K
static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\; ]& V& S3 s( A" h8 ?- v8 m% o
CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
8 p* c6 Z# X, @& \0 `#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\
" v7 j; x: \. U- T/ T7 D static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\( z2 a& j: B3 \/ L% c
CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
6 S7 L: G ~5 ]: p" c' i' a8 H
; |( b- Z3 J; ^8 F, M' l* F; t0 d' m$ f, Q
等我回头翻译到VC里. V) r! l0 B+ c$ B* O9 ~
待续 |