将exe文件反编译回C语言

问题描述 投票:2回答:1

我对汇编语言很陌生,正在努力学习。我正在上一门课程来学习它,他们提到了一个非常补救的Hello World示例,我对其进行了分解。

原始c文件:

#include <stdio.h>
int main()
{
printf("Hello Students!");
return 0;
}

这是使用以下命令反编译的:

C:> objdump -d -Mintel HelloStudents.exe > disasm.txt

拆卸(组装):

push ebp
mov  ebp, esp
and  esp, 0xfffffff0
sub esp, 0x10
call 401e80 <__main>
mov DWORD PTR [esp], 0x404000
call 4025f8 <_puts>
mov eax, 0x0
leave
ret

将分解后的输出映射到原始C文件时遇到问题,有人可以提供帮助吗?

非常感谢!

c windows assembly decompiling objdump
1个回答
6
投票

将汇编反编译为C的技术术语是“将汉堡包转换为母牛”。生成的程序集将是源代码的一对一转换,并且根据优化级别的不同可能会有所不同。您将获得功能上与原始来源相同的内容,但是在结构上与原始来源的相似程度差异很大。 请不要发布objdump输出的图像-将文本复制并粘贴到您的问题正文中,因为现在我必须手动输入所有内容。任何错别字都是我的错:

push ebp mov ebp, esp and esp, 0xfffffff0 sub esp, 0x10 call 401e80, <___main>

全部为前言,为main功能设置堆栈帧。

mov DWORD PTR [esp], 0x404000

这会推送字符串字面量“ Hello Students!”的地址。进入堆栈。

call 4025f8 <_puts>

这将调用puts功能。编译器意识到在printf调用中没有进行任何格式处理,因此将其替换为更简单的puts调用。 

mov eax, 0x0

main的返回值被加载到eax寄存器中

leave ret

退出功能并恢复之前的堆栈帧。 
© www.soinside.com 2019 - 2024. All rights reserved.