max函数的嵌套调用
先来看源代码:
1 // 函数的嵌套调用.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 6 int main(int argc, char* argv[]) 7 { 8 int max(int x,int y); 9 int a,b,c,d; 10 scanf("%d,%d,%d",&a,&b,&c); 11 d=max(max(a,b),c); 12 printf("max=%d\n",d); 13 return 0; 14 } 15 16 17 int max(int x,int y) 18 { 19 int z; 20 if (x>y) 21 { 22 z=x; 23 } 24 else 25 z=y; 26 return z; 27 }
这段反汇编代码也很简单,只是要认真理解就可以了。
1 ; int __cdecl main(int argc, const char **argv, const char **envp) 2 _main proc near 3 4 c= dword ptr -0Ch 5 b= dword ptr -8 6 a= dword ptr -4 7 argc= dword ptr 4 8 argv= dword ptr 8 9 envp= dword ptr 0Ch 10 11 sub esp, 0Ch 12 lea eax, [esp+0Ch+c] ; 把a的地址放入eax中 13 lea ecx, [esp+0Ch+b] 14 lea edx, [esp+0Ch+a] 15 push eax 16 push ecx 17 push edx 18 push offset Format ; "%d,%d,%d" 19 call _scanf 20 mov eax, [esp+1Ch+c] 21 mov ecx, [esp+1Ch+b] 22 mov edx, [esp+1Ch+a] 23 add esp, 10h 24 push eax 25 push ecx 26 push edx 27 call fun_max 28 add esp, 8 29 push eax 30 call fun_max 31 push eax 32 push offset aMaxD ; "max=%d\n" 33 call _printf 34 xor eax, eax 35 add esp, 1Ch 36 retn 37 _main endp
如果仔细看,发现这段代码还可以优化,少一下push。
逆向的开始是一个痛苦的过程,就像我们习惯了向前行走,现在却要倒退行走。
思维啊,不过可以发现很多东西。这段代码,如果你没有看懂,那就没有任何的意义。