1、前言:为什么要这么做 ! O- o; b c2 @7 R4 P
很多时候,我们发现一个PE(EXE或DLL)中非常有用且功能独立的函数(call xxxxxxxx),并且已经知道了这个函数的各个入口参数的类型和具体含义,我们想在其他的软件中使用这个函数。于是,我想到了将这个PE中的函数改成一个导出函数,这样,我们就可以在任何软件中通过“LoadLibrary("ThisPE.EXE")”等API来使用这个函数了。 8 i5 H! W7 F" T
" V: u* e) [. L: s- \8 p' a- o在汉化中的应用是可以直接调用游戏中的解包,压包函数来解包,压包,以及访问游戏中的文本显示函数等等。。。" u' B1 h' a" M S
8 s- q0 u( g* t3 l& v# M' X
2、技术基础:已经了解PE结构 & R7 P4 \( F! f* [! M$ T1 Q( I% l
7 x. b) }( N% O9 M
3、分类:
4 F. X# \0 V. Q$ {7 y' a(1)有导出表的DLL和EXE文件--非常简单 0 D+ |* P8 m* n$ C1 c" w
对于这类PE文件,要简单的多,因为只要修改一下PE中的Export,增加上一个导出函数,并把这个导出函数的入口指向我们要导出的call的调用地址(RVA格式)就可以了。甚至可以更简单的处理:找个不用的导出函数,改一下入口就可以了。
+ z. t% @% g0 t5 R(2)没有导出表的EXE文件--稍微复杂
5 n( U5 q$ M6 E. L8 T3 w$ [因为大部分EXE文件没有导出表,所以我们必须要给它增加一个导出表。其实也很简单,给EXE增加一个节,并在这个节中按照导出表的格式构造一个导出函数,并将这个函数入口指向我们要导出的call的调用地址的RVA,并在PE头中指出其位置和大小。 1 {; X6 C* n8 [1 |) P; @
2 Q% g+ {. o( c8 s$ K9 q' ~4、举例说明:
+ }# o) c9 \+ {- j, [) h9 htest.exe:ImageBase=0x00400000
: {3 t5 }* x+ }- o- g发现test.exe 的 0x00408050 处为call 0x0040A012 的 0x0040A012是我们要导出的函数,我们将它导出为MyFunction函数。
2 A: ~9 B3 |, ]/ U" Q
?2 l& h i9 s" M(1)给test.exe增加一个节:RVA=0x28000,size=0x1000
, N+ Z) _! { J p- q) m(2)构造导出表:
g$ }( {# U! T% m( UMy_Export_Table dd 0 ;Characteristics
" Z) e: e& D) w. CMy_TimeDateStamp dd 0 ;TimeDateStamp
0 D3 L5 o0 a3 T9 Q3 x1 [4 Udw 0 ;MajorVersion
3 O7 Y" J3 u/ w/ i% r2 Xdw 0 ;MinorVersion 3 k+ u d, H* }; C8 `
My_nName dd My_DLL_nName-ImageBase ;nName
0 A" {" M7 Q% w+ y$ t4 V. `dd 1 ;nBase
& B% l# Z' L r% |+ V+ idd 1 ;NumberOfFunctions 0 w6 E* g% c) O2 u
dd 1 ;NumberOfNames 5 S" }- H( {1 l& J- @0 s
My_AddressOfFunctions dd 0x0040A012-ImageBase ;AddressOfFunctions
3 {2 J+ e5 ]: V5 D3 ~1 XMy_AddressOfNames dd My_Fun_Name-ImageBase ;AddressOfNames 2 R2 Q7 O, S) c
My_AddressOfNameOrdinals dd 0 ;AddressOfNameOrdinals ; j' w- Z3 [. n3 ^
--------------------------------------------------------------------- " Q. z4 U- o* ~
My_Fun_Name db 'MyFunction',0
! }4 w" K# ]7 _' ^1 i5 j5 |; ?, yMy_DLL_nName db 'test.exe',0
' D1 R0 @# |) m& K9 W. @% V z' Y x! `8 z$ U: r' C
(3)LoadPe修改PE头,将导出表地址填入0x28000,大小填入0x1000,保存。
/ D, l' J' {3 M3 A3 W. A; G) j0 u# K N: t/ s4 }1 i8 x" x
Spirng.W/2005.3.14
$ c# t* t' m$ Y0 n' V# p/ [, k$ D$ }: \: [
3 B. a* V& @4 I
-------------------------------------------------------------------------------- |