程序结构分析
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
此文结束/