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 子程序返回 用来平衡堆栈