一个简单的Crackme程序破解过程

今天在博客群里看到群友发的一个Crackme程序,一好奇就下下来看了一下。

程序下载地址:http://pan.baidu.com/s/1bn72IaN

程序运行后的界面如下:

image

首先观察下界面组成,一个name和serial输入框,一个验证状态,一个About按钮,没有菜单,没有多余的按钮。

初步猜测程序通过监听输入框消息来实时验证输入信息的,验证状态也会实时显示在Status上面。

好了,话不多说,先用IDA打开看看。

程序很简单,创建窗体,初始化,然后消息循环处理过程。所以验证的逻辑肯定在消息循环过程处理中,通过观察,果然有一些获取输出信息,然后一些xor处理,最后根据验证结果显示不同的信息。

image

从上面可以看出来,获取输入信息后,会有一些处理过程,然后就是显示结果,本来想直接修改判断条件跳转到正确的提示试试,但是我并没有找到有跳转到00401301的地方,好吧既然这样就用OD动态调试一番看看其中做了什么处理操作。

使用OD打开我们的程序,然后在name输入admin,serial输入123456,再一步一步运行来到了我们上图所示的地方。如下所示:

image

从上图的分析情况来看是这样的:

首先判断输入数据是否为空,为空则直接验证失败,然后对name进行异或操作并加上serial来修改4012D9处的4个字节,然后下面是对上面一部分代码的验证结果,如果验证成功那么跳转到4012D9处。而不是跳转到401301,所以能确定的是4012D9处修正后的代码是会跳转到401301处的。因为是4个字节,所以我们猜想前面两个字节肯定是EB 26后面两个字节暂时还不知道,但是肯定是不能够随便填的,然后后面会对该部分代码作校验。

接下来,我们先来确定这四个字节的内容。所以我们来分析:

image

 

从汇编代码看到,该段代码从DS:[ESI]处依次取一个双字赋给EAX,然后ESI+4,然后和EAX进行异或运行,重复3E次。通过调试我们发现此时:

ESI=0x004011EC

EBX=0

ECX=3E

然后将结果和0xAFFCFFB比较,相等则跳转到0x4012D9,否则验证失败!

所以这段代码的意义是将0x4011EC到0x4012E4(0x4011EC+3E*4)间的代码进行验证, 然而0x4012D9就在这个区间,所以我们可以由于来推出0x4012D9后面的四个字节为EB 26 54 58.(推理过程大家自己进行,很简单的xor)。

确定了这四个字节,那么就都好解决了,再根据这四个字节来推出0x4012BB处的EAX的值为0x580C3BA3,然后用这个值减去原来对name异或操作后的结果就是serial的值了。

我们在0x4012B9下断点,得到此时EAX的值为:0x308AFE4C   然后0x580C3BA3减去0x308AFE4C 得到值为:0x27813D57  转成十进制:662781271   这就是我们所需要的serial。

最后我们来验证一下:

name:admin

serial:662781271  

image

好了,没有任何问题,当然也可以写出注册机来,我就不写了。留给大家吧~~~~

其中总的来说并不难,首先要能够看到汇编代码,明白程序中的逻辑关系,然后找到逻辑关系就可以进行推理了,可能推理的时候麻烦点(其实也不是很麻烦),只要静下心来,不用多久就能搞定的。

其中要注意的是,在推理EB 26 54 58的时候,0x4011EC到0x4012E4部分的代码不要下断点,否则会导致出现错误的结果,因为断点会修改当前的字节为cc。

其它的就比较简单了,反正xor的逆运算也是xor,自己写个程序进行下xor就行了。

本文链接:http://www.blogfshare.com/my-first-crackme.html

5条评论

    1. AloneMonkey

      一行一行调一调就明白了~嘿嘿~

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>