dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号
5 Q5 }2 b0 y7 G# V( I然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,
1 U5 k' X d) p; k! E" g通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_
4 g6 Y" Z2 r) ?( ~) l- L比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作: E+ n' U+ |/ J7 K
3 l) Y* N4 g9 c5 z: A
命令行输入
k. k8 C) m* k4 P z; l4 Pdllproxyskel.exe <input.dll>
1 V% A M) \" o# }- open file D:\\项目\\dllproxyskel\\input.dll- q$ U! N( \6 e" G. Z$ p' H
+ c! w; h6 S" ?4 x. t
8 `/ Y8 J* r' p9 |------------------------------------------------------------------ ^5 P4 b6 |. ~ L% `6 E4 A& s$ g
我们需要额外添加的代码: |* z4 o; I( ~0 S |" m% f9 n6 ]
#define _WINGDI_ //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要; D0 @5 z+ ~+ V" i' l
//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
. O7 a/ D9 X9 U0 X' A) @//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值3 M+ R! F. ^ o
CALL_FUNCTION2(BOOL, ExtTextOutA,
& J6 u- A1 m+ b+ M HDC hdc,+ z6 g5 s3 g6 S' O) d8 V
INT x,% d) Q( g+ E! c
INT y,: t3 l4 p# h/ | j) |
UINT flags,# P; ~0 \" r, U1 t4 F
const RECT* lprect,. O9 m) p- a% @% h8 `1 y
LPCSTR str,
6 @( S V) c+ Q5 p5 O UINT count," R2 w) n5 ^7 A L A6 O
const INT* lpDx- ~: o* M3 v, R: f5 P7 i S: O2 A
) {
+ _2 R" B+ C0 W1 }/ N- l' X% ?5 J //这里可以做任何你想做的事了,HOOK成功* A0 U0 A; i9 v7 y2 f" F3 P7 O
outputdebugstr("HOOK ExtTextOutA suscess!");
8 E2 `5 u- ^1 ~+ d+ g: d BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数3 X( o, f3 w) v8 s! I5 J6 y
return(result);
+ d5 a5 U- v9 {( I, q2 P}2 M7 _# [! s. j8 p
) T$ h1 ^8 x, C9 g- K
注意,生成的代码需要用gcc/mingw来编译,
2 j$ J' w3 ~ G* @1 M主要是因为其中使用了gcc宏扩展& `% q Z& [/ V8 x$ \
#define CALLING_CONVENTION WINAPI // default for Windows DLLs* d' n6 F; J6 A; f6 I' M& {+ |
#define PROXY_FUNCTION(FUNCTION_NAME) /* for the proxified functions not modified */ \\
. T7 K/ {0 J$ @5 r void CALLING_CONVENTION FUNCTION_NAME(void) [, y; U' I+ ]& Y* ~6 a d# S# q
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\/ {0 \/ D4 A9 L9 u$ n U
static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\
: S' i. K1 A1 z" { PROXY_FUNCTION(FUNCTION_NAME) { \\4 i* O) G4 i$ l1 z8 o" k0 m, {
POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
8 d) J1 l2 C* ]' q }
4 z( R' {2 I& o9 c* p1 R8 C#define CALL_FUNCTION(FUNCTION_NAME) \\3 G. f1 j- I/ g' Q2 y' M) t a
static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
; r, _% l) Q: n0 y1 _, P2 a CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
. H( u+ ~: t( }8 O5 F1 C V9 m#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\
7 c8 J' T' G. g/ r% e9 W static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\4 i1 p5 q% i, A& d' X$ i
CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
# U7 i& t0 q- C# V f1 Q( p5 x/ a- e& w+ o9 \4 s
8 n+ u/ D6 Z1 C! q6 `* l' ~3 m
等我回头翻译到VC里8 G% i# ]/ o! M3 x& i
待续 |