1、前言:为什么要这么做 7 X7 R: g0 S6 Z6 p' A
很多时候,我们发现一个PE(EXE或DLL)中非常有用且功能独立的函数(call xxxxxxxx),并且已经知道了这个函数的各个入口参数的类型和具体含义,我们想在其他的软件中使用这个函数。于是,我想到了将这个PE中的函数改成一个导出函数,这样,我们就可以在任何软件中通过“LoadLibrary("ThisPE.EXE")”等API来使用这个函数了。
2 t, O! D! ~' G
) w5 ^0 T7 _' I, Z在汉化中的应用是可以直接调用游戏中的解包,压包函数来解包,压包,以及访问游戏中的文本显示函数等等。。。
* {; e+ u) s9 W1 U0 p/ a: N/ i$ G# a* E: q) a k, t
2、技术基础:已经了解PE结构 0 s; A5 N$ [. ~
9 Y* w5 {" S7 @% P3、分类:
( ~" K( H& F7 R' N4 L! ~ T$ q(1)有导出表的DLL和EXE文件--非常简单 " `* C8 B" S) N$ d4 f9 F1 T: R1 p
对于这类PE文件,要简单的多,因为只要修改一下PE中的Export,增加上一个导出函数,并把这个导出函数的入口指向我们要导出的call的调用地址(RVA格式)就可以了。甚至可以更简单的处理:找个不用的导出函数,改一下入口就可以了。
9 Q* }. O+ a) S(2)没有导出表的EXE文件--稍微复杂
' ^6 I4 }: p" J. C, |1 l7 _因为大部分EXE文件没有导出表,所以我们必须要给它增加一个导出表。其实也很简单,给EXE增加一个节,并在这个节中按照导出表的格式构造一个导出函数,并将这个函数入口指向我们要导出的call的调用地址的RVA,并在PE头中指出其位置和大小。 4 Z' J8 |: C2 ?$ U( n2 K" q* @) A
9 B) j% z* `. J% N- ]+ [
4、举例说明: / c7 ?/ \7 h! ~3 U! A# ^
test.exe:ImageBase=0x00400000 6 s9 y- F+ P# M; e r, N8 ]* J
发现test.exe 的 0x00408050 处为call 0x0040A012 的 0x0040A012是我们要导出的函数,我们将它导出为MyFunction函数。 * ^5 L! r8 ]2 W
: z( [7 T& b6 ? i(1)给test.exe增加一个节:RVA=0x28000,size=0x1000 ) \1 w, W2 i! z- E H
(2)构造导出表: 8 C/ o1 i# J- }- \" V- b8 O6 {5 j/ d* l
My_Export_Table dd 0 ;Characteristics & |" P. G- Q3 R: e2 d; R
My_TimeDateStamp dd 0 ;TimeDateStamp 0 e2 k. f( d% u
dw 0 ;MajorVersion
+ h; q" u( I8 s6 P$ p* F qdw 0 ;MinorVersion
6 I3 Y* L" U! m* {My_nName dd My_DLL_nName-ImageBase ;nName 3 j8 V# A) \% | p' d/ W# W" D5 ~( @
dd 1 ;nBase
- f9 f) M1 J, p3 \dd 1 ;NumberOfFunctions
" d5 K, s k# g0 m2 d0 vdd 1 ;NumberOfNames
$ ~# V \' }9 h' |! d5 JMy_AddressOfFunctions dd 0x0040A012-ImageBase ;AddressOfFunctions ' u( | U I2 J+ _
My_AddressOfNames dd My_Fun_Name-ImageBase ;AddressOfNames 4 j- O7 q! A. i( g- N4 C
My_AddressOfNameOrdinals dd 0 ;AddressOfNameOrdinals 5 k+ \; K/ ]4 D; O) B! }( E
---------------------------------------------------------------------
( ]' K$ [, P( `3 d" H, R) {- iMy_Fun_Name db 'MyFunction',0 & U0 d( N5 j! n6 s/ l/ j/ l$ U/ K& h
My_DLL_nName db 'test.exe',0
* u) C3 _2 f- R' @7 V
3 I1 ~. u# m4 J1 c" y) a(3)LoadPe修改PE头,将导出表地址填入0x28000,大小填入0x1000,保存。
; c& e) v9 _, X) \: o1 W
3 I% A( s$ V$ O% k. k& M3 ASpirng.W/2005.3.14
& {2 O1 Z3 k U. z. A
: k2 @$ |$ M* E. p- q( x4 C* N$ Z, C: K ]
-------------------------------------------------------------------------------- |