zoukankan      html  css  js  c++  java
  • 第一个反汇编程序

    程序结构分析

    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

    此文结束/

  • 相关阅读:
    Chaikin Curves in Processing
    finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
    System.gc()和Runtime.gc()的区别?
    GC原理---对象可达判断
    java十题
    在 Queue 中 poll()和 remove()有什么区别?
    ArrayList和LinkedList的区别
    HashSet的实现原理
    Java中HashMap和TreeMap的区别
    List、Map、Set之间的联系与区别:
  • 原文地址:https://www.cnblogs.com/ppazhang/p/2841587.html
Copyright © 2011-2022 走看看