冒险解谜游戏中文网 ChinaAVG
标题:
【汉化资料】改造PE中的函数为导出函数
[打印本页]
作者:
shane007
时间:
2008-10-29 07:57
标题:
【汉化资料】改造PE中的函数为导出函数
1、前言:为什么要这么做
* U; M d& Q- ~. p$ R4 n
很多时候,我们发现一个PE(EXE或DLL)中非常有用且功能独立的函数(call xxxxxxxx),并且已经知道了这个函数的各个入口参数的类型和具体含义,我们想在其他的软件中使用这个函数。于是,我想到了将这个PE中的函数改成一个导出函数,这样,我们就可以在任何软件中通过“LoadLibrary("ThisPE.EXE")”等API来使用这个函数了。
2 R |- Y5 q6 n4 x2 n- Z
( O' ^' O5 Q! @9 r8 x
在汉化中的应用是可以直接调用游戏中的解包,压包函数来解包,压包,以及访问游戏中的文本显示函数等等。。。
6 d% }& z0 b ?
3 Y' k7 n$ j+ L
2、技术基础:已经了解PE结构
) k& s c; H& l: W7 M, d
+ c% Z5 \# E7 z3 ^4 w' ]
3、分类:
& ?6 m8 N, _( y0 n
(1)有导出表的DLL和EXE文件--非常简单
8 L5 V5 q$ N. }4 V2 ^' u
对于这类PE文件,要简单的多,因为只要修改一下PE中的Export,增加上一个导出函数,并把这个导出函数的入口指向我们要导出的call的调用地址(RVA格式)就可以了。甚至可以更简单的处理:找个不用的导出函数,改一下入口就可以了。
# f7 m4 _9 s* ]1 I, b% y
(2)没有导出表的EXE文件--稍微复杂
( M. v8 S; y, Y8 K: _) d
因为大部分EXE文件没有导出表,所以我们必须要给它增加一个导出表。其实也很简单,给EXE增加一个节,并在这个节中按照导出表的格式构造一个导出函数,并将这个函数入口指向我们要导出的call的调用地址的RVA,并在PE头中指出其位置和大小。
6 s# K& |) R$ S
5 u3 v. V6 `9 u
4、举例说明:
' q8 T# ]! A/ \, g+ }; i$ ]
test.exe:ImageBase=0x00400000
+ r8 w6 X( i1 A! j2 t
发现test.exe 的 0x00408050 处为call 0x0040A012 的 0x0040A012是我们要导出的函数,我们将它导出为MyFunction函数。
! z9 o7 P: y8 A6 g
+ Q n( k4 i2 i! X ^# r8 r
(1)给test.exe增加一个节:RVA=0x28000,size=0x1000
" m4 I4 X/ R T$ P7 K! {0 l. k
(2)构造导出表:
# N/ m; v6 q% O/ g- F
My_Export_Table dd 0 ;Characteristics
0 |8 [! ~ G" y/ V9 ?: }7 e: E
My_TimeDateStamp dd 0 ;TimeDateStamp
8 K3 ~9 F; [5 s6 P
dw 0 ;MajorVersion
* M: M: g; E5 i$ H
dw 0 ;MinorVersion
0 h4 \7 O$ Y5 V! \8 b6 E# G8 G
My_nName dd My_DLL_nName-ImageBase ;nName
+ c9 t; a/ o u; M c8 n0 m
dd 1 ;nBase
& x8 s% o/ e }+ l6 h+ w2 O" |
dd 1 ;NumberOfFunctions
0 N O3 A# f; l' A
dd 1 ;NumberOfNames
) F# p, ^* Z7 a4 o/ d
My_AddressOfFunctions dd 0x0040A012-ImageBase ;AddressOfFunctions
% b9 y+ ]8 b/ } z* }+ X/ C) M
My_AddressOfNames dd My_Fun_Name-ImageBase ;AddressOfNames
' g* [; ?' Q# s
My_AddressOfNameOrdinals dd 0 ;AddressOfNameOrdinals
( Y+ [) D$ w5 w3 B1 x' K
---------------------------------------------------------------------
, u/ n6 Y+ D! Y/ z0 _/ u
My_Fun_Name db 'MyFunction',0
! D4 W/ v1 T$ N. u8 P, k
My_DLL_nName db 'test.exe',0
( Z( ^0 m# p8 a+ P4 L
; U4 o& T/ Z; A& ?; F4 \( \$ z! M
(3)LoadPe修改PE头,将导出表地址填入0x28000,大小填入0x1000,保存。
/ D) b) o+ }9 F: \9 T1 V
: o# C# V6 j" ]- Y/ \
Spirng.W/2005.3.14
( m! r& I+ H1 c% h& y t
2 }5 }# a# N) d7 s
9 t4 D5 g; m7 q8 W3 u
--------------------------------------------------------------------------------
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2