一个简单的带反调试程序的破解
本帖最后由 real金龟子 于 2013-4-1 23:16 编辑这个crackme是06年看雪的一个crackme,应该比较老了。但是我觉得多练习是好的。所以就拿来做了。下载地址:
http://pan.baidu.com/share/home?uk=4027462993
[
运行界面上这样的。这个程序点击register之后就可以注册了,本来我以为程序很简单,直接下GetDlgItemText断点,或者直接搜索错误提示字符串的对话框断点,但是我错了。。。
我几乎将所有有可能跳转到错误提示框的地方都下来断,但是就是不行。这个时候我就想,可能程序有反调试了。于是我单步跟踪。
来到了下面的地方,看到了窗口回调函数的地址。00401230.于是我就Ctrl+g来到回调函数里面去看看
下面就是就是回调函数的开始,我在这里下断点,让程序运行过来,这个时候是没有检测到断点的。然后程序就一直在里面循环了,那么现在我将断点移动到0040126C那个call那里。然后我随便输入一个用户名密码。就断下来了。我猜想,再里面肯定做了什么判断。于是我就跟进去看了。
下面就是call进去的内容了。这里是在检测int 3断点,只要检测到了ecx里面的值就不是0了,只要不是0,那么je这个跳就不会跳,下面这个JMP就会直接跳到错误提示框去。这里只需要将je改成jmp就好了。就可以绕过这个检测了。
那么我们再来看看下一个call里面的内容,这里是在检测你有没有下GetDlgItemTextA断点,这个还是很好看出来的。解决办法跟上面那个一样。
过来这两个检测,就可以直接去到算法的检测了。其实这个题的算法还是挺简单的,就是有点麻烦,考耐心啊‘
我这里用到用户名是 123456 测试密码是mengmeizi
这里就是一个比较关键的地方了。在这里面又有两个比较关键的地方,一个是4012DE这个地方。还有一个是它下面一个call,我们必须进去看。下面我们就一个一个的看看
我们来到这里,下面这段是检测你的密码是不是大写字母。因为不能让00401358这一步发生,所以0040134c就不能跳!就是不能跳,所以上面这个cmp必须成立。所以必须是大写字母
然后我们修改我们的密码,为大写字母之后,继续往下来。
下面这段代码很重要,是对用户名的处理,用户名累加之后低8位和0x18求余,这个余数很重要必须要记住。
我们再往下看。看到这里,这里是将密码的第二位读取出来,然后与0x45比较,这里就说明我们的密码第二位必须是“E”
继续往下,我们从这里就可以看出我们的密码是OXA位了。
继续往下,下面这一段是再检测密码的第一位。算法还是很简单的,他原先存好了一个字符数组,然后从这里抽出第eax位与我密码的第一位比较。如果我的用户名是123456,那么余数是5,那么这就是抽第五位,然后我密码的第一位就是Q,最后要将这个余数和dl相加,作为新的余数,相当于是余数 = 余数 × 2;
我们继续向下,这里跟上面的算法一样的。所以第三位是P
下面是一个循环来验证密码,算法跟上面的都是一样一样的,
到目前为止,就可以验证签名的前九位是QEPWUDMPW了。现在还差一个。就是再往下走,就会看到下面的代码。恩恩,就是验证最后一位了。如果最后一个是O那么就成功了。。。哈哈哈哈
所以 123456 的密码是 QEPWUDMPWO
完成了。
楼主的图破了 此等大神我等楷模啊,膜拜。。 欢迎分析讨论交流,期待下一个作品,
吾爱有你更精彩。 排版有点小问题,不过金龟子叔叔好厉害~ 金龟子姐姐粉丝团来围观 金龟子叔叔 分析得很到位呀。。。加油加油! Chief 发表于 2013-4-1 23:48 static/image/common/back.gif
欢迎分析讨论交流,期待下一个作品,
吾爱有你更精彩。
恩恩,一定继续努力
Thend 发表于 2013-4-2 09:12 static/image/common/back.gif
金龟子叔叔 分析得很到位呀。。。加油加油!
明明是萌妹子。。不调皮嘛。。
新人求带
leeyeah93 发表于 2013-4-2 08:59 static/image/common/back.gif
金龟子姐姐粉丝团来围观
吾爱有你更精彩。加油!