real金龟子 发表于 2013-4-18 15:38

一个带异常处理CrackMe的爆破

这个Crack是昨天JerryLee大黑阔给我的,让我做一下。因为是他们班的考试题,我以为肯定很简单。就是简单的爆破嘛。。。于是我就开始整了,但是越整越赶脚不对。我就有点气,没有了耐心。。。

然后,下午上课的时候,我就仔细研究了下。就把它简单的爆破了。
其实这个Crack看雪上面有原文。也有注册机。但是我开始不知道,后来做了再看看,觉得我的思路跟那个看雪大牛的还是有点不一样。而且我也没有注册机。还是说哈我的思路嘛。

测试用户名:jinguizi
密码:123456789zxcvbnm
这个只是测试的哈


首先,拖OD,我们直接下GetDlgItemTextA断点。断在下面这个地方,这里往下看代码就会发现,输入的密码必须是16位。


然后再往下走,有两个CALL特别重要,一个是00401260,一个是0040126b,往下看吧


我们先进第一个call,在这个里面只要是对用户名和密码进行一个主要的算法。这个算法,就是取出密码的每两位,然后将这两位进行004013B4这里面这个call的运算,将得到的结果再和用户名的每一位进行xor,得到的结果放入edi指向的地址里面,也就是00403268


那我们来看看004013B4这个call里面到底对密码的那两位做了什么。其实也没什么啦,就是如果这两位密码是数字,比如“34”,那么就会转换为int 的34,如果输入的是字母,比如“AB”,那么就会让'A'-0x57,然后取低位,‘B'减去0x57,取低位,然后再拼接成一个两位数。就OK了。


然后我们继续向下。。。
现在我们可以看到00403268里面多了8个字节的数据。因为我输入的是假的嘛,然后出现的这个也很乱。


我们继续向下,哇靠,这里居然在执行刚刚那一大推算法之后算出来的命令。。额。。好吧。。


执行之后会显示异常的
现在我们回到call edi这里。看看堆栈。这里就可以看到,SEH的异常处理程序是在00401000,我们就在00401000下断点吧。


然后我们call edi进去。这里就是我们刚刚算出来的新的指令。下面就要产生异常了。

继续往下走,产生异常,跳到系统处理异常的空间

这里我们看堆栈。

第一个0012F948指向一个EXCEPTION_RECORD结构。我们进去看看。
第一个DWROD表示异常产生的原因。第四个dword表示产生异常的地址。


下面这个0012F95C是指向一个CONTEXT结构,在这个结构的偏移B8处,是一个处理完异常之后继续向下执行的代码起始点。

现在我们跳到00401000这个异常处理代码里面。从这里,我们就可以看出,异常代码执行完后,是要跳到00401282去执行的。那我们在00301282处下断点。然后F9,


我们来到00401282处。刚刚我们在前面是用注册名和密码算了8个字节的数据出来,那么这里就表示,我们这8个字节的后4字节必须是你产生异常的原因了。
如果我们这里想要爆破,就把下面这个JNZ的跳改成JZ,


然后我们继续看到后面那个call,就是00401295这个call。这里就说明,你上面8个字节的数据的后4字节,也就是你产生异常的原因,按字节相加,低8位必须是0x54,然后我们就可以去查查那些异常代码。
08000001h    读写属性为READ_PAGE的页面
08000003h    断点异常
08000004h    单步中断
c0000008h    向一个函数传递了一个无效句柄
c0000005h    读写内存冲突
c000001Dh   遇到无效指令
c0000094h    除零异常。
那么安字节相加低8为是0x54的就是除零异常了。也就是说你必须要构造一个I额除零异常,然后你构造的代码的后4个字节还必须是0C000094
这个。。。手算的话要算死。。

那要绕过这个验证就把0040130c这个地方改了就好了。。

我们继续向下。。现在我们已经知道了正确的那个新算出来的指令的后4字节是 C0000094了,那么下面就是在将00403046里面的28个字节和c0000094异或。然后再去执行这个异或之后的代码。


我们看到00403046里面,没有异或之前的是这样的。

那么我们用破解计算器算一个。这个和C0000094异或之后的代码是好多呢。。
答案就是
6A 00 68 3B 30 40 00 68 26 30 40 00 6A 00 E8 0D
E3 FF FF C3 90 90 90 90 94 00 00 C0
然后就要程序又要去运行这段代码,但是我也不知道这段代码是什么,但是前面我觉得我的猜测是没有错的,而且我已经改了两个跳转了。而且我也已经知道这里必须是和C0000094去异或,那么为什么我不让他去异或,我直接把00403046这里面的数据改成异或之后的数据呢。。。

嗯嗯。于是我试了试。我把数据全部改了


而且我把原本的和c0000094的异或全部nop了。


现在我将我的所有修改全部保存。然后运行。。
注意,运行的时候一定要输入16位密码。

现在就对了。原来,上面的那个
6A 00 68 3B 30 40 00 68 26 30 40 00 6A 00 E8 0D
E3 FF FF C3 90 90 90 90 94 00 00 C0
这一串就是弹出下面这个框。。。好尴尬。。


我感觉这个注册机有点难写,就不想写了。。额,好没有耐心。


现在我总结下,爆破这个程序,我一共改了4个地方。
(1)00401293这个跳转,我改了。
(2)0040130c这个跳转,我改了。
(3)00401316下面的异或我全部nop了。
(4)还有就是00403046里面的数据。。

现在可以运行了。

看雪大牛的文章。:http://bbs.pediy.com/showthread.php?t=157177


亦菲冲天 发表于 2013-4-18 15:52

支持一下,
不懂都看看

混小子 发表于 2013-4-18 16:31

这个好有技术含量,表示菜鸟路过~

这只猪 发表于 2013-4-18 17:13

学习路过!支持!

※小杰※ 发表于 2013-4-18 17:55

技术文章啊!!

JoyChou 发表于 2013-4-18 18:30

膜拜姐姐

Thend 发表于 2013-4-18 18:50

金龟子叔叔分析得很到位啊。学习了,学习了。

RedAngel丶 发表于 2013-4-18 19:32

膜拜,下来学习下

小雨细无声 发表于 2013-4-18 20:16

分析详细,谢谢!
页: [1]
查看完整版本: 一个带异常处理CrackMe的爆破