首页
社区
课程
招聘
求助给PE文件增加导出函数
发表于: 2006-9-29 18:56 7967

求助给PE文件增加导出函数

2006-9-29 18:56
7967

看过Spring.W的"改造PE中的函数为导出函数"非常兴奋.有问题请教坛中高手.

(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

上面的看不明白,应该怎样构造导出表?


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 62
活跃值: (2052)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
呼唤高手帮助
2006-9-29 23:07
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
3
问题太简单了,可能没有人愿意浪费时间。
你可以通过增加一个段来获得空间,也可以在程序内随便找一个空间来完成,一般都能找到可用空间的。
我将上面给出的表细化了一下,安照实际在内存中的映象来填写,我想应该可以理解了。     
40A012    MyFunction PROC
          push  ebp
......
......          
          pop   ebp
          ret
40A050    MyFunction ENDP


                    ;+++++++++++++++++++ IMAGE_EXPORT_DIRECTORY +++++++++++++++++++++                         
                                  IMAGE_EXPORT_DIRECTORY_MYDLL_DLL 
40D000 00 00 00 00              dd 0                                        ; Characteristics
40D004 00 00 00 00              dd 0                                        ; TimeDateStamp                         
40D008 00 00                    dw 0                                        ; MajorVersion                          
40D00A 00 00                    dw 0                                        ; MinorVersion                          
40D00C 28 D0 00 00              dd offset szMyDll_dll  -  offset DOS_HEADER ; Name                                  
40D010 01 00 00 00              dd 1                                        ; Base                                  
40D014 01 00 00 00              dd 1                                        ; NumberOfFunctions                     
40D018 01 00 00 00              dd 1                                        ; NumberOfNames                         
40D01C 34 D0 00 00              dd offset AddrOfFun    -  offset DOS_HEADER ; AddressOfFunctions                    
40D020 3A D0 00 00              dd offset AddrOfName   -  offset DOS_HEADER ; AddressOfNames                        
40D024 3E D0 00 00              dd offset AddrOfOrd    -  offset DOS_HEADER ; AddressOfNameOrdinals                 
                                                          
40D028 4D 79 44 6C szMyDll_dll  db "MyDll.dll",0          
40D02C 6C 2E 64 6C                                        
40D030 6C 00 00 00                                        
40D034 12 A0 00 00 AddOfFun     dd offset MyFunction   -  offset DOS_HEADER ; Pointer to MyFunction
40D038 00 00
40D03A 44 D0 00 00 AddrOfName   dd offset szMyFunction -  offset DOS_HEADER ; Pointer to Function Name String
40D03E 50 D0 00 00 AddrOfOrd    dd offset AddrOrder    -  offset DOS_HEADER ; Pointer to AddressOfNameOrdinals buffer
40D042 00 00
40D044 4D 79 46 75 szMyFunction dd "MyFunction",0
40D048 6E 63 74 69
40D04C 6F 6E 00 00
40D050 00 00       AddrOrder    dw 0


另外,你还需要修改PE 头中的 Export Directory 的入口地址,将它指向这个表。同时修改那个 Size 值。这里
VirtualAddress = D000
Size           = 54

2006-9-30 00:10
0
雪    币: 62
活跃值: (2052)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我想问的是EXE文件中,不是DLL文件
2006-9-30 12:13
0
雪    币: 62
活跃值: (2052)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
比如 EXE中有00405243 CALL 00XXXXXX
我想在EXE 中构造一个输出表,把函数调用地址指向00405234 从而可把EXE文件当作DLL来用.
2006-9-30 12:40
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
6
在EXE或DLL中并没有什么区别。
你仔细看看我填的那张表,对照PE格式文件的定义仔细想想,应该明白的。
对于你提出的具体问题,将下面这行的VA地址改成 5243 就可以了。
40D034 43 52 00 00 AddOfFun     dd offset MyFunction   -  offset DOS_HEADER ; Pointer to MyFunction
不知你怎么理解 PE 文件格式的,DLL 和 EXE 的输出函数有区别吗?
2006-9-30 23:15
0
雪    币: 62
活跃值: (2052)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
to gzgzlxg
你能回答我的问题我万分感谢!
对PE文件(EXE,DLL)的结构我迷糊,我用zeroadd给Funcp.exe增加了一个新块.然后用Hex WorkShop在00E0000处构造了一个,用LoadPE填上地址和大小,然后用它查看输出表,出错如下图

2006-10-1 09:50
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
8
数据目录中填入RVA而不是文件偏移
2006-10-1 11:50
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
9
从你填的这张表格来看,你对输出表还没有理解,在这张表中,每个域所对应的地方随着函数的位置,函数名的位置等都需要调整。将它们指向正确的位置。而你竟然将输出表缩水,你看看你的输出表中的元素都填齐了吗,输出表的大小为 0x28 而你的输出表,而你的输出表的大小为0x24,你将那个 [NumberOfNames]的域给省略了,这样你自己看看会发生什么事:
你将函数名居然放在输出表的 [AddressOfNameOrdinals] 位置上,哈哈,整个乱套了。
另外你不能将我给出的数填在你的表里,那是需要根据你的具体情况重新计算的。
下面我举一个例子,如果你还是不能明白,那我也没有办法了:

在你这张变形输出表中:

0E000C 28 0D 00 00              dd offset szMyDll_dll  -  offset DOS_HEADER ; Name

首先这个 28 0D 这个值应该是 28 D0,这个我原先那张表填错了,应该是 28 D0 即 D028h, 必须指向你的模块名字,因为你的模块名字地址是0E0024 所以你应该用这个值来填写。

0E000C 24 00 0E 00              dd offset szFuncp_exe  -  offset DOS_HEADER ; Name

一个怪胎就诞生了,因为这个位置在输出表中。
你心中的那个 [AddressOfFunctions] 将被操作系统当作 [NumberOfNames] 来使用,如果这个程序运行,操作系统会用这个地址偏移量(0D34=3380)当作你有那么多的输出函数来使用,会发生什么,天知道。
2006-10-1 12:30
0
雪    币: 62
活跃值: (2052)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
能否用Windows的记事本程序,演示构造一个输出表,把OpenDialog对话函数放在输出表中,恳求!
2006-10-1 13:58
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
11
你需要花点时间用IDA分析任何一个输出表,看看每个域具体的含义,别人帮你坚决了今天的问题,下一个呢?
我做这样的单调的事至少做了几百次,你不妨弄几个来学习一下。这些表没有什么太多的东西,熟悉了自然就明白了。
2006-10-1 15:34
0
雪    币: 62
活跃值: (2052)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
to gzgzlxg 您好!
多谢你的帮助,问题已解决.
我这几天写了一个帮助手工构造输出表程序.可直接把程序中的代码贴到EXE中的相应址就可以了.
有的不足的是,不能自动得到PE文件需手工构造输出表的块的RVA,和偏移,需用LOADPE查看,然后填入.不过用这个辅助工具构造,不容易出错.
我想自动获取RVA和偏移,把输出表信息自动写回去,我想得到您的帮助.
2006-10-4 13:03
0
游客
登录 | 注册 方可回帖
返回
//