汇编逆向(五)
本帖最后由 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
上面的代码有没有很熟悉的感觉,对于经常逆向软件的人来说是这样的。。。
太过于简单就不分析了
跳转到此结束!
虽然我看不懂,但是还是赞一下
很好的教程!有时间学习下!
太给力了,
膜拜gmh师傅、感谢分享
慢慢分析,慢慢学
很好的知识,继续学习中。 全论坛发来贺电 牛啊!爱了爱了!
页:
[1]
2