第31个CM程序,这个程序比前一个简洁多了,只有一个主窗体,直接输入“1234567890”,文本框显示是“***********”,有了新的变化,点击“OK”按钮,弹出错误提示框,再试试“CrackTheWorld”,仍是错误;在About菜单上点击弹出关于信息,只是出现了2.0版本,没什么用处:
第一步、查壳:
无壳,还是VB5.0编程:
第二步、爆破
用OD载入cracking4all.2.exe,智能搜索字符串:
在00402FEA这一行双击进入CPU窗口:
向上查看至00402FB8处,注释是__vbaVarTstEq,应该是关键比较,下面00402FC1处指令是“je cracking.00403056”,跳过了成功提示,来到失败提示处,所以将这里的关键跳nop掉试一下:
修改后的文件保存为cracking4all.2.nop.exe,运行,在password窗口中输入任何字符或者不输入字符,点击“OK”按钮时,均弹出成功提示框,说明破解成功:
第三步、追码:
将00402FC1处的nop指令撤消修改,观察代码:
这个程序和上一个程序非常相似,所以分析也应该很相似:
向上查看至00402ED9和00402FB8处,这是两个关键比较,一个是失败的判断,一个是成功的判断,都要和“VeiajeEjbavwij”这串字符串进行比较,应该还是用这个字符串和其他字符串进行异或运算后得到注册码的:
向上查看,可以轻松地知道“OK”按钮事件开始于00402B40处,下断,然后F9运行程序,输入“1234567890”,点击“OK”按钮,程序中断于00402B40处:
将VB Decompiler的解析导入OD中,F8向下,结合SoftSnoop监控工具的结果进行分析:
00402BFE处到00402C44处,得到假码的长度,并存入ss:[ebp-0x118]中,作为下一步循环的次数:
00402BFE处到00402D54处,从1到Len(password.text)进行循环:
[Asm] 纯文本查看 复制代码
00402C4A . B8 010000>mov eax,0x1 00402C4F . 8945 C4 mov dword ptr ss:[ebp-0x3C],eax ; ss:[ebp-0x3C]=1 00402C52 > /66:3B85 E>cmp ax,word ptr ss:[ebp-0x118] ; 从1到Len(password.text)的循环 00402C59 . |8B1D 4061>mov ebx,dword ptr ds:[<&MSVBVM50.#rtcMidCharVar_632>] ; msvbvm50.rtcMidCharVar 00402C5F > . |0F8F EF00>jg <cracking.End`If> ; If`00000001h<=0`Then///如果ax>len(password.text)跳出循环 00402C65 . |0FBFD0 movsx edx,ax 。。。。。。。。。。。。。。。。。 00402D3A . B8 010000>mov eax,0x1 00402D3F . 83C4 18 add esp,0x18 00402D42 > . 66:0345 C>add ax,word ptr ss:[ebp-0x3C] ; 00000001h=00000001h`+`1///ax=ax+1 00402D46 > . 0F80 A003>jo cracking.004030EC ; If`Err.Number<>0`Then`GoTo`loc_004030EC 00402D4C . 8945 C4 mov dword ptr ss:[ebp-0x3C],eax 00402D4F > .^ E9 FEFEFF>jmp cracking.00402C52 ; GoTo`loc_00402C52 00402D54 > > 8D55 C8 lea edx,dword ptr ss:[ebp-0x38] ; End`If
00402C68处到00402C83处,得到假码的每一个字符:
00402C85处到00402CBC处,得到UNICODE字符“4”的16进制ASC值0x34,存入[ebx]中:
[Asm] 纯文本查看 复制代码
00402C85 . 8D95 78FF>lea edx,dword ptr ss:[ebp-0x88] 00402C8B . 6A 01 push 0x1 00402C8D . 8D85 68FF>lea eax,dword ptr ss:[ebp-0x98] 00402C93 . 52 push edx 00402C94 . 50 push eax 00402C95 . C745 80 0>mov dword ptr ss:[ebp-0x80],0x4 00402C9C . C785 78FF>mov dword ptr ss:[ebp-0x88],0x2 00402CA6 > . FF15 AC61>call dword ptr ds:[<&MSVBVM50.#rtcLeftCharVar_617>] ; var_98=Left(4,`1) 00402CAC . 8D8D 68FF>lea ecx,dword ptr ss:[ebp-0x98] 00402CB2 . 8D55 AC lea edx,dword ptr ss:[ebp-0x54] 00402CB5 . 51 push ecx 00402CB6 . 52 push edx 00402CB7 > . FFD7 call edi ; var_54=CStr(var_98)///应该是[eax]=Cstr(var_98)="4" 00402CB9 . 50 push eax 00402CBA . FFD6 call esi ; msvbvm50.rtcAnsiValueBstr 00402CBC . 0FBFD8 movsx ebx,ax ; 上步运行后eax=0x34(4的16进制ASC值),[ebx]暂存字符"4"的16进制ASC值
00402CBF处到00402C D9处,得到假码每一位字符的16进制ASC值,存入[edx]中,与0x34进行异或运算,存入[ebx],并从ASCII码转换成相应的字符,存入var_A8即SS:[ebp-0xA8]中;
[Asm] 纯文本查看 复制代码
00402CBF . 8D45 88 lea eax,dword ptr ss:[ebp-0x78] 00402CC2 . 8D4D B0 lea ecx,dword ptr ss:[ebp-0x50] 00402CC5 . 50 push eax 00402CC6 . 51 push ecx 00402CC7 > . FFD7 call edi ; var_50=CStr(var_78)///应该是[eax]=CStr(var_78) 00402CC9 . 50 push eax 00402CCA . FFD6 call esi ; msvbvm50.rtcAnsiValueBstr 00402CCC . 0FBFD0 movsx edx,ax ; [edx]暂存假码中每一位字符的16进制ASC值 00402CCF . 33DA xor ebx,edx ; [ebx]=[ebx] xor [edx] 00402CD1 . 8D85 58FF>lea eax,dword ptr ss:[ebp-0xA8] 00402CD7 . 53 push ebx ; msvbvm50.rtcMidCharVar 00402CD8 . 50 push eax 00402CD9 > . FF15 6C61>call dword ptr ds:[<&MSVBVM50.#rtcVarBstrFromAnsi_608>] ; var_A8=Chr(Asc(var_54)`xor`edx)
00402CDF处到00402CFC处,将异或运算后转换成的字符先连接起来,存入var_B8中,再复制回var_38中:
[Asm] 纯文本查看 复制代码
00402CDF . 8D4D C8 lea ecx,dword ptr ss:[ebp-0x38] 00402CE2 . 8D95 58FF>lea edx,dword ptr ss:[ebp-0xA8] 00402CE8 . 51 push ecx 00402CE9 . 8D85 48FF>lea eax,dword ptr ss:[ebp-0xB8] 00402CEF . 52 push edx 00402CF0 . 50 push eax 00402CF1 . FF15 7861>call dword ptr ds:[<&MSVBVM50.__vbaVarCat>] ; 字符串连接 varB8=var_38 & var_A8 00402CF7 . 8BD0 mov edx,eax 00402CF9 . 8D4D C8 lea ecx,dword ptr ss:[ebp-0x38] 00402CFC > . FF15 0061>call dword ptr ds:[<&MSVBVM50.__vbaVarMove>] ; var_38=varB8=var_38 & var_A8 字符串复制
再向下就和030以及和上面的分析基本一样了,用新生成的字符串的每一位分别和对应的“2000”每一位进行异或运算,最后将所有字符连接起来,与“VeiajeEjbavwij”比较,相同则成功,不同则失败。
所以这个注册算法与030比较,一是key字符串不一样,还比030多了一位,二是多了一个与字符“4”的异或运算,用VB编写的注册机主要代码如下:
[Visual Basic] 纯文本查看 复制代码
Private Sub Command1_Click() Dim key, source As String Dim i Dim password As String Dim p(1 To 14) As Integer key = "VeiajeEjbavwij" source = "20002000200020" For i = 1 To 14 p(i) = Asc(Mid(key, i, 1)) Xor Asc(4) Xor Asc(Mid(source, i, 1)) password = password & Chr(p(i)) Next Text1.Text = Trim(password) End Sub
计算出的密码是“PamelaAnderson”,再运行031程序,是正确的。
附件
031.rar
(24.51 KB, 下载次数: 0)
2019-7-14 18:13 上传
点击文件名下载附件
下载积分: 吾爱币 -1 CB
,含CM原程序、爆破后的程序、注册机、OD的调试文件等。百度链接是:http://pan.baidu.com/s/1skMkJY9,密码: 86pm,160个CM、我已练习过的前31个crackme程序(不含012)都在里面。