dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号
' c3 B$ g! V4 M* J; {9 q然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,
# P; ?9 }- M& s% e0 x通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_& P2 Q8 x# { D" i% v5 C
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作! o( l1 N4 s7 e; k8 t! S
: ]/ P s# x/ S8 w命令行输入
1 j/ f" D' p: g l+ S/ ~/ Sdllproxyskel.exe <input.dll>
, L9 E" s4 } V( U& T- open file D:\\项目\\dllproxyskel\\input.dll
- `8 o& m e( F: C* B0 w/ C: | % A Z5 Q, s( I* n l/ o6 E
7 }: F4 D% a) q: m; l8 i------------------------------------------------------------------. U8 ?% \7 Z3 E6 {
我们需要额外添加的代码- @+ p3 O0 Y6 B8 B& H
#define _WINGDI_ //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要: u; z. j- f3 u1 n
//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
# ]+ R# `0 ~( k& ?//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值
9 S" f8 ?) t6 v% S: t8 _CALL_FUNCTION2(BOOL, ExtTextOutA,
0 \* }8 I; n& M/ a$ x2 J, `* h HDC hdc,
, V+ m' @$ ~" a$ W' L- G0 b4 M0 h INT x,$ Z1 R3 H) D6 s
INT y,6 p x; D% ^0 T( { `$ ]& c
UINT flags,3 _5 y; p }7 L
const RECT* lprect,
0 S4 h- ?6 }# \, z) h LPCSTR str,* o. D5 i/ o" r* [- h& s
UINT count,& T' u. z1 B$ j* ~! @: r
const INT* lpDx4 J* ^) F- y% ]( B t4 ^# i" A% v8 z
) {
) @1 N( Z" n4 ^6 q6 @' e# K. S5 o //这里可以做任何你想做的事了,HOOK成功
7 y5 p3 a: ?7 X outputdebugstr("HOOK ExtTextOutA suscess!");
$ R2 z9 b; Y8 K" K/ | BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数 T' p5 x2 [- R% R8 E
return(result);% r: l; P* Z; [7 g5 K* t% M, }- F1 i
}
6 ^- }. n$ g0 o! G: z
) A7 a# i: v: f- [$ r" q1 u; L$ P注意,生成的代码需要用gcc/mingw来编译,
; j. R$ w/ w/ q* q' ^主要是因为其中使用了gcc宏扩展/ s! {8 A( W' y
#define CALLING_CONVENTION WINAPI // default for Windows DLLs2 M1 Q2 i+ s" f3 W) b4 B1 r( e
#define PROXY_FUNCTION(FUNCTION_NAME) /* for the proxified functions not modified */ \\
3 G1 ?! J0 b9 b& q' y/ _- ]. \& t+ V void CALLING_CONVENTION FUNCTION_NAME(void)" O8 a" Z) b7 A" U' w5 V
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\2 C3 r% O' u) X- r; h7 ]
static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\3 k$ K& D, Q& f% n! _- L9 o
PROXY_FUNCTION(FUNCTION_NAME) { \\. X* x$ u/ T" ~7 m% \9 l
POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
( \. `" _. c9 k9 D3 b) _, J } o- V5 S+ S. H1 z! z' w
#define CALL_FUNCTION(FUNCTION_NAME) \\
9 Q" ~3 ~- c6 s. F2 Z, L static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
& D; d9 ~; t! @5 Q1 o8 a CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)* |2 ~4 V4 L( b
#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\' y7 k* q7 q5 z# ?
static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\
- Z! v& k0 b, ^/ o! z( W- M9 d CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
5 E9 h/ q* f$ Z* v# P7 U. o4 h% ~1 x S( A+ U
3 `" F. E, O# S" C% `等我回头翻译到VC里1 v6 j! D( _7 p- B u. N
待续 |