逆向-循环结构

本文探讨了循环结构的逆向分析,包括do-while、while和for循环在Debug和Release模式下的汇编表现。在Release模式下,循环往往被优化成do-while形式以提高效率。通过汇编代码,分析了while和for循环的结构,并指出在某些情况下,编译器可能会进行代码外提和强度削弱等优化,如将乘法操作替换为加法。文章强调,真实场景下的循环还原可能更为复杂,需要经验和深入理解。
摘要由CSDN通过智能技术生成

对于循环结构而言,主要就三种,do-while循环,while循环,for循环,这三种循环,在debug下其特点还是比较明显的,在release下的话可以说基本上都被优化为do-while循环(效率高),所以说release下的循环,根据其汇编代码我们只能做等价的还原。

下面先来看do-while循环

int main(int argc, char* argv[])
{
    int i = 0;
    int sum = 0;
    do 
    {
        sum += i;
        ++i;
    } while (i < argc);
    printf("%d\r\n",sum);
    return 0;
}

对应的汇编代码

9:        int i = 0;
0040D718 C7 45 FC 00 00 00 00 mov         dword ptr [ebp-4],0
10:       int sum = 0;
0040D71F C7 45 F8 00 00 00 00 mov         dword ptr [ebp-8],0
11:       do
12:       {
13:           sum += i;
0040D726 8B 45 F8             mov         eax,dword ptr [ebp-8]
0040D729 03 45 FC             add         eax,dword ptr [ebp-4]
0040D72C 89 45 F8             mov         dword ptr [ebp-8],eax
14:           ++i;
0040D72F 8B 4D FC             mov         ecx,dword ptr [ebp-4]
0040D732 83 C1 01             add         ecx,1
0040D735 89 4D FC             mov         dword ptr [ebp-4],ecx
15:       } while (i < argc);
0040D738 8B 55 FC             mov         edx,dword ptr [ebp-4]
0040D73B 3B 55 08             cmp         edx,dword ptr [ebp+8]
0040D73E 7C E6                jl          main+26h (0040d726)  小于则跳转

可以发现,do-while循环的汇编代码和高级代码的逻辑真的是一模一样,对于其跳转的逻辑也是一样的(if相反),因为对于循环而言,条件满足则进行循环,这里和汇编的逻辑也是一样的,条件满足进行跳转。

对于Do-While循环的大体架构如下:

DO_BEGIN:
	//.... 中间循环体
jxx DO_BEGIN  //这里是一个减量地址
DO_END:

这里do-while循环的release版本与debug结构是类似的,所以这里就不分析了。

下面再来看while循环

int main(int argc, char* argv[])
{
	int i = 0;
    int sum = 0;
    while (i < argc)
    {
        sum += i;
        ++i;
    } 
    printf("%d\r\n",sum);
    return 0;
}

对应的反汇编代码

9:        int i = 0;
0040D718 C7 45 FC 00 00 00 00 mov         dw
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值