160个Crackme之037学习笔记
本帖最后由 海天一色001 于 2020-6-6 14:44 编辑第37个CM程序,这个程序中“Aboutt”菜单点击后弹出一个提示窗口,大意要求找出密码,作者认为不太难,就没有其他有用信息了。
点击“Check”按钮,弹出第一个错误窗口:
随意输入数字,点击“Check”按钮,弹出第二个错误窗口:
第一步、查壳:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml5144\wps5.jpg 无壳,VB程序。
第二步、爆破:
用OD载入CyberBlade.1.exe,仍是代码压缩的提示,不管直接确定进入CPU窗口,中文搜索看看:
内容不少,说明相对复杂多了。仔细看看,两个错误窗口的内容都有,也有正确提示内容。从0040E161处双击进入CPU窗口,上下查看代码,一时找不到关键代码。还是用专门VB Decompiler来吧:
从VB Decompiler左侧窗口中看到Crackmefrm窗体中有6段子程序,分别是关于菜单、放弃(退出)按钮、窗体加载、窗体初始化、检查注册码按钮、键盘输入检查,先点开最后一个,可以看出程序主要是限制只能输入数字,也验证了错误提示的内容。
点击Checkcmd_Click_40DF60,在右侧查看对应代码,然后生成map文件,在OD中导入,再Ctrl+G,定位于0040DF60处这个Check按钮事件的段首,下断点;
F9运行,在CM的输入框中输入“1234567890”,点击“Check”按钮,程序中断,然后F8单步向下:
一直到0040DFE9处,将“1234567890”存入ss:中;
再到0040E005处将输入的字符存入ecx中,与0040344C内存中的数值比较,这里的比较应该是判断输入字符个数是否为9;
0040E005 > \8B4D E4 mov ecx,dword ptr ss: ;得到输入的字符
0040E008 .51 push ecx
0040E009 .68 4C344000 push CyberBla.0040344C
0040E00E .FF15 28114100 call dword ptr ds:[<&MSVBVM50.__vbaStrCmp>] ;msvbvm50.__vbaStrCmp
0040E014 .8BF0 mov esi,eax ;此处比较应该是得出字符个数是否为9
0040E016 .8D4D E4 lea ecx,dword ptr ss:
0040E019 .F7DE neg esi
0040E01B .1BF6 sbb esi,esi
0040E01D > .46 inc esi ;esi=(var_1C=vbNullString)`+`1
0040E01E .F7DE neg esi
0040E020 .FF15 8C114100 call dword ptr ds:[<&MSVBVM50.__vbaFreeStr>] ;msvbvm50.__vbaFreeStr
0040E026 .8D4D E0 lea ecx,dword ptr ss:
0040E029 .FF15 90114100 call dword ptr ds:[<&MSVBVM50.__vbaFreeObj>] ;msvbvm50.__vbaFreeObj
0040E02F .66:3BF7 cmp si,di
0040E032 > .74 7D je short <CyberBla.End`If> ;If`(var_1C=vbNullString)`+`1`Then(跳转必须成立)
继续到0040E032处,如果不够9位,则不跳,程序失败,如果够,跳到0040E0B1处,
F8继续向下,到0040E0E8处,得到输入的字符,经一堆相关运算,来到0040E13A处的跳转,这里如果跳走,那就跳过了正确提示窗口,所以这里应该是关键跳,可以nop掉试一下,而本语句上面的代码就应该是注册算法了。
0040E0E8 > \8B4D E4 mov ecx,dword ptr ss: ;得到输入的字符(伪码1234567890)
0040E13A > 0F84 2C010000 je <CyberBla.End`If> ;关键跳,跳过了正确提示,故需nop掉
先在0040E13A处将跳转命令nop掉,保存为新的文件CyberBlade.1.nop.exe,运行一下,输入“1234567890”,点“Check”按钮,弹出正确提示;关掉提示,又弹出一个正确提示,说明破解成功。
三、追码:
爆破时已知算法段,现在再认真分析一下:
在0040E0E8处再设一个断点,重新运行CM程序,输入“1234567890”,点击“Check”按钮,程序中断于0040DF60处,再F9,又中断于0040E0E8处。
F8单步,运行的结果基本都在下面代码段的注释中,主要是FST的数值变化不知道如何来的。注释中有指令运行后FST内数值的变化,搞不懂啊。猜测是一个明码315751288与输入的数字进行比较,只不过是运用了浮点运算罢了。0040E0FB处可知输入数字减去存于ds:中的固定数字(明码315751288),结果如为0,以下各步就能到达正确提示,否则会错误。
0040E0E8 > \8B4D E4 mov ecx,dword ptr ss: ;得到输入的字符(伪码1234567890/真码315751288),运行后FST=0020/0000
0040E0EB .51 push ecx ;存入ecx作为MSVBVM50.__vbaR8Str函数的参数,运行后FST=0020/0000
0040E0EC .FF15 5C114100 call dword ptr ds:[<&MSVBVM50.__vbaR8Str>;字符串转为浮点型(8个字节)的数值形式到ST(0)中,此时ST0=1234567890,FST=3900/3900
0040E0F2 > .DB43 4C fild dword ptr ds: ;将内的整数(十进制值315751288)转化为长双精FP80压栈(即ST0=315751288),ST1=1234567890,此时FST=3100/3100
0040E0F5 .DD9D 38FFFFFF fstp qword ptr ss: ; fstp是将ST0弹出到ss:中,运行后ST0=1234567890,ss:=315751288,FST=3900
0040E0FB .DCA5 38FFFFFF fsub qword ptr ss: ;浮点减法,运行后ST(0)=ST(0)-SS:=918816602/0,此时FST=3900/3900
0040E101 .DFE0 fstsw ax ;把FST中的值(3900/0)送入ax中,FST=3900
0040E103 .A8 0D test al,0xD ;用TEST指令来检测其相应的状态位,测试al and 13= 0,则设Z标志位为1,al and 13 <>0则设Z位为0
0040E105 > .0F85 EB030000 jnz CyberBla.0040E4F6 ;If`Err.Number=0`Then:Z标志位为1则不跳,为0跳至溢出错误
0040E10B .FF15 14114100 call dword ptr ds:[<&MSVBVM50.__vbaFpR8>>;msvbvm50.__vbaFpR8
0040E111 > .DC1D 08104000 fcomp qword ptr ds: ;浮点比较出栈ST0=918816602/0,ds:=0,运行后ST0为empty,FST=0000/4000
0040E117 .DFE0 fstsw ax ;把FST中的值(0000/4000)送入ax中,FST=0000/4000
0040E119 .F6C4 40 test ah,0x40 ;ah and 0x40 = 0/0x40;Z=1/0
0040E11C > .74 05 je short <CyberBla.End`If> ;If`Err.Number`Then 跳走则di必为0,则关键跳处会跳走到错误
0040E11E .BF 01000000 mov edi,0x1 ;edi=1
0040E123 > >8D4D E4 lea ecx,dword ptr ss: ;End`If
0040E126 .FF15 8C114100 call dword ptr ds:[<&MSVBVM50.__vbaFreeS>;msvbvm50.__vbaFreeStr
0040E12C .8D4D E0 lea ecx,dword ptr ss:
0040E12F .FF15 90114100 call dword ptr ds:[<&MSVBVM50.__vbaFreeO>;msvbvm50.__vbaFreeObj
0040E135 .F7DF neg edi ;取补
0040E137 .66:85FF test di,di
0040E13A > 0F84 2C010000 je <CyberBla.End`If> ;关键跳,跳过了正确提示,故需nop掉
所以,这也只是一个用浮点运算简单掩盖了一下的明码验证。应输入的注册码是315751288。
附件,含CM原程序、爆破后的程序、OD的调试文件等。百度链接是:http://pan.baidu.com/s/1skMkJY9,密码: 86pm,160个CM、我已练习过的前37个crackme程序(不含012)都在里面。 本帖最后由 海天一色001 于 2020-7-1 08:47 编辑
Percya 发表于 2020-6-30 21:51
网盘链接过期了,大神能再发一个嘛
链接:https://pan.baidu.com/s/1Fm_EM3jKVhYPEZGaxsik8Q
提取码:10l3
原来设置的是永久有效,不知道怎么会过期了!现在这个是永久有效的单个文件,你再试一试
从网上找到的答案是监管严了,百度开始乱封一气了!我尝试了N次,一旦分享,均提示“此链接分享内容可能因为涉及侵权、色情、反动、低俗等信息,无法访问!”
有一篇教程说了几种方法,一个个试吧,现在只能将单个文件分享了!
一个个试的过程中,原来的160个CM的压缩文件包违规了!!!!真好笑!改文件名,不行;改后缀后,还不行!全改了,还是不行!!!
没办法,删除掉,再重新压缩上传一个,这个行了,但不知能撑几天了!
链接:https://pan.baidu.com/s/1NEpyyUefbKcoJvMGG_9OmQ
提取码:p8dk 感谢分享 感谢分享 学习了,感谢楼主分享{:301_997:} 感谢分享 感谢分享! 感谢分享 学习了 感谢大神分享 学习了,谢谢 谢谢分享
页:
[1]
2