简单win32反汇编学习

windows代码如下:

#include<windows.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
MessageBox(NULL,TEXT("你好,编程世界"),TEXT("你好"),0x00000000);
return 0;
}

很简单的程序,运行后弹出一个窗口,显示“你好,编程世界”,标题为"你好"

用OD反汇编如下:

00401005 /$ E9 06000000   jmp     WinMain        //主函数入口点
0040100A |   CC            int3 //单步中断 用来调试用的
0040100B |   CC            int3
0040100C |   CC            int3
0040100D |   CC            int3
0040100E |   CC            int3
0040100F |   CC            int3
00401010 >|> 55            push    ebp       //将ebp保存 压栈,应为下面会用到ebp
00401011 |. 8BEC          mov     ebp, esp   //令ebp指向栈顶
00401013 |. 83EC 40       sub     esp, 40   //给栈中空出一片空间用来保存变量
00401016 |. 53            push    ebx     
00401017 |. 56            push    esi
00401018 |. 57            push    edi      //将ebx,esi,edi压栈,主要是怕后面会用到,或者影响这3个寄存器的数据
00401019 |. 8D7D C0       lea     edi, dword ptr [ebp-40] //传送ebp-40的地址给edi,腾出空间放变量
0040101C |. B9 10000000   mov     ecx, 10
00401021 |. B8 CCCCCCCC   mov     eax, CCCCCCCC
00401026 |. F3:AB         rep     stos dword ptr es:[edi]  //以上3条指令 为初始化变量空间为CC,也就是int 3中断
00401028 |. 8BF4          mov     esi, esp     //令esi和esp相等
0040102A |. 6A 00         push    0                                ; //Style = MB_OK|MB_APPLMODAL ,messagebox的第4个参数压栈
0040102C |. 68 30004200   push    00420030                         ; //Title = "你好" messagebox的第3个参数压栈

00401031 |. 68 1C004200   push    0042001C                         ; //Text = "你好?,AC,"编程世",BD,"? messagebox的第2个参数压栈

00401036 |. 6A 00         push    0                                ; //hOwner = NULL   messagebox的第1个参数压栈

00401038 |. FF15 94524200 call    dword ptr [<&USER32.MessageBoxA>>; //MessageBoxA
0040103E |. 3BF4          cmp     esi, esp       //检查esi 和esp是否相等,如果有异常则不等
00401040 |. E8 3B000000   call    _chkesp    //检查esp
00401045 |. 33C0          xor     eax, eax        //eax清零
00401047 |. 5F            pop     edi
00401048 |. 5E            pop     esi
00401049 |. 5B            pop     ebx                   //恢复寄存器相关值
0040104A |. 83C4 40       add     esp, 40      
0040104D |. 3BEC          cmp     ebp, esp      //同样检查esp是否恢复正常
0040104F |. E8 2C000000   call    _chkesp    //检测esp,debug模式中才有的
00401054 |. 8BE5          mov     esp, ebp      //栈顶指针给esp
00401056 |. 5D            pop     ebp       //恢复ebp寄存器
00401057 \. C2 1000       retn    10       //esp+16 子程序返回 用来平衡堆栈


你可能感兴趣的:(编程,c,windows,汇编,null,winapi)