经典之作,要啃一下了。
慢慢来。
先附上第一个小程序的反汇编代码,从底层理解win32api
9: #include <windows.h>
10:
11: int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
12:
13: PSTR szCmdLine, int iCmdShow)
14:
15: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,40h // vc++程序典型汇编代码,esp-40h开辟局部变量空间
00401016 push ebx
00401017 push esi
00401018 push edi //保护现场
00401019 lea edi,[ebp-40h] //edi用来根据偏移量访问局部变量及参数
0040101C mov ecx,10h //
00401021 mov eax,0CCCCCCCCh //填充cc作为缓冲区溢出标志???
00401026 rep stos dword ptr [edi]
16:
17: MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0);
00401028 mov esi,esp //esi指向栈顶
0040102A push 0 //传参,默认遵从__cdecl调用规则
0040102C push offset string "HelloMsg" (00422034) //传第三个参数
00401031 push offset string "Hello, Windows 98!" (0042201c) //传第二个参数
00401036 push 0 //第一个
00401038 call dword ptr [__imp__MessageBoxA@16 (0042a2ac)] //取iat表中的函数地址,调用。
0040103E cmp esi,esp //
00401040 call __chkesp (00401080) //用于检测堆栈是否被破坏,只在调试阶段存在,发行版本不存在。
18:
19: return 0 ;
00401045 xor eax,eax //eax置0
20:
21: }
00401047 pop edi
00401048 pop esi
00401049 pop ebx //恢复现场
0040104A add esp,40h //手动恢复堆栈平衡
0040104D cmp ebp,esp
0040104F call __chkesp (00401080) //对战是否破坏
00401054 mov esp,ebp
00401056 pop ebp
00401057 ret 10h //返回