Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi PE 101 windows api调用地址说明_Winapi_Assembly_Hex_Call_Disassembly - Fatal编程技术网

Winapi PE 101 windows api调用地址说明

Winapi PE 101 windows api调用地址说明,winapi,assembly,hex,call,disassembly,Winapi,Assembly,Hex,Call,Disassembly,我正试图建立一个程序,将提供更多的信息,文件和可能的反汇编程序。我看了几本书以获得更多的信息,读了几遍后,我了解了其中的大部分内容。我不明白的是windows api的调用地址。例如,他如何知道指令调用[0x402070]是对messagebox的api调用?我知道如何计算字符串的地址,2个push命令对字符串有意义,但不知道dll部分 我想我想说的是我不明白“导入结构”的部分 (我画了一个黄色方框的部分)如果有人能向我解释0x402068如何指向exitProcess,0x402070如何指向

我正试图建立一个程序,将提供更多的信息,文件和可能的反汇编程序。我看了几本书以获得更多的信息,读了几遍后,我了解了其中的大部分内容。我不明白的是windows api的调用地址。例如,他如何知道指令调用[0x402070]是对messagebox的api调用?我知道如何计算字符串的地址,2个push命令对字符串有意义,但不知道dll部分

我想我想说的是我不明白“导入结构”的部分 (我画了一个黄色方框的部分)如果有人能向我解释0x402068如何指向exitProcess,0x402070如何指向MessageBoxA,这对我真的很有帮助。谢谢 加载程序(Windows操作系统的一部分)“修补”导入地址表(IAT),然后再启动示例程序,此时库过程的实际地址显示在内存位置0x402068和0x402068中。请注意,导入位于simple.asm中的nobit部分:

section nobits vstart=IMAGEBASE + 2 * SECTIONALIGN align=FILEALIGN
加载后导入的节从虚拟地址开始(IMAGEBASE=400000h)+2*(SECTIONALIGN=1000h)=0x402000

该示例的yasm源代码非常不寻常,该图表也不是学习PE格式的最佳场所。请先读(一篇短文)。它有到的链接,所以我在这里只做一些简短的说明

您可能还希望使用来检查样本。启动simple.exe,然后使用作弊引擎连接到进程,按Memory View,然后按menuTools->解析PE标题,然后按按钮信息,查看选项卡导入。在内存转储中,转到地址00402000(CTRL+G 00402000输入:

00402068:E4 39 BE 750069 5F 47 7700 00 00 6B 65 72 6E 65 6C 33 32 2E

注意这些位置的值

  • 00402068:0x75BE39E4(在我的计算机上)=内核32.ExitProcess的地址
  • 00402070:0x77475F69(仅在我的示例中)=user32.MessageBoxA的地址
请注意紧跟在它们后面的文本“kernel32.dll user32.dll”。现在查看simple.exe的hextump(我将使用),并在字符串“kernel32.dll user32.dll”之前找到相同的位置。其中的值为

0000000450:697450726F636573│ 73 00 00 4D 65 73 IT73过程混乱 0000000460:616765426f784100│ 4C_20_00_00 00 ageBoxA L 0000000470:5A_20_00_00│ 6B 65 72 6E 65 6C 33 32 Z内核32 0000000 480:2E 64 6C 6C 00 75 73 65│ 72 33 32 2E 64 6C 6C 00.dll user32.dll
  • 0000000 468:0x0000204C-dw 0的相对虚拟地址;db'ExitProcess',0
  • 0000000 470:0x0000205A-dw 0的相对虚拟地址;db'MessageBoxA',0
加载程序已将这些值从加载到内存后的文件中更改。Microsoft文档pecoff.doc对此进行了说明:

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


你下载了PE101.zip并检查了源代码吗?它们很不寻常。IAT包含DLL的名称和导入的函数。调用DLL函数时,应用程序的代码对加载程序存储在IAT插槽中的该函数的内存地址执行
调用
。因此,当你的反汇编程序看到
CAL时L
对于从IAT中检索的内存地址,它可以从IAT中检索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