2014-05-20 57 views
2

我正在尝试构建一个程序,该程序将提供有关文件和可能的反汇编程序的更多信息。我看着https://code.google.com/p/corkami/wiki/PE101以获取更多信息,并在阅读了几次后,我对其中的大部分内容有所了解。我不明白的部分是windows api的调用地址。例如,他是如何知道指令调用[0x402070]是对messagebox的api调用?我知道如何计算字符串的地址,并将2个按压命令转换为字符串是有意义的,但不是dll部分。PE 101解释窗口API调用的地址

我猜我想说的是我不明白“进口结构”部分 (部分我用黄色绘制了一个框)如果有任何人可以请向我解释如何0x402068指向exitProcess和0x402070指向MessageBoxA,这真的会帮助我。感谢 enter image description here

+0

您是否下载了PE101.zip并检查了来源?他们很不寻常。 – MKaama

回答

2

装载机(Windows操作系统的一部分)“修补了”开始样品程序之前导入地址表(IAT),这时候的库过程的实际地址出现在存储器位置0x402068和0x402068。请注意,进口存在于部分NOBITSsimple.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位)地址覆盖:这些地址是符号本身的实际内存地址(虽然从技术上讲,它们仍然是称为“虚拟地址”)。绑定的处理通常由加载器执行。

+0

IAT包含正在导入的DLL和函数的名称。当调用一个DLL函数时,应用程序的代码对内存地址执行一个'CALL',该加载器已经存储在该函数的IAT插槽中。所以当你的反汇编器看到一个从CALL检索到的内存地址的'CALL'时,它可以从IAT中检索DLL +函数名来显示,而不是显示内存地址。 –