0x01 反汇编@最简单的【main】函数

1. 程序源代码(C)

int main()
{
    return 0;
}

 

2. 使用 Visual Studio 2017 查看对应的汇编代码

int main()
{
01181A70  push        ebp                   // 保存调用者(上一个函数)的 EBP(栈底)
01181A71  mov         ebp,esp               // 设置被调用者(main函数)的 EBP
01181A73  sub         esp,0C0h              // 开辟一块大小为C0的栈空间给调用者
01181A79  push        ebx                   
01181A7A  push        esi  
01181A7B  push        edi                   // 按照惯例保存调用者的三个寄存器
01181A7C  lea         edi,[ebp-0C0h]        // 获取为被调用者局部变量预留的栈空间首地址
01181A82  mov         ecx,30h               // 预留空间为 C0 Byte ,每次写入4个字节,所以C0/4=30
01181A87  mov         eax,0CCCCCCCCh        // 0xCC即烫,对应指令 int 3(软中断)
01181A8C  rep stos    dword ptr es:[edi]    // 初始化为被调用者局部变量预留的栈空间
    return 0;
01181A8E  xor         eax,eax               // 相关于 mov eax,0
}
01181A90  pop         edi  
01181A91  pop         esi  
01181A92  pop         ebx                   // 还原调用者三个寄存器
01181A93  mov         esp,ebp               // 还原调用者的 ESP (栈顶)
01181A95  pop         ebp  
01181A96  ret  

3. 汇编指令

mov         eax,0CCCCCCCCh        // 将立即数 0xCCCCCCCC 放入到寄存器 EAX 中


参考资料:《逆向工程入门指南》 《天书夜读-从汇编语言到Windows内核编程》

猜你喜欢

转载自blog.csdn.net/IdeasPad/article/details/81843036