dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号6 a: o' i9 T9 p! ]7 T
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,; n, g; V' D& k# f& ?
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_
. K2 o3 E% z) `5 Z7 E4 l- B+ c& W2 y比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作( a+ `: U) j1 c
: ?+ q' f; T4 A1 B, t5 f命令行输入4 P! D" f$ n' D) q+ x: g$ D
dllproxyskel.exe <input.dll>
6 C. ~. i7 J1 k! o8 H2 p9 B& q- open file D:\\项目\\dllproxyskel\\input.dll
: @6 [" x/ e3 ~3 L3 c5 X
( n' {4 ~5 p, g
& V# i" ~+ f4 l/ O4 x# |' ^9 Y------------------------------------------------------------------
+ ^4 W% Z3 c$ W& s" P我们需要额外添加的代码
) H8 z: t! ]% a6 ~( f" A#define _WINGDI_ //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要1 K5 u& f9 I4 [8 _* d) c
//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2. v m+ J, m- ?/ x! c/ w
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值' N; Y/ E/ Q$ o$ W
CALL_FUNCTION2(BOOL, ExtTextOutA,
, j0 E l. A2 S/ R7 R HDC hdc,( Q7 t# V b7 U/ i) h' {! J$ o, s
INT x,
2 } M( F, b' @; v8 `. y2 g INT y,
. K4 D% V2 q, l! M6 ~% E4 ? UINT flags,. p G, D- H9 {7 O- a. ]
const RECT* lprect,, s: }' G+ R+ j7 J7 d! J
LPCSTR str,4 {1 W- s) Y& r( x6 m4 F/ q, k9 Q7 X
UINT count,1 f- V0 F% N$ _3 p
const INT* lpDx' }9 M+ _% Q2 \/ j9 ?1 p
) {5 H4 s# B4 ^. [7 _9 v k/ o
//这里可以做任何你想做的事了,HOOK成功& R; j- y. ^' o6 ^4 w2 l
outputdebugstr("HOOK ExtTextOutA suscess!");
4 Q4 G7 K8 I% { i7 H BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数
) u8 J4 L' X6 d2 s; X! E& l return(result);8 {1 O& h3 X0 Z# ` m ~
}
8 m. {( j [9 Z7 q: }9 W V; w: h( P* p4 l
注意,生成的代码需要用gcc/mingw来编译,
; n' C; X A% w8 n* ~主要是因为其中使用了gcc宏扩展
* Y9 U$ F$ B9 `( ~1 H5 ^) E5 U$ Q$ Q" H#define CALLING_CONVENTION WINAPI // default for Windows DLLs
8 D; g" F% M3 {# y$ Z#define PROXY_FUNCTION(FUNCTION_NAME) /* for the proxified functions not modified */ \\
, E1 L$ u2 t" L; \4 B, C void CALLING_CONVENTION FUNCTION_NAME(void)
) J! V6 c+ Q! r#define PROXY_FUNCTIONX(FUNCTION_NAME) \\0 i4 J9 r6 R# X. d9 A
static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\) J# `3 T9 m2 x3 v9 x
PROXY_FUNCTION(FUNCTION_NAME) { \\! o' q6 _6 T( ?: o2 `! G. z3 a% U
POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
2 O/ e3 t) ?6 j7 O }' }$ P3 B8 z$ |# U6 \
#define CALL_FUNCTION(FUNCTION_NAME) \\
8 Y) R3 p$ ~; Y. b J9 ]5 O2 t: D static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\9 V# d c. u) e4 Y- o. G
CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
) B& |- ` q" l' a7 _#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\7 K6 n* ^+ ^/ X% f* y- P$ Y! o: f
static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\
) }+ ]3 V o9 ? U CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)7 \2 _7 w# M+ G% q! V7 D. m
3 n1 E7 K: }$ U* V$ c0 ~
3 y) k2 y/ f, z2 Z0 [ ]: r等我回头翻译到VC里
' M1 K0 k. Q H* I# W待续 |