asm source code note 1.4_do_while循环的实现
发布日期:2021-06-30 22:05:59 浏览次数:2 分类:技术文章

本文共 1856 字,大约阅读时间需要 6 分钟。

//asm source code note 1.4_do_while循环的实现

29:
30:   int FnDo(int a, int b)
31:   {
//保存基址和栈顶
004010F0   push        ebp
004010F1   mov         ebp,esp
//开辟内部变量空间, 变量有2个
004010F3   sub         esp,48h
004010F6   push        ebx
004010F7   push        esi
004010F8   push        edi
004010F9   lea         edi,[ebp-48h]
004010FC   mov         ecx,12h
00401101   mov         eax,0CCCCCCCCh
00401106   rep stos    dword ptr [edi]
//[ebp - 8] = 内部变量2 (var2)
//[ebp - 4] = 内部变量1 (var1)
//[ebp + 0] = 函数入口ebp
//[ebp + 4] = 函数返回地址
//[ebp + 8] = 函数形参1 (para1)
//[ebp + 0xc] = 函数形参2 (para2)
32:       int c = a + b;
//var1 = para1 + para2;
00401108   mov         eax,dword ptr [ebp+8]
0040110B   add         eax,dword ptr [ebp+0Ch]
0040110E   mov         dword ptr [ebp-4],eax
33:       int i = 0;
//var2 = 0;
00401111   mov         dword ptr [ebp-8],0
34:
35:       do
36:       {
37:           c = c + i;
//var1 = var1 + var2;
loop1:
00401118   mov         ecx,dword ptr [ebp-4]
0040111B   add         ecx,dword ptr [ebp-8]
0040111E   mov         dword ptr [ebp-4],ecx
38:       } while (++i < 50);
//var2 += 1;
00401121   mov         edx,dword ptr [ebp-8]
00401124   add         edx,1
00401127   mov         dword ptr [ebp-8],edx
//if(var2 < 0x32)
//    goto loop1;
0040112A   cmp         dword ptr [ebp-8],32h
0040112E   jl          FnDo+28h (00401118)
39:
40:       return c;
//return var1;
00401130   mov         eax,dword ptr [ebp-4]
41:   }
//恢复堆栈,返回
00401133   pop         edi
00401134   pop         esi
00401135   pop         ebx
00401136   mov         esp,ebp
00401138   pop         ebp
00401139   ret
//把伪代码整理一下,如下:
Function(para1, para2)
{
    var1;
    var2;
    [var1] = [para1] + [para2];
    [var2] = 0;
loop1:
    [var1] = [var1] + [var2];
    [var2] += 1;
    if([var2] < 0x32)
    {
        goto loop1;
    }
    return [var1];
}
//把伪代码整理成c语言源码
DWORD Function(DWORD dwPara1, DWORD dwPara2)
{
    DWORD dwVar1 = dwPara1 + dwPara2;
    DWORD dwVar2 = 0;
    do
    {
        dwVar1 = dwVar1 + dwVar2;
    }while(++dwVar2 < 0x32);
    return dwVar1;
}
//原版的代码
int FnDo(int a, int b)
{
    int c = a + b;
    int i = 0;
   
    do
    {
        c = c + i;
    } while (++i < 50);
    return c;
}
//经过asm to c, 逆向后的源码与原版源码的区别如下:
//实现的功能一样
//函数形参和变量的类型看不出来了,都变成了DWORD
//形参和变量的含义看不出来了,需要根据上下文进行进一步整理

转载地址:https://lostspeed.blog.csdn.net/article/details/4631843 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:asm source code note 1.5_while循环的实现
下一篇:asm source code note 1.3_for循环的实现

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月16日 01时00分21秒