【CrackMe】001-Acid burn

一、查看程序信息


Delphi开发,没壳。

二、运行程序,寻找下手点


输入用户名、序列号,无论数字、字母、字符,任何长度,点击Check都是以下结果。
OK,既然如此,那就从消息框内容下手吧。
通常做保护的程序,都会对字符串加密处理,这里不确定是否加密,那就试试好了。

三、查找字符串
在OD里打开程序,代码区右键 -> 中文搜索引擎 -> 收索ASCII


在结果列表中快速浏览,果然发现了关键内容,消息框显示的文本。
双击跳转到对应的代码区。

四、寻找结果判断代码


跳转到代码页面后,上下附近代码浏览一下,发现注释区上面有“Good job dude”,推测这很可能是输入正确后的提示。

继续看,两个字符串下面都调用了同一个函数,CALL 001_Acid.0042A170,那肯定是消息框无疑。

提示正确的消息框 和 提示错误的消息框 挨在一起,那上面应该有判断调用哪个消息框的代码。
果然在两个CALL的上面,有一个JNZ,而且跳转的地址是0x0042FB1F,该地址正好指向错误提示框的开始。

五、暴力破解

到此,应该就可以实现爆破了。只要按下图,将JNZ调整代码清空,这样不管你输入对与错,永远都会提示正确了。




六、注册机

要写注册机,就需要了解生成密钥的算法。我们来找相关代码。



在JNZ上面肯定是进行了判断,JNZ才会依据判断结果进行调整。
推断其上面的三个CALL很有可能是,生成密钥或比较判断之类的代码。
我们给三个CALL下断点。

程序停在第一个CALL,先大体浏览一下,所以不用跟进去看,直接F8.
发现在堆栈区,出现用户名“12345”,和类似密钥的字符串“CW-4018-CRACKED”

再次运行程序,输入 “12345”“CW-4018-CRACKED”看看什么结果。


结果正确,说明“12345”对应的密钥就是“ CW-4018-CRACKED”。

换一个用户名“abcdef”再试一次,看看密钥有什么变化。



通过上图我们可以发现,序列号整体结构是固定了,中间的数字是根据用户名生成的。
而在我们下断点的地方,我们会发现中间的序列号中间的数字已经存在于堆栈中。
由此推断,我们下断点的函数,只是个字符串拼接函数,数字生成代码在上面。

我们在当前断点上面的一个CALL位置下断点,再次执行。
程序断下时,我们看到堆栈内0x0019F630的值是0。F8后,值变为“7954”。
暂时可以断定,函数CALL 001_Acid.004039AC是生成算法所在函数。

对0x0019F630下写入断点,再次执行。



MOV DWORD PTR DS:[EBX],EXI 这行代码对目标进行了写入操作,内容正好是“7954”。
再对EDI存放的地址下断点,再次执行。



到0x00402771这实在跟不下去了,没办法,死磕这段代码吧

找到RETN,发现这行代码属于函数
00403770    E8 CFEFFFFF     CALL 001_Acid.00402744
重新执行F7进入该函数,单步跟

刚进来,看EAX是一个堆地址,内存中显示ASCII就是“7954”
狗屎运,呵呵,搞破解不就是这样吗,命啊……,可以再往上推一个函数了
0040375F    E8 CCFFFFFF     CALL 001_Acid.00403730

发现这个函数跟不了,不等你点按钮,一切回界面,自动就断了
好吧我再从它的上一层函数往里进
0040703A    E8 15C7FFFF     CALL 001_Acid.00403754

进入函数,习惯性查看堆,发现EDX内地址对应ASCII为“7954”
快吐血了,但好歹有近了一步,这就是初学者的痛苦,大牛们估计瞄一眼就找到了
再找 CALL 001_Acid.00403754的前一个调用
0040702B    E8 98F4FFFF     CALL 001_Acid.004064C8

断点竟然没停,你想搞死我吗,我的耐心开始倒数了
原来这个CALL上面有JNZ直接跨过了
好,那就直接看JNZ上面的CALL


F7进入406BF4,随便往下看了看
茫茫无际的代码+4个CALL+无数的跳转+遥远的RETN
一口老血喷满屏幕,开始跟
经过一顿F8,发现 CALL 001_Acid.00406D1F后,EBP-0x40位置出现“7954”

再来一次,进入 CALL 001_Acid.00406D1F


程序是通过这个循环得到了“7954”
开始EAX是“1F12”,对这个数字循环除0xA,然后余数加上0x30,得到的就是一个ASCII
四个余数操作完在一起正好是“7954”
终于又有进展了,这回不找“7954”了,开始找“1F12”
我想我快极限了……

翻看一下堆,发现早在前面0x0019F608
那就已经出现“1F12”了
那就直接对这地址下写入断点,走你~


OK,找返回地址,看是谁调用的这里


离真相越来越近了,现在开始跟踪0x431750


终于让老子逮到了。

让我吐会血先…………………………

算法分两部分:
第一部分,在0x42FA87处,取用户名的第一个字符ASCII码,乘0x29,乘0x2
第二部分,在0x406DCA处, 循环将第一部分得到的值,除0xA,余数加0x30
                其实也就是,将第一部分得到的值,转成10进制数字符串


注册机谁爱写谁写,让我哭一会大哭

猜你喜欢

转载自blog.csdn.net/chy_chenyang/article/details/80772193