能力值:
( LV9,RANK:210 )
|
-
-
2 楼
导出表做好后 就让我们把导出表更新到PE结构里面去吧
用OD载入程序 ALT+M打开内存 选择 hook32 PE文件头那行 进入PE文件头数据窗口
看到
0040003C 00010000 DD 00000100 ; Offset to PE signature
这句话的意思说 PE文件头在偏移100处
我们来到偏移100处
00400100 50 45 00 00>ASCII "PE" ; PE signature (PE)
00400104 4C01 DW 014C ; Machine = IMAGE_FILE_MACHINE_I386
00400106 0900 DW 0009 ; NumberOfSections = 9
00400108 4E255D48 DD 485D254E ; TimeDateStamp = 485D254E
0040010C 00000000 DD 00000000 ; PointerToSymbolTable = 0
00400110 00000000 DD 00000000 ; NumberOfSymbols = 0
00400114 E000 DW 00E0 ; SizeOfOptionalHeader = E0 (224.)
00400116 8E81 DW 818E ; Characteristics = EXECUTABLE_IMAGE|32BIT_MACHINE|LINE_NUMS_STRIPPED|LOCAL_SYMS_STRIPPED|BYTES_REVERSED_LO|BYTES_REVERSED_HI
00400118 0B01 DW 010B ; MagicNumber = PE32
0040011A 02 DB 02 ; MajorLinkerVersion = 2
0040011B 19 DB 19 ; MinorLinkerVersion = 19 (25.)
0040011C 00600500 DD 00056000 ; SizeOfCode = 56000 (352256.)
00400120 00E80000 DD 0000E800 ; SizeOfInitializedData = E800 (59392.)
00400124 00000000 DD 00000000 ; SizeOfUninitializedData = 0
00400128 1C770500 DD 0005771C ; AddressOfEntryPoint = 5771C
0040012C 00100000 DD 00001000 ; BaseOfCode = 1000
00400130 00800500 DD 00058000 ; BaseOfData = 58000
00400134 00004000 DD 00400000 ; ImageBase = 400000
00400138 00100000 DD 00001000 ; SectionAlignment = 1000
0040013C 00020000 DD 00000200 ; FileAlignment = 200
00400140 0400 DW 0004 ; MajorOSVersion = 4
00400142 0000 DW 0000 ; MinorOSVersion = 0
00400144 0000 DW 0000 ; MajorImageVersion = 0
00400146 0000 DW 0000 ; MinorImageVersion = 0
00400148 0400 DW 0004 ; MajorSubsystemVersion = 4
0040014A 0000 DW 0000 ; MinorSubsystemVersion = 0
0040014C 00000000 DD 00000000 ; Reserved
00400150 00F00600 DD 0006F000 ; SizeOfImage = 6F000 (454656.)
00400154 00040000 DD 00000400 ; SizeOfHeaders = 400 (1024.)
00400158 00000000 DD 00000000 ; CheckSum = 0
0040015C 0200 DW 0002 ; Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI
0040015E 0000 DW 0000 ; DLLCharacteristics = 0
00400160 00001000 DD 00100000 ; SizeOfStackReserve = 100000 (1048576.)
00400164 00400000 DD 00004000 ; SizeOfStackCommit = 4000 (16384.)
00400168 00001000 DD 00100000 ; SizeOfHeapReserve = 100000 (1048576.)
0040016C 00100000 DD 00001000 ; SizeOfHeapCommit = 1000 (4096.)
00400170 00000000 DD 00000000 ; LoaderFlags = 0
00400174 10000000 DD 00000010 ; NumberOfRvaAndSizes = 10 (16.)
00400178 00000000 DD 00000000 ; Export Table address = 0
0040017C 00000000 DD 00000000 ; Export Table size = 0
00400180 00F00500 DD 0005F000 ; Import Table address = 5F000
00400184 94240000 DD 00002494 ; Import Table size = 2494 (9364.)
00400188 00A00600 DD 0006A000 ; Resource Table address = 6A000
0040018C 00480000 DD 00004800 ; Resource Table size = 4800 (18432.)
00400190 00000000 DD 00000000 ; Exception Table address = 0
00400194 00000000 DD 00000000 ; Exception Table size = 0
00400198 00000000 DD 00000000 ; Certificate File pointer = 0
0040019C 00000000 DD 00000000 ; Certificate Table size = 0
004001A0 00400600 DD 00064000 ; Relocation Table address = 64000
004001A4 345B0000 DD 00005B34 ; Relocation Table size = 5B34 (23348.)
004001A8 00000000 DD 00000000 ; Debug Data address = 0
004001AC 00000000 DD 00000000 ; Debug Data size = 0
004001B0 00000000 DD 00000000 ; Architecture Data address = 0
004001B4 00000000 DD 00000000 ; Architecture Data size = 0
文件头结构有很多 我们只要 关心 这两行就可以
00400178 00000000 DD 00000000 ; Export Table address = 0
0040017C 00000000 DD 00000000 ; Export Table size = 0
这里是保存 导出表的地址和大小的地方
用OD相对偏移计算如下
$+178 00000000 DD 00000000 ; Export Table address = 0
$+17C 00000000 DD 00000000 ; Export Table size = 0
也就是说 导出表地址和长度保存在文件偏移 178 和17C处
用winhex打开文件 ALT+G 来到偏移178处 将原来我们构造导出表的地址00064B90 转换为RVA为6E790
偏移178处4个字节改成 90 E7 06 00 数了一下我们的导出表共有64个字节16进制为0x40
与是偏移178处4个字节改成40 00 00 00 到这里就一切OK了 保存好修改好的PE结构 然后我们写个程序来调用一下这个到处函数看看
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
doSth:procedure;
pfun:DWORD;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
DLLModule:DWORD;
begin
DLLModule := LoadLibrary('hook32.exe');
doSth:= GetProcAddress(DLLModule,'_W'); //取得API地址
doSth;
end;
end.
试验结果 HOOK32.EXE的内部函数被成功调用了!
|
能力值:
( LV9,RANK:210 )
|
-
-
3 楼
附件地址
http://tele.126disk.com/down.aspx?down=ok&filepath=bujin888%2ftest%2ftest.rar#download
今天我竟然没办法传附件 郁闷
|
能力值:
( LV9,RANK:450 )
|
-
-
4 楼
学习一下。
附件今天确实无法上传。
|
能力值:
( LV9,RANK:290 )
|
-
-
5 楼
好文,支持一下
|
能力值:
( LV7,RANK:100 )
|
-
-
6 楼
学习了,谢谢~
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
好文,呵呵,不过楼主为什么不只一次的将RVA写成了RAV呢?好几处啊
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
太强了..那微软的很多未导出函数是不是也可以这样搞来呀..
|
能力值:
( LV9,RANK:210 )
|
-
-
9 楼
哈哈 不好意思啊 当初自学PE结构的时候没看清楚 导致现在养成写错的习惯了
已经更正
|
能力值:
( LV13,RANK:1050 )
|
-
-
10 楼
好文,顶顶。。
|
能力值:
( LV4,RANK:50 )
|
-
-
11 楼
做成工具就好了
|
能力值:
( LV9,RANK:570 )
|
-
-
12 楼
支持做成工具造福大家
|
能力值:
( LV13,RANK:330 )
|
-
-
13 楼
顶一顶
|
能力值:
(RANK:1130 )
|
-
-
14 楼
exe没重定位表怎么办呢?
|
能力值:
( LV9,RANK:210 )
|
-
-
15 楼
有两种方法,
1.一个用,修改PE头中的Characteristics NTDLL.DLL的未公开函数LdrLoadDllEx加载
2.还有一种 修改PE头中的Characteristics 其增加IMAGE_FILE_DLL与IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP属性 伪装成DLL文件,改AddressOfEntryPoint为0 然后用LoadLibrary加载
以上两种加载方式都可以 解决IAT与重定位表的问题
|
能力值:
( LV12,RANK:779 )
|
-
-
16 楼
非常好 。
|
|
|