dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号' K$ x5 y- C: y( ]6 I6 g; L, N/ j
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,
' k( G. ~0 ^3 E1 m通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_& d+ i" Z. g( V& `
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作* l1 Z% G, ^: [( a9 g3 B. Y
$ [( d1 l( \0 o# d( i3 M命令行输入
4 H I& m% Y( o* y, X M, Ddllproxyskel.exe <input.dll>; H. t0 [* T, s8 }4 M0 j# r
- open file D:\\项目\\dllproxyskel\\input.dll
: \8 s f5 N3 H2 q 7 l" `: T! K. f, b0 Y$ ?. S
- b( S" u& _% M; `; l0 u------------------------------------------------------------------ {( L1 o1 y. j% o# q
我们需要额外添加的代码
2 B) [3 ~' c1 v& m0 A' w#define _WINGDI_ //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
) L' u; S% ]0 N3 |4 j9 t) F//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2+ K( ?: U+ Z$ l
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值; t) f0 ?1 X( a1 k7 ]
CALL_FUNCTION2(BOOL, ExtTextOutA,8 m- P6 k( v; {. W- _# T: L
HDC hdc,: h5 _# h& w {$ K. Z) R
INT x,, l5 [5 i" {# P
INT y,
! c. {5 L! p' d Q) h0 r UINT flags,$ G3 [' v. E4 i. F3 b* f8 w
const RECT* lprect,
) q' J( m' g0 w LPCSTR str,9 Y% X& d- A$ h* b
UINT count,' ^! B. u* R6 T0 k- Q
const INT* lpDx
% Q- d. `5 H' i ?( ]3 F; P) {
0 w7 x$ Q' {6 d) p/ \ H: T //这里可以做任何你想做的事了,HOOK成功1 [) x- f) X0 h z, J" O
outputdebugstr("HOOK ExtTextOutA suscess!");
& D9 V5 c4 i% `: j* ?" j BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数
?, [2 y+ j7 t! [& B2 `! K; t" L return(result);3 T/ _2 X6 m: v1 M
}. R4 h) [) J+ V) ~: w( Z
6 I: C2 k( e5 f, `3 j
注意,生成的代码需要用gcc/mingw来编译,8 u1 s% y: J5 \
主要是因为其中使用了gcc宏扩展
4 u! q* x- Q) f/ U* z9 F#define CALLING_CONVENTION WINAPI // default for Windows DLLs( v$ m8 i- E& m% [+ o J; G: {
#define PROXY_FUNCTION(FUNCTION_NAME) /* for the proxified functions not modified */ \\$ c2 s- S/ l9 C4 a8 {* O" X2 j$ O
void CALLING_CONVENTION FUNCTION_NAME(void)
" ] H( o/ ]$ K1 n. |#define PROXY_FUNCTIONX(FUNCTION_NAME) \\
6 W3 ^3 Q6 W* E" n/ Q" W static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\4 H+ h6 ?: C' y& F5 e" M
PROXY_FUNCTION(FUNCTION_NAME) { \\& o# a4 ^) @% D
POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
! ~9 `" Q ^" ]! e }8 u0 ]% d! Y6 A% ^
#define CALL_FUNCTION(FUNCTION_NAME) \\
. k, |/ {# Z% C" I4 D% I/ g/ p static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
9 }- f5 b6 z( m1 S7 I& Z% g CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
5 y0 l5 z0 {; p$ O8 [4 l#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\, _" C( D. m4 G5 W i7 j
static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\/ B6 Y2 S; G9 S* K7 [2 X# e
CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
8 O* r8 A2 r: T: e4 k$ W, r$ F5 O/ z! L; }+ s0 l ^, v. H- h
/ ]' I' Y$ n: h0 `8 f) p% @
等我回头翻译到VC里0 {* ]5 [, T+ N" r: _
待续 |