学破解,肯定要会逆向,要不然,堆着一大堆的反汇编代码,你只能摇头长叹。明知道里面有你需要的东西,却是不知该如何去挖掘,是一件很令人郁闷的事。好了,废话不多说了,下面我们开始学习逆向。
不知道有多少同学学过C或者其他的编程语言,我们知道,学习一门语言,要掌握其语法,反汇编也是如此。其实所谓反汇编,就是将机器码翻译成汇编,所以我们看到的都是汇编指令。所有的编程语言,几乎都是分支加循环这么几个句式。拿C来说,在C中,分支就有if、if……else和switch,那么在反汇编中,这几个语句是以怎样的形式存在呢?接下来我们就来揭开其面纱。
我们来看这样一个小程序:
#include
main()
{
int c = 5;
if (c >= 0&& c < 10)
{
printf("c >0");
}
else if (c >= 10&& c < 100)
{
printf("c > 10&& c < 100");
}
else
{
printf("c >100");
}
}
上面是一个很简单的if……else分支语句,学过C的都能看懂,那么在反汇编中,它是怎么的呢?我们来看下面的代码:
5: if (c>= 0 && c< 10)
0040102F cmp dword ptr[ebp-4],0
00401033 jl main 3Ah(0040104a)
00401035 cmp dword ptr[ebp-4],0Ah
00401039 jge main 3Ah(0040104a)
6: {
7: printf("c> 0");
0040103B push offset string"c > 0" (0042901c)
00401040 call printf(004012a0)
00401045 add esp,4
8: }
9: else if (c>= 10 && c< 100)
00401048 jmp main 62h(00401072)
0040104A cmp dword ptr[ebp-4],0Ah
0040104E jl main 55h(00401065)
00401050 cmp dword ptr[ebp-4],64h
00401054 jge main 55h(00401065)
10: {
11: printf("c> 10 && c< 100");
00401056 push offset string"c > 10 && c< 100" (0042a080)
0040105B call printf(004012a0)
00401060 add esp,4
12: }
13: else
00401063 jmp