能力值:
( LV2,RANK:10 )
|
-
-
2 楼
呼唤高手帮助
|
能力值:
( 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
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
我想问的是EXE文件中,不是DLL文件
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
比如 EXE中有00405243 CALL 00XXXXXX
我想在EXE 中构造一个输出表,把函数调用地址指向00405234 从而可把EXE文件当作DLL来用.
|
能力值:
( 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 的输出函数有区别吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
to gzgzlxg
你能回答我的问题我万分感谢!
对PE文件(EXE,DLL)的结构我迷糊,我用zeroadd给Funcp.exe增加了一个新块.然后用Hex WorkShop在00E0000处构造了一个,用LoadPE填上地址和大小,然后用它查看输出表,出错如下图
|
能力值:
( LV9,RANK:1210 )
|
-
-
8 楼
数据目录中填入RVA而不是文件偏移
|
能力值:
( 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)当作你有那么多的输出函数来使用,会发生什么,天知道。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
能否用Windows的记事本程序,演示构造一个输出表,把OpenDialog对话函数放在输出表中,恳求!
|
能力值:
( LV12,RANK:450 )
|
-
-
11 楼
你需要花点时间用IDA分析任何一个输出表,看看每个域具体的含义,别人帮你坚决了今天的问题,下一个呢?
我做这样的单调的事至少做了几百次,你不妨弄几个来学习一下。这些表没有什么太多的东西,熟悉了自然就明白了。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
to gzgzlxg 您好!
多谢你的帮助,问题已解决.
我这几天写了一个帮助手工构造输出表程序.可直接把程序中的代码贴到EXE中的相应址就可以了.
有的不足的是,不能自动得到PE文件需手工构造输出表的块的RVA,和偏移,需用LOADPE查看,然后填入.不过用这个辅助工具构造,不容易出错.
我想自动获取RVA和偏移,把输出表信息自动写回去,我想得到您的帮助.
|
|
|