海天一色001 发表于 2021-4-23 08:47

160个Crackme之051学习笔记

本帖最后由 海天一色001 于 2021-4-23 09:00 编辑

第51个CM,难度?,Serial保护方式,先打开CM程序:

弹出窗口,输入“1234567890”,点击Check按钮,弹出错误提示窗口,内容是“你输入的激活码不正确!”点掉后再点击About按钮,弹出关于窗口:

百度了一下,大致是说这个CM程序不适合新手,也不认为它适合中等水平的破解者。所以如果你不能破解它,不要制造复杂的东西,因为大多数人都不会..。这么看来可能会很难的吧。
不管如何,先试着练一下:
一、查壳:

无壳,ASM编程。
二、爆破:
将CM程序导入OD中,ASM程序,从00401000开头向下查看,代码很简洁清晰。
向下来到00401210至0040121E处,看到了错误提示框代码;

再向下,00401234至00401242处,是正确注册的提示代码:

而在00401232处的跳转跳过了正确提示,说明是关键跳,nop掉,保存为可执行文件DueList.6.nop.exe,双击这个文件,在文本框中随意输入一长串字符,然后点击Check按钮,弹出正确提示,爆破成功。

但输入字符不到8位时点击Check按钮,仍会弹出错误提示,说明在跳转命令之前还需要限制输入的字符为8位及以上的数字才行。
这样爆破就不完美了。
所以再从代码中找一找,看怎么改代码更好:

