在分析病毒或者逆向一些软件的时候,我们总会遇到反汇编代码,了解反汇编后的高级语言代码,将有助于我们分析理解程序的整体功能。对于常用的代码我们更要熟悉,下面我通过vc++6.0反汇编代码对常用的结构进行逆向识别
0x01 全局变量与局部变量
全局变量
#include<stdio.h>
int x=1;
int y=1;
int main()
{
x=x+y;
printf("total =%d\n",x);
return 0;
}
汇编代码
2: int x=1;
3: int y=1;
4: int main()
5: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,40h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-40h]
0040101C mov ecx,10h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
8: x=1;
00401028 mov dword ptr [x (00424a30)],1 //内存地址
9: y=1;
00401032 mov dword ptr [y (00424a34)],1
10: x=x+y;
0040103C mov eax,[x (00424a30)]
00401041 add eax,dword ptr [y (00424a34)]
00401047 mov [x (00424a30)],eax //注意这里,将eax的值赋给00424a30处,以后使用这个变量的函数都会受影响
11: printf("total =%d\n",x);
0040104C mov ecx,dword ptr [x (00424a30)]
00401052 push ecx
00401053 push offset string "total =%d\n" (0042201c)
00401058 call printf (00401080)
0040105D add esp,8
12: return 0;
00401060 xor eax,eax
局部变量
#include<stdio.h>
int x;
int y;
int main()
{
int x=1;
int y=1;
x=x+y;
printf("total =%d\n",x);
return 0;
}
汇编代码
6: int x;
7: int y;
8: x=1;
00401028 mov dword ptr [ebp-4],1 //栈基址
9: y=1;
0040102F mov dword ptr [ebp-8],1
10: x=x+y;
00401036 mov eax,dword ptr [ebp-4]
00401039 add eax,dword ptr [ebp-8]
0040103C mov dword ptr [ebp-4],eax
11: printf("total =%d\n",x);
0040103F mov ecx,dword ptr [ebp-4]
00401042 push ecx
00401043 push offset string "total =%d\n" (0042201c)
00401048 call printf (00401080)
0040104D add esp,8
12: return 0;
00401050 xor eax,eax
通过比较发现,两段代码C语言差别并不大,但是反汇编后结果差异很大,全局变量通过内存地址引用,局部变量通过栈引用,全局变量将值赋给所在的内存中
dword ptr [x (00424a30)],1 或者 dword ptr [y (00424a34)],1影响eax,通过eax的值影响x的值,而局部变量是将ebp的偏移ebp-4来引用x
0x02 if选择语句
if语句有它特有的结构,这个结构就是比较和跳转(但不是所有的跳转都是if语句)
int x;
int y;
x=1;
y=2;
if(x=y)
{
printf("x equals y\n");
}
else
{
printf("x not equals y \n");
}
return 0;
汇编代码
7: x=1;
00401028 mov dword ptr [ebp-4],1
8: y=2;
0040102F mov dword ptr [ebp-8],2
9: if(x==y)
00401036 mov eax,dword ptr [ebp-4]
00401039 cmp eax,dword ptr [ebp-8] //比较x和y的值
0040103C jne main+3Dh (0040104d) //不相等,跳转则发生;相等,就继续执行下面的语句
10: {
11: printf("x equals y\n");
0040103E push offset string "x