160个Crackme之031学习笔记

第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)都在里面。

THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
管埋员的头像-小北的自留地

昵称

取消
昵称