1、前言:为什么要这么做
5 b/ v3 h1 P' N3 F很多时候,我们发现一个PE(EXE或DLL)中非常有用且功能独立的函数(call xxxxxxxx),并且已经知道了这个函数的各个入口参数的类型和具体含义,我们想在其他的软件中使用这个函数。于是,我想到了将这个PE中的函数改成一个导出函数,这样,我们就可以在任何软件中通过“LoadLibrary("ThisPE.EXE")”等API来使用这个函数了。 ( D9 l6 {* \7 U( V. L: z# M+ d
1 K- Z+ [ |8 O# D' M
在汉化中的应用是可以直接调用游戏中的解包,压包函数来解包,压包,以及访问游戏中的文本显示函数等等。。。
9 @; D9 \6 }# m" W
: X9 l( r, _' G: B3 n! n& n2、技术基础:已经了解PE结构
8 ?* z& [( L7 ^- Q& S0 f" ~2 V% M5 a$ r+ y) k7 }
3、分类: # ]! p9 a* \9 M1 i$ o
(1)有导出表的DLL和EXE文件--非常简单
3 q m) U) a! I; Q7 a对于这类PE文件,要简单的多,因为只要修改一下PE中的Export,增加上一个导出函数,并把这个导出函数的入口指向我们要导出的call的调用地址(RVA格式)就可以了。甚至可以更简单的处理:找个不用的导出函数,改一下入口就可以了。 0 }$ `* y) _2 `
(2)没有导出表的EXE文件--稍微复杂 " {/ o# o& S( N
因为大部分EXE文件没有导出表,所以我们必须要给它增加一个导出表。其实也很简单,给EXE增加一个节,并在这个节中按照导出表的格式构造一个导出函数,并将这个函数入口指向我们要导出的call的调用地址的RVA,并在PE头中指出其位置和大小。 , j' C2 R3 a1 O
: \: v, D+ P' ^% }/ h7 X6 ~+ o& B
4、举例说明: 4 `2 H1 L2 H$ J: g+ X
test.exe:ImageBase=0x00400000 n& Z: v4 z5 b+ a" `2 h
发现test.exe 的 0x00408050 处为call 0x0040A012 的 0x0040A012是我们要导出的函数,我们将它导出为MyFunction函数。 / D2 y2 e5 G+ C' G
' H$ l: g; K; N( F5 z, b
(1)给test.exe增加一个节:RVA=0x28000,size=0x1000
+ C. R* e, y# q# I: X' N+ ^: E8 J(2)构造导出表:
: m; ? \- R3 m1 }, D. |My_Export_Table dd 0 ;Characteristics 0 A ^# K4 q8 e5 c
My_TimeDateStamp dd 0 ;TimeDateStamp
' c) e& |1 }. _$ u! Q% W& L! F2 v) t, ?dw 0 ;MajorVersion
! z/ L, c5 J$ b, U, M( Odw 0 ;MinorVersion ! S9 p# S. S/ v# G
My_nName dd My_DLL_nName-ImageBase ;nName ' k5 W: Q* x) ?- G1 ~0 Z
dd 1 ;nBase
. g, M8 Y4 O9 `9 K8 Q, ldd 1 ;NumberOfFunctions * U9 {& J( z; b- u
dd 1 ;NumberOfNames
- N& D8 W: q, J, AMy_AddressOfFunctions dd 0x0040A012-ImageBase ;AddressOfFunctions # O9 s T `0 h( T: C7 }
My_AddressOfNames dd My_Fun_Name-ImageBase ;AddressOfNames
% S; p' X6 x, E( B3 R$ t2 OMy_AddressOfNameOrdinals dd 0 ;AddressOfNameOrdinals
8 c! A; q: P& L--------------------------------------------------------------------- t! C; f, v1 g0 \/ b
My_Fun_Name db 'MyFunction',0
- s$ o1 z& |! J! i( u! {$ jMy_DLL_nName db 'test.exe',0
1 G. O) y# G, O) M- ?/ A+ b& j. n
& F9 w$ t4 {3 a: z) _7 J(3)LoadPe修改PE头,将导出表地址填入0x28000,大小填入0x1000,保存。 ) \% L- o! L" w% d
2 g6 Q. n' h9 f7 V7 nSpirng.W/2005.3.14
/ M# Y0 `, w3 M: v/ I% `# T* |. x; N7 F& y+ x7 m* _! z+ C
; f/ t. T/ _7 T+ l, X9 g
-------------------------------------------------------------------------------- |