dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号) k: [9 t3 \" u# K2 s0 d
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,% S. q2 C+ f. r
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_# [0 f, i$ o- {+ p" S
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作
6 b+ W0 }8 G5 i5 P- i+ z8 x
% A$ J! ~" [. {) V, d( I命令行输入$ L. l7 f2 F M- c
dllproxyskel.exe <input.dll>
( j3 Y3 |+ Q5 `- e8 V' o, p) f- open file D:\\项目\\dllproxyskel\\input.dll
' i3 t2 C+ p8 r1 u$ [& d 0 F0 @4 W% G9 u0 |
3 |0 w4 Z0 Z8 m/ q( x4 v
------------------------------------------------------------------0 s; k9 n; U0 y' v( V$ m" V6 u& m0 T
我们需要额外添加的代码
) W' T3 q) ] I' y O; S#define _WINGDI_ //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
$ S* j2 l7 \! W8 c# B3 u//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
( s: z7 _& R+ m$ p//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值- S- i" O! K( ~
CALL_FUNCTION2(BOOL, ExtTextOutA,
, ?, A3 b6 `% ? HDC hdc,
+ ]4 t1 R9 E1 a: I# l INT x,% @' E$ \% [$ ~ A3 ]' d
INT y,0 p+ P( D; P5 x
UINT flags,
/ a' }: V9 q( ^6 x Z0 @ const RECT* lprect,/ Y4 w. \# D8 s% |5 M2 w* K: R
LPCSTR str,1 N! T T$ c8 V# M2 ~
UINT count,, h/ i7 Z B- E. g/ K, p0 L
const INT* lpDx# i8 ]# n9 ^1 d
) {) z; `% P9 R. }$ l1 E/ P, w
//这里可以做任何你想做的事了,HOOK成功5 s' i* {5 ?/ U
outputdebugstr("HOOK ExtTextOutA suscess!");2 E6 G& g/ k0 B3 ?0 l( [$ J S
BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数" _2 _+ T( A; {
return(result);
$ `% D% z2 D# q1 u5 i}: p# Z% b, E9 J s: d' I
: S9 ~) {4 M3 h, F1 t1 o* j0 {+ C* ?
注意,生成的代码需要用gcc/mingw来编译,# H2 N8 p4 s5 o( W
主要是因为其中使用了gcc宏扩展5 i# Y4 L0 n V+ ~, G
#define CALLING_CONVENTION WINAPI // default for Windows DLLs
5 b' x* T8 v, Y; d#define PROXY_FUNCTION(FUNCTION_NAME) /* for the proxified functions not modified */ \\' F3 P5 }$ ~% ?8 d8 N
void CALLING_CONVENTION FUNCTION_NAME(void)
$ g2 c% m& }& Q1 i: i0 E' R#define PROXY_FUNCTIONX(FUNCTION_NAME) \\3 c1 W% {+ j$ `5 O7 O
static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\
7 ~* Q. D$ ]3 R8 a( G( m# W& M+ U PROXY_FUNCTION(FUNCTION_NAME) { \\
" v+ @8 [2 `3 J3 M' K6 Y6 m; X POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
* K/ y/ _+ g! ?! \, Q! e, V }
( ?8 x' }0 u G8 Q, J3 r; z#define CALL_FUNCTION(FUNCTION_NAME) \\- }& x( k* a; M9 O* W, C+ [
static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\, H; e! w) W8 j$ `. m; p
CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)3 A* M, u' ~1 P4 A2 y
#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\6 P2 T; l* q% _6 Y" ~: `" }6 z
static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\$ G) m7 {- ~& K6 w: x3 q/ `2 M
CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
. `' Y& _8 b9 D9 B V5 r
/ i/ t8 p4 d' G; f( a R8 H5 ^; e! I" c, n7 n/ s
等我回头翻译到VC里* O/ y ?9 ~$ w: l
待续 |