逆向_09if-else语句逆向分析
判断函数参数的个数问题
- 一般情况下:
- 观察调用处的代码(注意push的个数)
- 找到平衡堆栈的代码继续论证
- 两者综合,函数的参数个数基本确定了
- 如果以上的情况无法确定就简单使用以下步骤进行简单的分析
- 不考虑ebp、esp
- 只找给别人赋值的寄存器(eax、ecx、edx、ebx、esi、edi)
- 找到后追查其来源,如果寄存器中的值不是在函数内存赋值的,那一定是传进来的参数
- 公式一:寄存器 + ret 4 = 参数个数
- 公式二:寄存器 + [ebp+8] + [ebp+0x] = 参数个数
if语句的逆向分析
C语言代码
int g_n = 10; int func1(int x,int y){ int a = g_n; if (x<=y) { g_n = y+a; } return g_n; }
汇编代码
int a = g_n; 0010139E mov eax,dword ptr [g_n (107000h)] //全局变量 001013A3 mov dword ptr [ebp-0x4],eax if (x<=y) //重点关注的地方,判断的地方 001013A6 mov eax,dword ptr [ebp+0x8] 001013A9 cmp eax,dword ptr [ebp+0xC] 001013AC jg func1+39h (1013B9h) //大于跳转 { g_n = y+a; 001013AE mov eax,dword ptr [ebp+0xC] 001013B1 add eax,dword ptr [ebp-0x4] 001013B4 mov dword ptr [g_n (107000h)],eax } return g_n; 001013B9 mov eax,dword ptr [g_n (107000h)]
if-else语句的逆向分析
C语言代码
int g_n = 10; int func1(int x,int y){ int a = g_n; if (x<=y) { g_n = y+a; }else{ g_n = y-a; } return g_n; }
汇编代码
int a = g_n; 00C1139E mov eax,dword ptr [g_n (0C17000h)] 00C113A3 mov dword ptr [ebp-0x4],eax if (x<=y)//判断, 00C113A6 mov eax,dword ptr [ebp+0x8] 00C113A9 cmp eax,dword ptr [ebp+0xC] 00C113AC jg func1+3Bh (0C113BBh) //大于则跳转到else的代码处,否则则继续执行 { g_n = y+a; 00C113AE mov eax,dword ptr [ebp+0xC] 00C113B1 add eax,dword ptr [ebp-0x4] 00C113B4 mov dword ptr [g_n (0C17000h)],eax 00C113B9 jmp func1+46h (0C113C6h) //跳转到return处数值的返回 }else{ g_n = y-a; 00C113BB mov eax,dword ptr [ebp+0xC] 00C113BE sub eax,dword ptr [ebp-0x4] 00C113C1 mov dword ptr [g_n (0C17000h)],eax } return g_n; 00C113C6 mov eax,dword ptr [g_n (0C17000h)]
if-else if-if语句的逆向分析
C语言代码
int g_n = 10; int func1(int x,int y){ int a = g_n; int b= 10; if (x<=y) { g_n = y+a; }else if(x>10){ g_n = y-a; }else{ g_n = a; } return g_n; }
汇编代码
int a = g_n; 00861A4E mov eax,dword ptr ds:[00867000h] 00861A53 mov dword ptr [ebp-8],eax int b= 10; 00861A56 mov dword ptr [ebp-14h],0Ah if (x<=y) 00861A5D mov eax,dword ptr [ebp+8] 00861A60 cmp eax,dword ptr [ebp+0Ch] 00861A63 jg 00861A72 //跳转到else if 分支 { g_n = y+a; 00861A65 mov eax,dword ptr [ebp+0Ch] 00861A68 add eax,dword ptr [ebp-8] 00861A6B mov dword ptr ds:[00867000h],eax 00861A70 jmp 00861A8D //跳转到返回 }else if(x>10){ 00861A72 cmp dword ptr [ebp+8],0Ah 00861A76 jle 00861A85 //跳转到else分支 g_n = y-a; 00861A78 mov eax,dword ptr [ebp+0Ch] 00861A7B sub eax,dword ptr [ebp-8] 00861A7E mov dword ptr ds:[00867000h],eax }else{ 00861A83 jmp 00861A8D //跳转到返回 g_n = a; 00861A85 mov eax,dword ptr [ebp-8] 00861A88 mov dword ptr ds:[00867000h],eax } return g_n; 00861A8D mov eax,dword ptr ds:[00867000h]
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 787772394@qq.com
文章标题:逆向_09if-else语句逆向分析
本文作者:二豆子·pwnd0u
发布时间:2020-10-04, 08:50:21
最后更新:2023-05-18, 09:49:24
原始链接:http://blog.codefat.cn/2020/10/04/%E9%80%86%E5%90%91-09if-else%E8%AF%AD%E5%8F%A5%E9%80%86%E5%90%91%E5%88%86%E6%9E%90/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。