第一个反汇编程序

程序结构分析

1、找关键词(jum call 寄存器值)

2、分析密码对比

步骤:

load ------>run------>输入Name:A/9@BcdeGmnRsU'{, Serial:123456789---->点regieste------.>暂停-------->查看stack(点K)-------->进入---------.>找到类似于“you entered an incorrect serial, try again...”字符串----->查看前后的call和jup(特别留什么每一处)

分析此图:

红色处为关键call je为关键条,为什么?

前面有两个push 刚才输入的名字和序号,后面紧跟着这个call,说明这个call是用来验证输入的名字和序号的正确性的。Call后面有一个or eax eax ; je short 00401288;。。。如果相等的话就会跳到那条注册失败的验证信息上去(je 00401288;),否则就不会发生跳转,直接进入注册正确的信息()。。。。

进入关键call分析 (在此处按回车就好)

进入Call之后如图停在push ebp上,下面还有move add push push push后面还有call后又跟着mov push 然后在call。我们还需要在进入Call

进入Call之后还是push move 再push ......当执行完loads short 0040146B 之后ESI 和EDI 寄存器内存发生变化成为我们输入的用户名:A/9@BcdeGmnRsU'{,这很关键,说明程序开始对我们输入的信息进行加工了,下面的内容肯定就是如何对我们的信息加工的。

此处的信息加工

1、0 -~9 a~z A~Z之间的存下,其他的字符过滤掉

2、dl 中存下有效字符的个数

lods byte ptr [esi]

inc dl

3、小写字母改大写(sub al 20;)

余下的代码就是为Call返回做准备工作了

pop edi ; pop esi; pop edx; pop ebx; leave ; retn ;

Call 返回的时候就回到mov ebx ,eax;

下面还有一个Call ,可以猜测:那个Call是对我们输入的序号进行处理的。

F7单步步入,进入Call里:如下图

进入Call之后前面还是push ..。。。。

F7 到那一些J* 后就是对我们的序号进行处理的过程了,我看到地址和上次处理用户名的地址一样的,可以推测出来这个对我们的序号进行了和处理用户名时一样的操作:

1、0 ~ 9 a ~ z A ~ Z之间的存下,其他的字符过滤掉

2、dl 中存下有效字符的个数

lods byte ptr [esi]

inc dl

3、小写字母改大写(sub al 20;)

退出Call 回到这里: 如图

看到那条cmp eax, ebx; 指令了吗?下面还有Jnz short 00401354;这个跳转是根据eax与ebx是否相等进行跳转的,若不相等就跳到00401354处

我们不知道他是干什么的,那么我们就一步步的来试试吧,F7 一直按 。。。。额,改返回了,返回到里这了,上图看:

我们返回到我们第一次找找到关键跳的Call下的一条Or eax, eax;指令上面。

这个说明了,系统已经验证结束了并且给我们的验证作出了判断:假的!

仅仅差几个地址就会跳到正确的注册信息那地方那个去了,他偏偏跳过去了。

为什么会这样呢?

回到那个Call里在重新自习看一遍,这也就说明了,那个我们看不懂的Call是

对我们的注册信息作出了否定。。。Fuck。。。灰心了吗???

灰心你就被打败了!!!!

仔细看看那个Call 的三个功能,怎么还有一个没有用到呢?就是那个判断有效字符个数的。

我考,不会是用户名字符个数和序号密码个数不一致就会被BAN了吧?最简单的办法就是试试设置成一样的位数,用户名不该了,改序号为:123456789012。

再重新来一遍试试,那个该死的Cmp eax, ebx;终于能相等了,原来eax,ebx存放的是有效字符串的个数。

咱们们在一步一步的来往下走:jnz 没有跳,or eax, je 无法跳;or ebx; jnz 跳到了0040135e;到现在为止已经成功过了那个返回注册错误的雷区。一改进入下一步的注册信息比较了。

F7 一直往下。。。。

这一些都是对序号一些处理和写注册机有关,我搞不懂,没能写出算法来实现。当你执行完搜有的处理后你会惊奇的发现在内存区004033DB开始的位置在每次循环完成后都会往这里写数据,你应该明白了,这就是根据你的用户名,程序算出来的你的序号。。中奖了,直接粘贴出来,测试一下,恩,成功的看到了正确的注册信息了。

小结:

简单分析一下此处程序Call的固定格式

Push ebp;

mov ebp, esp;

add esp , -8; sub esp ,10;//抬高栈顶

push edx;

Push esi ;

Push edi;

。。。。

。。。。。

。。。。

Pop edi;

Pop esi;

Pop edx;

Pop ebx;

测试数据

用户名:A/9@BcdeGmnRsU'{

获得注册码

ASCII:34 39 42 37 44 31 30 33 35 32 39 38

HEX :49B7D1035298

此文结束/

原文地址:https://www.cnblogs.com/ppazhang/p/2841587.html