首页
社区
课程
招聘
改造PE中的函数为导出函数
发表于: 2005-3-14 10:45 16722

改造PE中的函数为导出函数

2005-3-14 10:45
16722

1、前言:为什么要这么做
    很多时候,我们发现一个PE(EXE或DLL)中非常有用且功能独立的函数(call xxxxxxxx),并且已经知道了这个函数的各个入口参数的类型和具体含义,我们想在其他的软件中使用这个函数。于是,我想到了将这个PE中的函数改成一个导出函数,这样,我们就可以在任何软件中通过“LoadLibrary("ThisPE.EXE")”等API来使用这个函数了。

2、技术基础:已经了解PE结构

3、分类:
   (1)有导出表的DLL和EXE文件--非常简单
    对于这类PE文件,要简单的多,因为只要修改一下PE中的Export,增加上一个导出函数,并把这个导出函数的入口指向我们要导出的call的调用地址(RVA格式)就可以了。甚至可以更简单的处理:找个不用的导出函数,改一下入口就可以了。
   (2)没有导出表的EXE文件--稍微复杂
    因为大部分EXE文件没有导出表,所以我们必须要给它增加一个导出表。其实也很简单,给EXE增加一个节,并在这个节中按照导出表的格式构造一个导出函数,并将这个函数入口指向我们要导出的call的调用地址的RVA,并在PE头中指出其位置和大小。

4、举例说明:
   test.exe:ImageBase=0x00400000
   发现test.exe 的 0x00408050 处为call 0x0040A012 的 0x0040A012是我们要导出的函数,我们将它导出为MyFunction函数。

   (1)给test.exe增加一个节:RVA=0x28000,size=0x1000
   (2)构造导出表:
My_Export_Table  dd 0 ;Characteristics
My_TimeDateStamp dd 0         ;TimeDateStamp
                 dw 0         ;MajorVersion
                 dw 0  ;MinorVersion
My_nName         dd My_DLL_nName-ImageBase ;nName
                 dd 1  ;nBase
                 dd 1  ;NumberOfFunctions
                 dd 1          ;NumberOfNames
My_AddressOfFunctions      dd 0x0040A012-ImageBase ;AddressOfFunctions
My_AddressOfNames          dd My_Fun_Name-ImageBase ;AddressOfNames
My_AddressOfNameOrdinals   dd 0  ;AddressOfNameOrdinals
---------------------------------------------------------------------
My_Fun_Name                db 'MyFunction',0
My_DLL_nName               db 'test.exe',0

   (3)LoadPe修改PE头,将导出表地址填入0x28000,大小填入0x1000,保存。

                                     Spirng.W/2005.3.14


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 8
支持
分享
最新回复 (35)
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好文,这才应该算是真正的PEDIY
2005-3-14 10:54
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
3
学习!很好的思路~
2005-3-14 11:02
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
4
转贴学习!
2005-3-14 11:40
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
正在学PEDIY,对我大有帮助。谢谢了!
2005-3-14 12:23
0
雪    币: 257
活跃值: (369)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
6
很佩服!还想问一个问题:假如不知道这个函数的各个入口参数的类型和具体含义,要怎样去分析这些参数?导出函数要相对容易些,但要分析其参数却难。
2005-3-14 12:40
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
佩服佩服, 如果有通用的工具可以做到的话, 就好啦!!
2005-3-14 14:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢!不错!!
2005-3-14 14:13
0
雪    币: 392
活跃值: (909)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
9
不错,支持~
最初由 newsearch 发布
很佩服!还想问一个问题:假如不知道这个函数的各个入口参数的类型和具体含义,要怎样去分析这些参数?导出函数要相对容易些,但要分析其参数却难。

参数分析用手工结合IDA,还是比较方便的
2005-3-14 14:50
0
雪    币: 257
活跃值: (369)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
10
最初由 cyclotron 发布
不错,支持~

参数分析用手工结合IDA,还是比较方便的


谢了,兄弟!
2005-3-14 15:37
0
雪    币: 161
活跃值: (231)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
重定位如何搞定?
2005-3-17 11:04
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
12
这样的文章肉真多 慢慢消化
2005-3-17 20:21
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
肉太多了,菜鸟一下子还消化不了
2005-3-17 21:57
0
雪    币: 270
活跃值: (176)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
14
最初由 采臣・宁 发布
重定位如何搞定?

这个最重要,要不虽然导出了一般也用不起来,各位有什么好办法?
2005-4-10 09:40
0
雪    币: 239
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
最初由 ikki 发布

这个最重要,要不虽然导出了一般也用不起来,各位有什么好办法?


修改重定位表,Spirng以前写过这方面的文章的。
2005-4-10 10:23
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
16
学习!
2005-4-10 11:30
0
雪    币: 255
活跃值: (207)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
17
推荐Roba写个添加Export Editor.
可以生成和管理PE文件的 Export Table
严重推荐!
2005-4-10 13:17
0
雪    币: 222
活跃值: (100)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
Spring兄,不知道还记得我吗?前一阵子,我有个问题想请教你,你说给我看看,呵
2005-4-11 07:47
0
雪    币: 151
活跃值: (66)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
19
看不懂,,支持
2005-4-11 14:03
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
给出个另类方法:
mod=LoadLibrary("xxx.dll"); //载入文件
func=(char*)mod+offset;     //找到函数入口地址
__asm push param2           //参数2
__asm push param1           //参数1
__asm call func;            //直接硬调用
__asm mov ret,eax           //保存返回值
2005-4-11 18:52
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
21
最初由 dwing 发布
给出个另类方法:
mod=LoadLibrary("xxx.dll"); //载入文件
func=(char*)mod+offset; //找到函数入口地址
__asm push param2 //参数2
__asm push param1 //参数1
........


有创意!我咋想不到。。。。
2005-4-11 18:57
0
雪    币: 270
活跃值: (176)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
22
good!
一会试试
2005-4-11 19:01
0
雪    币: 221
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
23
好文!
谢谢大侠!
2005-4-11 20:27
0
雪    币: 255
活跃值: (207)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
24
给出个另类方法:
mod=LoadLibrary("xxx.dll"); //载入文件
func=(char*)mod+offset; //找到函数入口地址
__asm push param2 //参数2
__asm push param1 //参数1
__asm call func; //直接硬调用
__asm mov ret,eax //保存返回值

Authorship!I DO support!
2005-4-11 21:38
0
雪    币: 255
活跃值: (207)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
25
不过,在vb中如何用上述方法调用呢?我不会。
哪位仁兄告诉我一下!
2005-4-11 21:56
0
游客
登录 | 注册 方可回帖
返回
//