海天一色001 发表于 2017-6-10 11:41

初练160个CrakeMe程序之010

本帖最后由 海天一色001 于 2017-6-10 11:51 编辑

第10个CM,这仍是一个VB程序,难度是困难!

随意输入key,点击OK,弹出错误窗口:

用PEID查壳,无壳:

第一步,爆破:导入OD,一直用搜索字符串的方法来练习,这次试一试按钮事件断点:在反汇编窗口中右键查找二进制字串或快捷键“Ctrl+B”,输入“816C24”,确定:

来到004018A8处,在下一句跳转指令上下断点,再“Ctrl+L”查找下一个,本程序中只有一个OK按钮,所以没找到其他的按钮事件:

F9运行程序,输入注册码“1234567890”,点“OK”,程序在此处中断。F8一次,程序来到00401E20处,这里就是OK按钮事件的段首了。向下拉滚动条,很快就在00402090处看到了UNICODE字符串"RiCHTiG !"成功的意思;再向下,看到了0040214A处的失败提示UNICODE "LEiDER Falsch ! "。那么很轻松地在00402053处找到了“je Andréna.00402119”这条跳过成功的指令,nop掉!

试一试,成功了,将爆破后的程序存为Andrénalin.3_nop.exe。

第二步,追码:因为要找注册码和算法,所以重载程序入OD,F9运行,程序中断于跳转处。F8单步走,至00401EDE处,将假码存入eax中;
00401EDE   > \8B45 A8       mov eax,dword ptr ss:          ;取假码
继续向下,感觉和上一个CM代码很相似。然后到00401F68地址至00402026处又是一个用输入的注册码计算的循环,运行到0041FA9处时,取第1个字符“1”; 下一句0041FAA处运行的函数是eax=0x31;继续向下,eax=eax+0xA=0x3B;

继续向下,运行到00401FC4处时,函数将数值转换成字符“;”

在堆栈窗口中的0012F45C处也找到了“;”,下面的UNICODE“1”应该是第1个字符的意思吧:

F8向下,第二次循环时,以上两个地址处分别变成了“<”和“2”;在堆栈中向下查看了一下,又发现在0012F4B4处的字符是“;<”了!反复运行了几次,0012F4B4处的字符随着循环次数增加而增加,直到循环结束,结果如下:

这一个循环的作用是取假码每一个字符的16进制ASCII值加上0xA,,得到的结果再转换成新的字符,我输入的是“1234567890”,循环结束后得到的结果是";<=>?@ABC:"10个字符。继续向下到0040204A处,这里__vbaVarTstEq函数应该是真假码对比,相等则返回eax=-1,不等则eax=0 。根据经验,猜测就是假码算出来的值与UNICODE "kXy^rO|*yXo*m\kMuOn*+"对比。也就是说,真码算出来的结果等于这一个"kXy^rO|*yXo*m\kMuOn*+"!
00402034   .50            push eax                                 ; /var18 = 0012F4AC
00402035   .51            push ecx                                 ; |var28 = 0012F434
00402036   .C785 5CFFFFFF>mov dword ptr ss:,Andréna.0040>; |UNICODE "kXy^rO|*yXo*m\kMuOn*+"
00402040   .C785 54FFFFFF>mov dword ptr ss:,0x8008       ; |
0040204A   .FF15 40414000 call dword ptr ds:[<&MSVBVM50.__vbaVarTs>; \__vbaVarTstEq
00402050   .66:85C0       test ax,ax
00402053      0F84 C0000000 je Andréna.00402119
仔细观察,那么注册码的算法就应该是从"kXy^rO|*yXo*m\kMuOn*+"开始取每个字符的ASCII值减去0xA,结果再转换成字符:VB代码如下:
Private Sub Start_Click()
    Code = "kXy^rO|*yXo*m\kMuOn*+"
    LenCode = Len(Code)
    Rusult = ""
    For i = 1 To LenCode
      Codice = Asc(Mid(Code, i, 1)) - 10
      Rusult = Rusult & Chr(Codice)
    Next
    Text1.Text = Rusult
End Sub
第三步,汉化:
因为论坛的大神肥牛指出了有的软件运行时会判断自身是否被修改,或者某个英文提示作为注册码生成的密钥等等,汉化都会把这些破坏掉。建议破解前不要做汉化操作。而我对原程序进行汉化是因为自己用中文版软件界面习惯了,对外语界面感到很不舒服,所以在破解的同时顺便练习一下,不是重点内容,可能在原来的练习过程中有点喧宾夺主了吧。所以将汉化放在最后一步。VBExplorer打开原Andrénalin.3.exe程序,在左下的属性栏中修改窗体的名字为“CM010-DIFFICULT(海天一色汉化);

点击属性栏的向下三角符号,更改Label1的Caption属性从“Key”到“注册码”;

再点击“查看”-“查看字符串”:

在右侧字符串窗口中修改相应的提示信息如下,然后点击运行,在文本框中随意输入内容,点击OK按钮,程序界面已基本汉化了。

根据假码时的情况,未修改的这串字符正如肥牛大神所说是注册码的密钥,不能乱改!汉化完成!VBExplorer保存时没有另存为这一选项,只能保存为原文件名。我是将保存后的文件重命名为CM010.exe,然后再将VBExplorer生成的一个备份文件Andrénalin.3.exe.backup再改回原程序名的。
虽然标题上说这个CM是Difficult(困难)的,但因为已练习了作者的两个CM,对VB的API函数也有了一定的了解掌握,所以这个CM的练习时间反而缩短了不少!
附件为010.rar,含CM原程序、爆破程序及汉化程序CM010、汉化后的爆破程序CM010_nop及010注册机。
百度链接是:http://pan.baidu.com/s/1skMkJY9 密码: 86pm,160个CM、我已练习过的前10个crackme程序都在里面。

pwp 发表于 2017-6-10 12:04

{:1_921:}牛人分析就是牛

Pingerfy 发表于 2017-6-10 12:51

厉害厉害啊,向你学习

zhengsidie 发表于 2017-6-10 12:56

不错,支持下

夏雨微凉 发表于 2017-6-10 22:58

楼主加油!坚持下去!

f250907 发表于 2017-6-11 00:25

不错,支持下

yhxing 发表于 2017-6-11 07:34

详细~看了后能懂,再出点,谢谢大神了~

wuhua2009 发表于 2017-6-12 06:24

谢谢楼主 ,希望多发些这种贴子,我们小白也学习学习。

lshaiwo 发表于 2017-6-12 12:14

很详细的呢

儒雅小白鼠 发表于 2017-6-12 19:06

不错 谢谢分析 来支持一下
页: [1] 2
查看完整版本: 初练160个CrakeMe程序之010