向上至00401227处,从16进制数据栏中看到跳转来自00401201处,
而00401201处再向上,004011F9处是调用GetDlgItemTextA函数,查了一下GetDlgItemTextA函数的用法,发现本CM程序中将文本编辑框中输入的字符串存入00402121地址处,eax返回字符串的长度;
(当输入“12345”、“1234567”、“123456rty”等字符串后点击Check按钮,发现不超过8个字符时eax的值均能正确得到字符串长度,大于等于8个字符时eax的值均等于8而不是真正的字符串长度!
而004011ED 处GetDlgItemTextA函数参数Count = 0x9,即字符串最大长度应该是9个,与我试这几次的结果不符!
(学习了一段ASM后,猜测是汇编中的字符串存储时自动加上了“\0”,才会这样吧。修改程序代码,那将004011ED处的push 0x9改为push 0xA/B甚至是0x10,再来检查此处的eax值。这个问题不属于本程序的破解,只是自己在进一步地学习了,具体过程不在这里写了。)
下一句004011FE处eax与0x8比较,相等则来到关键call处,否则失败;
那么直接将00401201处的跳转改到成功提示不就行了?
说干就干,将00401201处的je 00401227改成jmp 00401234,保存为DueList.6.jmp.exe,双击运行,不输入字符或输入任意字符,点击Check按钮均弹出正确信息,爆破成功。

可是仍有点小问题,主窗体的标题栏中的进度是0%!未爆破的CM程序报错时的进度是100%,nop掉跳转指令的爆破程序进度也是100%。
因为刚才修改了2个地址的代码,但没保存,所以直接Ctrl+F2重新开始,修改的地方自然就恢复了。
继续从00401232处开始研究代码,00401232处是关键跳,上一句是比较指令,则是关键比较;
再上一句,是关键call了,应该是计算判断输入的激活码用的,结果存入eax中,正确为1,错误可能为0。
所以在0040122A处按Enter键来到0040104B处:
0040104B至00401057处为设置主窗体标题栏为“Duelist's Crackme #6 -   0%”的代码段,
接下来为运算判断代码,到00401080处,此时的eax必须等于0x4071885,才能设置主窗体标题栏为“Duelist's Crackme #6 -50%”,
再运算判断一番,到004010B8处,此时的eax必须等于0x4B00D127,才能设置主窗体标题栏为“Duelist's Crackme #6 - 100%”,并将eax置1后返回。
否则跳到004010D5处,设置设置主窗体标题栏为“Duelist's Crackme #6 - 100%”,并将eax清零,返回后注册失败。
所以比较完美的爆破,是将00401201处的改成jmp 00401227,不管输入不输入,输入多少字符均跳过失败提示,进行运算判断;
然后进入0040104B这个call内将00401085处和004010BD处nop掉,保存为可执行文件DueList.6.jmpnop.exe。
双击运行DueList.6.jmpnop.exe,程序运行很慢,可以看到先显示0%,等一会儿后再显示出50%,再等会儿显示了100%,并弹出正确信息框来。爆破成功。
也可以进入0040104B这个call内将0040105C处改为jmp 00401087,显示出“Duelist's Crackme #6 -50%”,再将00401094处指令修改为jmp 004010BF,显示出“Duelist's Crackme #6 -100%”。
这个修改后的可执行文件重新保存为DueList.6.jmp.exe,双击运行,程序运行速度极快,还未看到50%的字样,就显示出100%了。这样爆破也算成功了。
还可以在0040105C处改为jmp 004010BF,直接跳过50%,来到100%,这样爆破也是可行的。
三、追码:
从爆破过程中可知,注册算法在0040104B这个call内,Ctrl+F2重新加载程序,爆破时修改的内容自然就撤消了。
在0040104B处下断,F9运行,文本框中输入“12345678”,点击Check按钮,程序中断,回到OD中F8单步向下:

0040105C至00401085处和00401094至004010BD处代码作用一样:
分别取激活码的前4位和后4位作为循环次数,
循环内先对eax=0x36455544/0x43534952进行循环左移6次运算,
ah=ah xor al
al=al+cl
ecx=ecx-1
eax结果分别等于0x4071885和0x4B00D127。这样才能注册成功。

注册机就要对这两段代码进行逆运算,上面的变成最下面的代码,dec变成inc,add变成sub,xor不变,rol变成ror:
原来破解CM程序时写过VB模拟ROR的代码,这次仍然是拿来主义了!但是拿来也不容易,一点点调试,总是出错,太累了!!!
后来发现还是高级语言对位运算等逻辑运算支持不好的原因,汇编能运算的,VB、VC都不能!!!
有大神在论坛里给我推荐了一个VisualFreeBasic,仔细研究了一段时间,感觉仍然是高级语言,对汇编中的这些字节运算也不支持,还是得从汇编入手!
学习32位汇编的过程同样是困难重重。好歹以前练习过对程序的汉化及修改,这一次也相当于给CM程序打个补丁:
在OD中重新加载CM程序,将0040105C至00401078处,00401094处至004010BC处两部分的注册检测代码分别改成如下生成注册码逆运算代码:
   
F9运行,在程序编辑框中输入“1234567890”,点击“Check”按钮,程序中断,再在00401072处右键选择“断点----运行到选定位置”命令,

在右侧查看ecx中的值,可以看到ecx=0x0DBD76F6;同时在下方的地址栏中查看00402121处的值,此时显示“12345678”;
F8单步,此时00402121处的HEX值已变成了F676BD0D,ASC值是不可显示的ASC字符:

先不管它,继续向下运行至004010AA处,此时ecx=0x72657665,00402125地址处的ASC值为“5678”;
F8单步向下,此时00402125地址处的ASC值变为“ever”,注册码应该是下图中的粉红色的字符串了:

继续向下单步运行,一直到00401242处,弹出正确信息框,说明这个注册码是正确的。
但前4位字符无法正常显示,所以要继续向下运算,在00401072处加上判断,如果得到ecx= 0x0DBD76F6,则继续向下运算:

得到ecx=0x34647369,可以正常显示成ASC值为“isd4”;
最终得到的注册码字符应该是“everisd4”,复制入CM中,点击Check按钮,弹出正确信息框。
因为利用这两段代码得到“everisd4”后继续运算,发现生成的字符更多的是不可显示字符,所以保存后生成的注册程序DueList.reg.exe就只算了一个正确的注册码出来,并利用弹出对话框来显示。
本想直接显示在编辑框中,可是费了不少事也没成功,在DueList.reg.exe还必须先输入不少于8位字符,再点击Check按钮,弹出信息框内容是正确的注册码,而编辑框中是假码。
感觉这个注册机还是相当别扭的,继续研究下去,发现还是要学习了解Win32汇编!
开始学习大神罗云彬的《Windows环境下32位汇编语言程序设计》第三版,带着目的急用先学,刚进行到第四章时发现可以利用其中的FirstWindow-1.asm源程序进行修改来生成自己的注册机程序。
于是不停地敲代码,查函数,调试,虽然对地址的调用是用addr还是offset伪指令,如何连接字符串等还有各种疑惑,但还是写出了一个勉强过得去的注册机。
在这个过程中,花费了大量的时间和精力,勉强达到了目标,对API函数有了一定的认识,同时对第一个注册机的不足有了新的认识,于是重新编辑修改DueList.reg.exe,
生成的程序reg.exe,可以在输入不少于8位的字符的情况下将注册码显示在编辑框里了。
继续对reg.exe进行修改,生成的regend.exe,可以直接点击Check按钮生成注册码并显示在编辑框及弹出信息框中了。
现在的状况是爆破及找到算法不算很难了,难在用注册机表达出来,这就是编程知识和经验有限,需要长期积累了。
累并快乐着这一切!
附件,含CM原程序、爆破后的程序、注册机及源码,(OD的调试文件被我不小心全清了!)等等。
百度链接:https://pan.baidu.com/s/1NEpyyUefbKcoJvMGG_9OmQ提取码:p8dk。

Hmily 发表于 2021-4-23 16:29

@海天一色001 可以试试用markdown来写文章,会好看非常多,方便阅读。

海天一色001 发表于 2021-4-23 16:32

Hmily 发表于 2021-4-23 16:29
@海天一色001 可以试试用markdown来写文章,会好看非常多,方便阅读。

谢谢Hmily大神的提醒,下次用markdown

whatiwhere 发表于 2021-4-25 17:42

dalao 您头像是您本人吗? 感觉是前辈啊 {:1_893:}

smokegui 发表于 2022-8-15 11:15

哥,等你的CM52啊,我只有看你的破文比较看的懂。{:1_893:}

zishen 发表于 2023-12-16 18:33

大佬在吗,有没有160个createme的所有链接,好多原链接都失效了{:1_924:}
页: [1]
查看完整版本: 160个Crackme之051学习笔记