【问题标题】:PE 101 explanation of addresses to windows api callsPE 101 对 windows api 调用地址的解释
【发布时间】:2014-07-09 05:23:16
【问题描述】:

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

我想我想说的是我不明白说“导入结构”的部分 (我在黄色周围画了一个框的部分)如果有人可以向我解释0x402068如何指向exitProcess,0x402070如何指向MessageBoxA,这对我很有帮助。谢谢

【问题讨论】:

  • 您是否下载了 PE101.zip 并检查了源代码?它们很不寻常。

标签: winapi assembly hex call disassembly


【解决方案1】:

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,然后使用 Cheat Engine 附加到进程,按 Memory View,然后菜单 Tools->Dissect PE headers ,然后按钮 Info,查看标签 Imports。在内存转储中,转到地址 00402000 (CTRL+G 00402000 Enter:

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 年龄框AL
0000000470:5A_20_00_00 00 00 00 00 │ 6B 65 72 6E 65 6C 33 32 Z 内核32
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
  • 相对虚拟地址

加载器已将这些值与加载到内存后文件中的值不同。 Microsoft 文档 pecoff.doc 对此进行了说明:

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

【讨论】:

  • IAT 包含要导入的 DLL 和函数的名称。调用 DLL 函数时,应用程序的代码对加载程序为该函数存储在 IAT 插槽中的内存地址执行CALL。因此,当您的反汇编程序看到从 IAT 检索到的内存地址的 CALL 时,它可以从 IAT 检索 DLL+函数名称以用于显示目的,而不是显示内存地址。
猜你喜欢
  • 2012-12-15
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多