海天一色001 发表于 2019-7-14 18:13

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:中,作为下一步循环的次数:

00402BFE处到00402D54处,从1到Len(password.text)进行循环:
00402C4A   .B8 010000>mov eax,0x1
00402C4F   .8945 C4   mov dword ptr ss:,eax                         ;ss:=1
00402C52   > /66:3B85 E>cmp ax,word ptr ss:                        ;从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:                           ;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:,eax
00402D4F > .^ E9 FEFEFF>jmp cracking.00402C52                                 ;GoTo`loc_00402C52
00402D54 > >8D55 C8   lea edx,dword ptr ss:                         ;End`If
00402C68处到00402C83处,得到假码的每一个字符:

00402C85处到00402CBC处,得到UNICODE字符“4”的16进制ASC值0x34,存入中:
00402C85   .8D95 78FF>lea edx,dword ptr ss:
00402C8B   .6A 01   push 0x1
00402C8D   .8D85 68FF>lea eax,dword ptr ss:
00402C93   .52      push edx
00402C94   .50      push eax
00402C95   .C745 80 0>mov dword ptr ss:,0x4
00402C9C   .C785 78FF>mov dword ptr ss:,0x2
00402CA6 > .FF15 AC61>call dword ptr ds:[<&MSVBVM50.#rtcLeftCharVar_617>]   ;var_98=Left(4,`1)
00402CAC   .8D8D 68FF>lea ecx,dword ptr ss:
00402CB2   .8D55 AC   lea edx,dword ptr ss:
00402CB5   .51      push ecx
00402CB6   .52      push edx
00402CB7 > .FFD7      call edi                                                   ;var_54=CStr(var_98)///应该是=Cstr(var_98)="4"
00402CB9   .50      push eax
00402CBA   .FFD6      call esi                                                   ;msvbvm50.rtcAnsiValueBstr
00402CBC   .0FBFD8    movsx ebx,ax                                             ;上步运行后eax=0x34(4的16进制ASC值),暂存字符"4"的16进制ASC值
00402CBF处到00402C D9处,得到假码每一位字符的16进制ASC值,存入中,与0x34进行异或运算,存入,并从ASCII码转换成相应的字符,存入var_A8即SS:中;
00402CBF   .8D45 88   lea eax,dword ptr ss:
00402CC2   .8D4D B0   lea ecx,dword ptr ss:
00402CC5   .50      push eax
00402CC6   .51      push ecx
00402CC7 > .FFD7      call edi                                                   ;var_50=CStr(var_78)///应该是=CStr(var_78)
00402CC9   .50      push eax
00402CCA   .FFD6      call esi                                                ;msvbvm50.rtcAnsiValueBstr
00402CCC   .0FBFD0    movsx edx,ax                                             ;暂存假码中每一位字符的16进制ASC值
00402CCF   .33DA      xor ebx,edx                                                ;= xor
00402CD1   .8D85 58FF>lea eax,dword ptr ss:
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中:
00402CDF   .8D4D C8   lea ecx,dword ptr ss:
00402CE2   .8D95 58FF>lea edx,dword ptr ss:
00402CE8   .51      push ecx
00402CE9   .8D85 48FF>lea eax,dword ptr ss:
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:
00402CFC > .FF15 0061>call dword ptr ds:[<&MSVBVM50.__vbaVarMove>]               ;var_38=varB8=var_38 & var_A8 字符串复制
再向下就和030以及和上面的分析基本一样了,用新生成的字符串的每一位分别和对应的“2000”每一位进行异或运算,最后将所有字符连接起来,与“VeiajeEjbavwij”比较,相同则成功,不同则失败。
所以这个注册算法与030比较,一是key字符串不一样,还比030多了一位,二是多了一个与字符“4”的异或运算,用VB编写的注册机主要代码如下:
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程序,是正确的。
附件,含CM原程序、爆破后的程序、注册机、OD的调试文件等。百度链接是:http://pan.baidu.com/s/1skMkJY9,密码: 86pm,160个CM、我已练习过的前31个crackme程序(不含012)都在里面。

2016凯凯 发表于 2019-7-14 18:56

我是小白过路{:301_980:}

小糊涂虫 发表于 2019-7-14 19:29

一天玩几个,时间很充裕

yzsn1314 发表于 2019-7-14 19:59

收藏一个

bingbing0456 发表于 2019-7-16 11:39

新手学习,练练手!

du198683 发表于 2019-7-16 13:57

路过学习一下,看看有没有我需要的东西了……。
页: [1]
查看完整版本: 160个Crackme之031学习笔记