PE 101解释windows api调用的地址

时间:2014-05-20 19:35:28

标签: winapi assembly hex call disassembly

我正在尝试构建一个程序,它将提供有关文件和可能的反汇编程序的更多信息。我查看了https://code.google.com/p/corkami/wiki/PE101以获取更多信息,在阅读了几次之后,我了解了大部分信息。我不太了解的部分是windows api的呼叫地址。例如,他怎么知道指令调用[0x402070]是对消息箱的api调用?我理解如何计算字符串的地址和字符串的2个推送命令是有意义的,但不是dll部分。

我想我想说的是我不明白那些说'#34;进口结构" (部分我画了一个黄色的框)如果任何人可以请向我解释0x402068指向exitProcess和0x402070指向MessageBoxA,这将真的帮助我。谢谢 enter image description here

1 个答案:

答案 0 :(得分:2)

Loader (Windows操作系统的一部分)在启动示例程序之前“修补”导入地址表(IAT),即库的实际地址程序出现在内存位置0x402068和0x402068中。请注意,导入位于 simple.asm 中的 nobits 部分:

section nobits vstart=IMAGEBASE + 2 * SECTIONALIGN align=FILEALIGN

加载后导入的部分从虚拟地址开始(IMAGEBASE = 400000h)+ 2 *(SECTIONALIGN = 1000h)= 0x402000。

该示例的yasm源非常不寻常,图表也不是学习 PE格式的最佳位置。请先阅读Wikipedia:Portable_Executable(一篇简短的文章)。它有full documents的链接,所以我只会在这里做一些简短的笔记。

您可能还想使用Cheat Engine来检查示例。启动simple.exe,然后使用作弊引擎附加到流程,按内存视图,然后按菜单工具 - > 解析PE标题,然后按信息,查看标签导入。在内存转储中,转到地址00402000( CTRL + G 00402000 输入

  

00402068: E4 39 BE 75 00 00 00 00 69 5F 47 77 00 00 00 00 6B 65 72 6E 65 6C 33 32 2E

请注意这些位置的值

  • 00402068:0x75BE39E4(在我的电脑上)= KERNEL32.ExitProcess的地址
  • 00402070:0x77475F69(仅在我的情况下)= user32.MessageBoxA的地址

请注意文本“kernel32.dll user32.dll”。现在看一下 simple.exe 的hexdump(我会使用Far Manager)并在字符串“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

加载程序在加载到内存后,已将这些值更改为文件中的值。微软文档pecoff.doc对此进行了说明:

  

6.4.4。 导入地址表   导入地址表的结构和内容与导入查找表的结构和内容相同,直到文件绑定为止。在绑定期间,导入地址表中的条目将被导入的符号的32位(或64位(PE32 +)地址覆盖:这些地址是符号本身的实际内存地址(尽管从技术上讲,它们仍然是称为“虚拟地址”)。绑定处理通常由加载程序执行。