dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号) J1 Z) w& x9 L! V
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,
}0 p+ f% {0 x/ V0 Y# w) L通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_
# O; x1 V9 o5 S( U) ^1 S) e比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作
7 S7 q i- o8 _( ^. d2 R) I& N" D' D, Z \3 r' f! K! [) a, u$ M3 `
命令行输入2 \# k K% A& Y( n' W- z' [' L& e- j
dllproxyskel.exe <input.dll>
8 N- j( e: [7 O5 Z- open file D:\\项目\\dllproxyskel\\input.dll5 e, h1 M/ L q- ^% [
* {' H- H! a9 [( A/ ~
M- |/ Y2 `# O; X8 H, E
------------------------------------------------------------------
7 d a1 W& A; j a+ W7 q6 n我们需要额外添加的代码
1 y* k! K0 k( F7 N7 A I& i#define _WINGDI_ //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
D1 z6 J) a% y% x9 D& ?" l0 \//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2$ ]/ c% q, B, P: h1 S! g! l
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值3 j# u1 ~% O/ h! G1 Z, k: A4 N9 P- ]. V
CALL_FUNCTION2(BOOL, ExtTextOutA,5 v7 b$ Q: t2 E
HDC hdc,
" ^ U0 n5 ]2 p, a9 Z INT x,
( @) ^$ b: A, O' p$ t2 k& y INT y,
+ k0 g: B' h: s4 G+ W& G UINT flags,2 a" G& s4 ^( E
const RECT* lprect,! q; w ?$ U9 @/ H4 I
LPCSTR str,
+ l; C9 A1 n! h; E UINT count,/ `+ _ @/ S9 `2 i) Z
const INT* lpDx
6 F0 P- V" V5 ]/ I) {
, z% w& k9 y3 ^+ m( h+ Y: T //这里可以做任何你想做的事了,HOOK成功9 g; g2 D: u0 [) J
outputdebugstr("HOOK ExtTextOutA suscess!");8 n% q. ?6 e% R; u1 R$ y* K
BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数3 r/ K2 B$ s, W4 j' i
return(result);
$ k$ A& w: H) y) C. J8 [}
: L: `5 R9 F I o, v, A- Z- ~" r
注意,生成的代码需要用gcc/mingw来编译,. w, Z& D& }2 r$ X# t
主要是因为其中使用了gcc宏扩展: ?6 M- C2 B- c" l I# a. C
#define CALLING_CONVENTION WINAPI // default for Windows DLLs" L: i5 [6 _' }# }
#define PROXY_FUNCTION(FUNCTION_NAME) /* for the proxified functions not modified */ \\
5 l. ~% `( }6 c" y% ^0 Z void CALLING_CONVENTION FUNCTION_NAME(void)
$ R" n% }3 q8 v2 i#define PROXY_FUNCTIONX(FUNCTION_NAME) \\
0 e6 G H7 b8 C1 u, o$ L! K! L2 w static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\4 b$ a% W; S; p( H# i+ \3 d3 r( n& r
PROXY_FUNCTION(FUNCTION_NAME) { \\
( V# H# l2 b* p/ X POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\6 G- O1 J0 ]3 \* |2 L
}
. f7 a% F1 t5 f#define CALL_FUNCTION(FUNCTION_NAME) \\
8 ?) y! P; Z. O, e static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\' r/ ]$ v8 [6 k- O3 ]
CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
8 E# T2 |9 d& S# a1 i$ I#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\, d/ a8 v! {3 s+ q" Q" I* `. m
static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\$ R$ F, i, m6 i. G% B {
CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
3 d' |. Q2 T% `8 ~! p/ a C9 q" c+ a8 v/ P" i
2 _6 Q2 t5 U& P6 u0 C
等我回头翻译到VC里1 u6 D- L7 O* t1 X c ^: |2 Q
待续 |