dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号
! l# U: l: z, ?' N; H @然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,$ }( X8 G" L# e! m
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_1 O ^9 B3 ?) R9 `9 p. ~+ w
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作' t3 S) c" d. V2 Q, A" E
1 E+ w4 a4 m5 [" s* M, Q: B4 }5 G命令行输入; j* M# G! T. M, w, M# G
dllproxyskel.exe <input.dll>) o. `7 k% P# a, j Q
- open file D:\\项目\\dllproxyskel\\input.dll
* ?% m4 \1 F: M) ~# u2 e6 M
3 {3 z* j! H i! t4 J2 {/ m$ L+ j2 b1 a" I' h
------------------------------------------------------------------
! O- J4 ^7 s7 C+ M- B7 E我们需要额外添加的代码
8 x! z& z' L- ^- g) ~! r#define _WINGDI_ //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
% j7 C [0 p! | ^- L- C//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2+ d: |( e: I; ?7 F0 w
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值
: O3 w( T* s" X- U3 O4 H2 e. s8 kCALL_FUNCTION2(BOOL, ExtTextOutA,
" p/ D( ~1 Q- P) i8 f' F HDC hdc,
: B0 Z4 q; j/ O3 \5 z8 C" O INT x,; p. |: z! O5 c* k+ y
INT y,; E" J( I S. d5 j" i+ ]) V
UINT flags,; w! W; ?5 M: Z# k' k V: s
const RECT* lprect,& r& X8 o! @ h9 T, O- t( M. H
LPCSTR str,
% b/ m) f; [1 z UINT count," `( b, s6 M1 A2 e2 j
const INT* lpDx/ y1 W: O# i W
) {
" H& O O! A: u( R //这里可以做任何你想做的事了,HOOK成功
0 N7 R* ^+ i M6 H3 _ outputdebugstr("HOOK ExtTextOutA suscess!");6 L4 X; v. h9 W. P3 }: V
BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数" }7 \1 M, m& a0 C2 e
return(result);
) C* Y0 Y# E/ i+ T2 ~! T) |( j}% D% O, A& [% a5 C/ ^
; j/ g6 Z7 r5 M/ G) r- {1 y! Q
注意,生成的代码需要用gcc/mingw来编译,
4 ? w$ c6 T6 D2 r9 G3 M( C主要是因为其中使用了gcc宏扩展
/ U* ~+ G* K7 u#define CALLING_CONVENTION WINAPI // default for Windows DLLs
9 r* m" |; v& Q0 h" H#define PROXY_FUNCTION(FUNCTION_NAME) /* for the proxified functions not modified */ \\
7 [% q% I; Y* F+ R& l- `; u& Q void CALLING_CONVENTION FUNCTION_NAME(void). F7 X/ @0 o/ M0 H# A! s$ [
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\
. g# ]& g& c3 G. L static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\3 M4 C5 S) @( `' x5 a
PROXY_FUNCTION(FUNCTION_NAME) { \\
. ^6 `0 M; ]" [ x% C6 k2 E POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
?3 L a F/ X" ? }' e2 H/ c- l* n
#define CALL_FUNCTION(FUNCTION_NAME) \\/ F+ g: J( P; ~* K
static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
6 ~1 a' o, q/ ]8 p) u7 P CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
' k i0 N; Z8 m1 j#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\
( J" {- ]% Q* A& L3 v; q static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\
0 z) D d+ z7 R CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
M7 N( z1 ]7 {7 @/ k0 C2 ]) D! s
1 w) \: g& O) C9 M) x6 X* U$ }. ^+ X6 E* q0 [/ z5 _; L# L6 n6 |
等我回头翻译到VC里
. e( w6 h$ ^- T) E, \6 ]待续 |