编程语言
首页 > 编程语言> > 逆向基础之C语言:C语言for循环九九乘法表以及裸汇编

逆向基础之C语言:C语言for循环九九乘法表以及裸汇编

作者:互联网

一.for循环

<1>.格式:

for( ; ;)
{

}

括号里的表达式

第1个.赋初值
第2个.判断条件
第3个.跳出循环的条件(一般自增自减) 

for循环可以是1个表达式 可以是2个表达式 可以是3个表达式.

<2>.for循环只有中间的条件表达式时反汇编跟while是一模一样的

 int fun1()
 {
     int a;
     int b;
     a=1;
     b=0;
     for(;a<=100;)
     {
         b=b+a;
         a++;
     }
     printf("%d",b);
     return 0;
 }

上面for循环代码的反汇编如下图所示

int fun2()
 {
     int a;
     int b;
     a=1;
     b=0;
     while(a<=100)
     {
         b=b+a;
         a++;
     }
     printf("%d",b);
     return 0;
 }

这是while循环代码

这是while循环反汇编,对比两个循环的反汇编,注意观察 ,for循环只有中间的条件表达式时反汇编跟while循环不能说毫无关系,只能说一模一样

<3>.for循环反汇编中间插了个jmp 一眼就可看出是for循环

二.for循环九九乘法表

int fun()
{
    int a;
    int b;
    for(a=1;a<=9;a++)
    {
        for (b=1;b<=a;b++)
        {
            printf("%d*%d=%d\t",b,a,b*a);
        }
        printf("\n");
 
    }
    return 0;
}

代码如上所示,打印出来如下图所示

三.for循环九九乘法表裸汇编

char*p="%d*%d=%d\t";
char*p1="\n";
char*p2="这是for循环裸汇编运行出来的\n";
_declspec(naked) int fund()
{
    _asm
    {
          push ebp
          mov ebp,esp
          sub esp,0x48
          push ebx
          push esi
          push edi
          lea edi,dword ptr ds:[ebp-0x48]
          mov ecx,0x12
          mov eax,0xcccccccc
          stosd
//a=1
          mov dword ptr ds:[ebp-0x4],0x1
          jmp lab1
lab4:
          //a++
          mov eax,dword ptr ds:[ebp-0x4]
          add eax,0x1
          mov dword ptr ds:[ebp-0x4],eax
lab1:
          //a<=9
          cmp dword ptr ds:[ebp-0x4],0x9
          jg lab7
 
          //b=1
          mov dword ptr ds:[ebp-0x8],0x1
          jmp lab2
lab6:
          //b++
          mov ecx,dword ptr ds:[ebp-0x8]
          add ecx,0x1
          mov dword ptr ds:[ebp-0x8],ecx
lab2:
          //b<=a
          mov edx,dword ptr ds:[ebp-0x4]
          cmp DWORD ptr ds:[ebp-0x8],edx
          jg lab3
          mov eax,dword ptr ds:[ebp-0x8]
          imul eax,dword ptr ds:[ebp-0x4]
          push eax
          push DWORD ptr ds:[ebp-0x4]
          push DWORD ptr ds:[ebp-0x8]
          mov ecx,p
          push ecx
          call printf
          add esp,0x10
          jmp lab6
lab3:
          mov edx,p1
          push edx
          call printf
          add esp,0x4
          jmp lab4
lab7:
          mov edx,p2
          push edx
          call printf
          add esp,0x4
          xor eax,eax
 
 
          pop edi
          pop esi
          pop ebx
          mov esp,ebp
          pop ebp
          ret
 
    }
 
 
}

for循环九九乘法表裸汇编如上,打印出来如下图片所示


今天的文章就到这里了,如果有任何不明白的地方欢迎与我交流,我必定知无不言。这篇文章也花了一定的心血,喜欢的小伙伴可以点赞关注哦。感激不尽!

搜索

复制

标签:逆向,九九乘法,int,mov,C语言,while,循环,ebp,反汇编
来源: https://www.cnblogs.com/nixiangxiaoxing/p/16446117.html