gmh5225 发表于 2014-12-26 00:56

汇编逆向(五)

本帖最后由 gmh5225 于 2014-12-26 00:57 编辑

写这个纯属就是自己记录下自己的学习经历,没有其他的意思。
详细命令请百度谷歌 8086汇编指令


跳转以及switch


C源代码:
int main()
{
      int a=5,b=6;
      if (a==b)
      {
                ++a;
      }
      else
                ++b;
      
      system("pause");
      return 0;
}OD反汇编:
008D1000 >55            push    ebp
008D1001    8BEC            mov   ebp, esp
008D1003    83EC 08         sub   esp, 0x8
008D1006    C745 FC 0500000>mov   dword ptr , 0x5
008D100D    C745 F8 0600000>mov   dword ptr , 0x6
008D1014    8B45 FC         mov   eax, dword ptr                ; eax=a
008D1017    3B45 F8         cmp   eax, dword ptr                ; if (a==b)
008D101A    75 0B         jnz   short testtest.008D1027                ; 如果不相等,ZF置0,跳
008D101C    8B4D FC         mov   ecx, dword ptr                ; ecx=a
008D101F    83C1 01         add   ecx, 0x1                               ; ecx++
008D1022    894D FC         mov   dword ptr , ecx               ; a=ecx
008D1025    EB 09         jmp   short testtest.008D1030
008D1027    8B55 F8         mov   edx, dword ptr
008D102A    83C2 01         add   edx, 0x1
008D102D    8955 F8         mov   dword ptr , edx
008D1030    68 F4208D00   push    testtest.008D20F4                      ; ASCII "pause"
008D1035 >FF15 A0208D00   call    dword ptr [<&MSVCR100.system>]         ; msvcr100.system
008D103B    83C4 04         add   esp, 0x4
008D103E    33C0            xor   eax, eax
008D1040 >8BE5            mov   esp, ebp
008D1042    5D            pop   ebp
008D1043 >C3            retn                                           ; 开辟12个字节空间供3个变量

下面讲switch其实就是多个if else的判断


C源代码:
int main()
{
      int a=5;
      switch (a)
      {
      case 1:
                a=1;
                break;
      case 2:
                a=2;
                break;
      case 3:
                a=3;
                break;
      default:
                a=0;
                break;
      }
      system("pause");
      return 0;
}OD反汇编:
012E1000 >55            push    ebp
012E1001    8BEC            mov   ebp, esp
012E1003    83EC 08         sub   esp, 0x8
012E1006    C745 FC 0500000>mov   dword ptr , 0x5               ; int a=5
012E100D    8B45 FC         mov   eax, dword ptr                ; eax=a
012E1010 >8945 F8         mov   dword ptr , eax               ; b=eax
012E1013    837D F8 01      cmp   dword ptr , 0x1               ; if (b==1)
012E1017    74 0E         je      short testtest.012E1027                ; 如果相等,ZF置1,跳转
012E1019    837D F8 02      cmp   dword ptr , 0x2
012E101D    74 11         je      short testtest.012E1030                ; 同上,相等跳转
012E101F    837D F8 03      cmp   dword ptr , 0x3
012E1023    74 14         je      short testtest.012E1039                ; 相等跳转
012E1025    EB 1B         jmp   short testtest.012E1042                ; 全部都不等,就是default
012E1027    C745 FC 0100000>mov   dword ptr , 0x1               ; a=1
012E102E    EB 19         jmp   short testtest.012E1049
012E1030    C745 FC 0200000>mov   dword ptr , 0x2               ; a=2
012E1037    EB 10         jmp   short testtest.012E1049
012E1039    C745 FC 0300000>mov   dword ptr , 0x3               ; a=3
012E1040 >EB 07         jmp   short testtest.012E1049
012E1042    C745 FC 0000000>mov   dword ptr , 0x0               ; a=0
012E1049    68 F4202E01   push    testtest.012E20F4                      ; ASCII "pause"
012E104E    FF15 A0202E01   call    dword ptr [<&MSVCR100.system>]         ; msvcr100.system
012E1054    83C4 04         add   esp, 0x4
012E1057    33C0            xor   eax, eax
012E1059    8BE5            mov   esp, ebp
012E105B    5D            pop   ebp
012E105C >C3            retn                                           ; a=edx=i+1
如果switch分支过多,就会出现如下代码:
00361000 >55            push    ebp
00361001    8BEC            mov   ebp, esp
00361003    83EC 08         sub   esp, 0x8
00361006    C745 FC 0500000>mov   dword ptr , 0x5         ; int a=5
0036100D    8B45 FC         mov   eax, dword ptr          ; eax=a
00361010    8945 F8         mov   dword ptr , eax         ; b=eax
00361013    8B4D F8         mov   ecx, dword ptr          ; ecx=b
00361016    83E9 01         sub   ecx, 0x1                         ; ecx=ecx-1
00361019    894D F8         mov   dword ptr , ecx         ; b=ecx
0036101C    837D F8 06      cmp   dword ptr , 0x6         ; a-1与6比较
00361020    77 49         ja      short testtest.0036106B          ; a-1>6 也就是a>7 也就是default,则跳default
00361022    8B55 F8         mov   edx, dword ptr          ; d=b=a-1
00361025    FF2495 88103600 jmp   dword ptr        ; 利用edx的数值 动态跳转
0036102C    C745 FC 0100000>mov   dword ptr , 0x1
00361033    EB 3D         jmp   short testtest.00361072
00361035    C745 FC 0200000>mov   dword ptr , 0x2
0036103C    EB 34         jmp   short testtest.00361072
0036103E    C745 FC 0300000>mov   dword ptr , 0x3
00361045    EB 2B         jmp   short testtest.00361072
00361047    C745 FC 0400000>mov   dword ptr , 0x4
0036104E    EB 22         jmp   short testtest.00361072
00361050    C745 FC 0500000>mov   dword ptr , 0x5
00361057    EB 19         jmp   short testtest.00361072
00361059    C745 FC 0600000>mov   dword ptr , 0x6
00361060    EB 10         jmp   short testtest.00361072
00361062    C745 FC 0700000>mov   dword ptr , 0x7
00361069    EB 07         jmp   short testtest.00361072
0036106B    C745 FC 0000000>mov   dword ptr , 0x0
00361072    68 F4203600   push    testtest.003620F4                ; ASCII "pause"
00361077    FF15 A0203600   call    dword ptr [<&MSVCR100.system>]   ; msvcr100.system
0036107D    83C4 04         add   esp, 0x4
00361080    33C0            xor   eax, eax
00361082    8BE5            mov   esp, ebp
00361084    5D            pop   ebp
00361085    C3            retn
上面的代码有没有很熟悉的感觉,对于经常逆向软件的人来说是这样的。。。
太过于简单就不分析了
跳转到此结束!




Camille 发表于 2014-12-26 00:57

虽然我看不懂,但是还是赞一下

Scar-疤痕 发表于 2014-12-26 09:44

很好的教程!有时间学习下!

逍遥枷锁 发表于 2014-12-26 10:01




太给力了,

520Kelly 发表于 2014-12-26 13:10

膜拜gmh师傅、感谢分享

wpsys 发表于 2014-12-26 14:51

慢慢分析,慢慢学

fcguo800 发表于 2017-11-30 14:52

很好的知识,继续学习中。

别管我了行 发表于 2022-2-25 02:28

ghostxu 发表于 2022-4-6 02:00

全论坛发来贺电

曾经沧海 发表于 2022-10-10 11:30

牛啊!爱了爱了!
页: [1] 2
查看完整版本: 汇编逆向(五)