装载机(Windows操作系统的一部分)“修补了”开始样品程序之前导入地址表(IAT),这时候的库过程的实际地址出现在存储器位置0x402068和0x402068。请注意,进口存在于部分NOBITS在simple.asm:
section nobits vstart=IMAGEBASE + 2 * SECTIONALIGN align=FILEALIGN
与负荷后进口的部分开始于虚拟地址(基址=为400000h)+ 2 *(SECTIONALIGN = 1000H)= 0x402000。
这个例子的yasm源是非常不寻常的,图也不是最好的学习场所PE格式从。请首先阅读Wikipedia:Portable_Executable(短文)。它链接到full documents,所以我只会在这里做一些简短的注释。
您可能还想使用Cheat Engine检查样本。启动simple.exe,然后附加到进程与作弊引擎,按内存查看,然后进入菜单工具 - >剖析PE头,按钮,然后信息,看标签进口。在内存转储,去解决00402000(CTRL + 摹输入:
00402068:E4 39 75 69 5F 47 77 00 00 00 00 65 6B 72 65 6E 33 6C 32 2E
注意在这些位置处的值
- 00402068:0x75BE39E4(我的电脑)= KERNEL32.ExitProcess
的地址
- 00402070:0x77475F69(只在我的情况)= user32.MessageBoxA
的地址
通知文本“KERNEL32 .dll user32。DLL”后,他们的权利。现在来看simple.exe(我会使用Far Manager)的hexdump都与现货字符串之前同一位置‘kernel32.dll中user32.dll中’。值有
0000000450: 69 74 50 72 6F 63 65 73 │ 73 00 00 00 4D 65 73 73 itProcess Mess
0000000460: 61 67 65 42 6F 78 41 00 │ 4C_20_00_00 00 00 00 00 ageBoxA L
0000000470: 5A_20_00_00 00 00 00 00 │ 6B 65 72 6E 65 6C 33 32 Z kernel32
0000000480: 2E 64 6C 6C 00 75 73 65 │ 72 33 32 2E 64 6C 6C 00 .dll user32.dll
- 0000000468:0x0000204C - DW 0的相对虚拟地址; DB 'ExitProcess的',0
- 0000000470:0x0000205A - 在相对虚拟地址DW 0的; DB“MessageBoxA”,0
loader已经从什么人在文件中加载到内存中后改变这些值。微软公司的文件pecoff.doc说:
6.4.4。 导入地址表 导入地址表的结构和内容与导入查找表的结构和内容相同,直到文件被绑定。绑定期间,导入地址表中的条目被导入的符号的32位(或64位)地址覆盖:这些地址是符号本身的实际内存地址(虽然从技术上讲,它们仍然是称为“虚拟地址”)。绑定的处理通常由加载器执行。
您是否下载了PE101.zip并检查了来源?他们很不寻常。 – MKaama