本帖最后由 海天一色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:[ebp-0x1C]中;
再到0040E005处将输入的字符存入ecx中,与0040344C内存中的数值比较,这里的比较应该是判断输入字符个数是否为9;
[Asm] 纯文本查看 复制代码 0040E005 > \8B4D E4 mov ecx,dword ptr ss:[ebp-0x1C] ; 得到输入的字符
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:[ebp-0x1C]
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:[ebp-0x20]
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:[ebp-0x1C] ; 得到输入的字符(伪码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:[ebx+0x4C]中的固定数字(明码315751288),结果如为0,以下各步就能到达正确提示,否则会错误。
[Asm] 纯文本查看 复制代码 0040E0E8 > \8B4D E4 mov ecx,dword ptr ss:[ebp-0x1C] ; 得到输入的字符(伪码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:[ebx+0x4C] ; 将[ebx+0000004Ch]内的整数(十进制值315751288)转化为长双精FP80压栈(即ST0=315751288),ST1=1234567890,此时FST=3100/3100
0040E0F5 . DD9D 38FFFFFF fstp qword ptr ss:[ebp-0xC8] ; fstp是将ST0弹出到ss:[ebp-0xC8]中,运行后ST0=1234567890,ss:[ebp-0xC8]=315751288,FST=3900
0040E0FB . DCA5 38FFFFFF fsub qword ptr ss:[ebp-0xC8] ; 浮点减法,运行后ST(0)=ST(0)-SS:[ebp-0xC8]=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:[0x401008] ; 浮点比较出栈ST0=918816602/0,ds:[0x401008]=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:[ebp-0x1C] ; End`If
0040E126 . FF15 8C114100 call dword ptr ds:[<&MSVBVM50.__vbaFreeS>; msvbvm50.__vbaFreeStr
0040E12C . 8D4D E0 lea ecx,dword ptr ss:[ebp-0x20]
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。
附件
037.zip
(165.6 KB, 下载次数: 3)
,含CM原程序、爆破后的程序、OD的调试文件等。百度链接是:http://pan.baidu.com/s/1skMkJY9,密码: 86pm,160个CM、我已练习过的前37个crackme程序(不含012)都在里面。 |