1、前言:为什么要这么做 5 h# t. }' |( N; T* q
很多时候,我们发现一个PE(EXE或DLL)中非常有用且功能独立的函数(call xxxxxxxx),并且已经知道了这个函数的各个入口参数的类型和具体含义,我们想在其他的软件中使用这个函数。于是,我想到了将这个PE中的函数改成一个导出函数,这样,我们就可以在任何软件中通过“LoadLibrary("ThisPE.EXE")”等API来使用这个函数了。
& B0 @: c# B* V6 q1 |
; N5 B1 s7 y) ~+ o" _4 g: r在汉化中的应用是可以直接调用游戏中的解包,压包函数来解包,压包,以及访问游戏中的文本显示函数等等。。。2 v- g5 q4 H0 P2 K5 ]) u
' w5 Q8 @$ m; s. V' ]2、技术基础:已经了解PE结构
( j/ K( a5 ~6 x( W4 p f
- C( Z! t/ @. Q3 H. Z3、分类: 4 H0 K l, s" N/ ?- f2 w* s
(1)有导出表的DLL和EXE文件--非常简单
/ Q T8 v$ }/ K% V1 [+ i对于这类PE文件,要简单的多,因为只要修改一下PE中的Export,增加上一个导出函数,并把这个导出函数的入口指向我们要导出的call的调用地址(RVA格式)就可以了。甚至可以更简单的处理:找个不用的导出函数,改一下入口就可以了。
+ D$ K ` T l _0 D% o(2)没有导出表的EXE文件--稍微复杂
8 f! e6 x/ Z0 F/ H- p* s$ {因为大部分EXE文件没有导出表,所以我们必须要给它增加一个导出表。其实也很简单,给EXE增加一个节,并在这个节中按照导出表的格式构造一个导出函数,并将这个函数入口指向我们要导出的call的调用地址的RVA,并在PE头中指出其位置和大小。
/ h9 o0 q& D: i* `' B8 g P- Y+ l
4、举例说明:
. B5 d; l7 d2 Z+ [test.exe:ImageBase=0x00400000
5 o" I) w. P5 Y! G) F, X发现test.exe 的 0x00408050 处为call 0x0040A012 的 0x0040A012是我们要导出的函数,我们将它导出为MyFunction函数。 - m2 x4 W& a/ Y
. M0 O& y; }% ~
(1)给test.exe增加一个节:RVA=0x28000,size=0x1000 ; N/ v: b5 l% c2 K: Q$ W6 i
(2)构造导出表:
% } x4 }1 F% v) M5 O/ {My_Export_Table dd 0 ;Characteristics 3 K8 G: c- D4 e$ M5 b: a: _! C
My_TimeDateStamp dd 0 ;TimeDateStamp
8 N; l) E5 `% C) W- Mdw 0 ;MajorVersion
, J1 r; p" @3 F5 H, Ndw 0 ;MinorVersion 3 {% v. x2 }! E4 b
My_nName dd My_DLL_nName-ImageBase ;nName # N! d5 U0 B4 t; P i
dd 1 ;nBase
+ g7 [, v) e9 v! |% U+ Y% Hdd 1 ;NumberOfFunctions
7 ~3 _, u! ~; w6 i' \dd 1 ;NumberOfNames 2 t/ P$ e, T# \$ o
My_AddressOfFunctions dd 0x0040A012-ImageBase ;AddressOfFunctions / C* f d6 g" d- g3 D9 N# J3 ^8 {
My_AddressOfNames dd My_Fun_Name-ImageBase ;AddressOfNames 7 d* b0 q9 X; a. e8 Y1 k& i2 v a
My_AddressOfNameOrdinals dd 0 ;AddressOfNameOrdinals
; P' P6 c8 g7 M+ p, z4 X. z---------------------------------------------------------------------
! ]2 x" U, K+ ~" IMy_Fun_Name db 'MyFunction',0
6 x! l; F; Q) n/ H5 ^# y/ B7 r, dMy_DLL_nName db 'test.exe',0
9 }. o1 B5 _7 _$ o9 J9 y B( T2 F" |
(3)LoadPe修改PE头,将导出表地址填入0x28000,大小填入0x1000,保存。
2 B j8 P6 E# h* N% v3 } C1 a( |3 T: X) q, S' v7 K1 M2 [
Spirng.W/2005.3.14
9 w9 ~6 I; e b+ I/ ~5 g
4 T6 ?# t0 z7 Q K/ I4 A7 c; q" }# e+ x7 N c
-------------------------------------------------------------------------------- |