dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号
6 [6 b0 I! r- w5 \9 n1 U然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,2 F" e/ e0 `3 Y6 m
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_# i* O" n0 Z5 B: M
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作: W% U" Y" p: z; ?9 b( Y
7 U3 L6 h) D' T! }( S! K- A0 W _
命令行输入
+ e' V' s5 v$ v+ ~8 F* J9 Ldllproxyskel.exe <input.dll>
w& g; \+ a' Y" ^) G4 x- open file D:\\项目\\dllproxyskel\\input.dll
9 E6 m% P7 T+ @; e7 \
3 Y0 l x2 v5 C, x; b( g7 W D
6 g3 G. ]. Y$ L4 O( J------------------------------------------------------------------
! ]" J+ Y# g" g5 q) E我们需要额外添加的代码
; ?, E/ B9 n( Z0 f; s' P' W" d) h#define _WINGDI_ //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
4 ~ i7 x H$ n9 Z3 F+ Y- o//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION26 R/ x* R" h2 v! C% _
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值
) Q/ B$ r, f+ Z9 x$ |5 mCALL_FUNCTION2(BOOL, ExtTextOutA,
7 g, v- }1 _ Q+ S HDC hdc,
2 Q/ \2 f N3 ?( H INT x,
1 K4 S4 n& ?4 Z' d# B INT y,2 A" s' I- l+ |8 l
UINT flags,3 Q3 B) p! s1 m0 P; X8 U4 r
const RECT* lprect,
) k9 Z3 M% v, N* P8 Z LPCSTR str,2 n' ?/ `5 Z& h# Q$ r, B# o
UINT count,
9 g5 g! w4 F: b8 `* n3 W+ N const INT* lpDx- O( z0 g5 |) u
) {
3 i! }# Z$ c7 t* _: E; w0 } //这里可以做任何你想做的事了,HOOK成功
6 L+ e+ p9 O# [1 C8 g% S outputdebugstr("HOOK ExtTextOutA suscess!");: \$ o( ?! U0 q j
BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数* v+ u$ |1 w. j& D- s- }) S# W
return(result);
. V" I9 p: P% V}
$ a' l6 A- {$ I0 G* Z7 O9 Z; H
" q. @4 F, ?; l注意,生成的代码需要用gcc/mingw来编译,
6 z X5 V. |$ }主要是因为其中使用了gcc宏扩展
0 h4 z5 `9 f4 j7 u* z& x$ d#define CALLING_CONVENTION WINAPI // default for Windows DLLs8 {* n0 U/ |' L A7 q
#define PROXY_FUNCTION(FUNCTION_NAME) /* for the proxified functions not modified */ \\
0 a# [) M$ m! I" f void CALLING_CONVENTION FUNCTION_NAME(void)4 b/ A# L+ [- j0 V$ }
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\
$ w+ {6 ]9 C4 `- ^6 k% `& _3 p4 y static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\+ N% ~# V7 \) C& v
PROXY_FUNCTION(FUNCTION_NAME) { \\4 Q) i! J8 M3 H
POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
& z$ {4 t0 d; T" {+ P9 p* u }
- J8 Z- O! W. v0 c) u#define CALL_FUNCTION(FUNCTION_NAME) \\
2 `, v0 {3 i0 t& O( k1 K0 _8 {1 t ] static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\* z6 d1 m: k Z) Z6 j# v
CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME) b d) l2 n6 E- `0 b
#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\5 N. j& j' [% O' d4 w3 \) f
static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\/ b0 V+ B: r# O0 P. X1 O
CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)' `' @- N$ |* k$ v5 F7 g2 K
, l h& Q4 @1 _$ F
& K3 z8 o, D* x6 S等我回头翻译到VC里
& X9 x5 n+ e) a4 S待续 |