dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号: [5 f/ p2 |4 J1 V
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,
/ l* b6 a" H4 x& S通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_
0 G5 u& Z# M3 `# u6 K3 [ {比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作
6 X: v: p2 P( h9 J* s! t" l
4 C6 ?# v: n% ?: n4 O命令行输入
" P7 Y) |1 O' ? ~6 S4 sdllproxyskel.exe <input.dll># x" J4 p- b/ T% X1 K8 h
- open file D:\\项目\\dllproxyskel\\input.dll
" x5 ?9 U3 O; r3 w( l$ |; u0 R
0 o6 W9 u, S# o2 v% b8 T- z/ D' @. A' X
------------------------------------------------------------------
2 V- p; B1 r: m/ P我们需要额外添加的代码
, \; C! x* ~* l, H# F3 a#define _WINGDI_ //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
* ?2 y* [8 k, d* t//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
" S1 g1 t; d& T4 h4 p//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值
- Z% x$ Q, j# o5 B0 G, yCALL_FUNCTION2(BOOL, ExtTextOutA,) K6 M; @/ w9 d- h
HDC hdc,
3 R, d/ V5 a5 G, r* E INT x,
& G5 p( X; [6 X0 I; ~/ N INT y,& t5 c0 C8 Q, |- q# o
UINT flags,' a4 K' N) R6 r
const RECT* lprect,$ Z. ^- e F; Z- A7 o
LPCSTR str,
' k, r1 w% H! _4 q6 ?2 b( b/ o UINT count,
% V3 z' M6 v9 [0 r const INT* lpDx
1 e; e8 g: Y0 d& ?) {
3 K) X* |% p8 H3 H% g //这里可以做任何你想做的事了,HOOK成功
7 X$ C' `9 x0 U) ] outputdebugstr("HOOK ExtTextOutA suscess!");6 e; F" p& C8 H I, W+ `
BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数
h7 t! [+ H$ ]9 q return(result);
6 Q3 p. p& k& {4 G0 M} f( \4 z* P( r
' \4 }; U: {# Z2 z3 g7 Y注意,生成的代码需要用gcc/mingw来编译,) L5 H3 [1 r3 J; ~% f3 n" F3 L- M" _
主要是因为其中使用了gcc宏扩展( W6 j9 K$ W- S; H' b" s3 n9 j) m. y* b
#define CALLING_CONVENTION WINAPI // default for Windows DLLs
8 D! A) w8 Q7 a4 ^8 W#define PROXY_FUNCTION(FUNCTION_NAME) /* for the proxified functions not modified */ \\. w- K$ s1 N% H& i
void CALLING_CONVENTION FUNCTION_NAME(void)7 e% k4 P4 x9 [0 g( c. F) `
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\0 t7 J1 d8 L g6 |
static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\
- W* e" @ C5 o r7 r. m/ m PROXY_FUNCTION(FUNCTION_NAME) { \\# `" q+ F! c$ G4 J# D) l
POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\/ D% z! o# I4 O) |! X- a9 T! h
}2 X5 j+ Z6 | R: N9 [8 K
#define CALL_FUNCTION(FUNCTION_NAME) \\
' m$ R" f& w/ F- o! M7 a b static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
. U7 x6 Z# P) G4 q CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
2 Y' m% ? o! l' s) V$ m#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\: j/ J2 h7 I* y+ H: U* D4 G: S
static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\
5 x# }, h V# q) {( K6 C CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)3 k9 c' |6 j5 N! m7 e$ @: B
( k' o- G% u6 d+ v' j; W
' x, s. e' x& ^) `8 z% p
等我回头翻译到VC里( D/ D( [: z0 R2 A" A$ M/ c P
待续 |