本帖最后由 海天一色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中;
[Asm] 纯文本查看 复制代码 00401EDE > \8B45 A8 mov eax,dword ptr ss:[ebp-0x58] ; 取假码
继续向下,感觉和上一个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*+"!
[Asm] 纯文本查看 复制代码 00402034 . 50 push eax ; /var18 = 0012F4AC
00402035 . 51 push ecx ; |var28 = 0012F434
00402036 . C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],Andréna.0040>; |UNICODE "kXy^rO|*yXo*m\kMuOn*+"
00402040 . C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],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代码如下:
[Visual Basic] 纯文本查看 复制代码 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
(19.58 KB, 下载次数: 13)
为010.rar,含CM原程序、爆破程序及汉化程序CM010、汉化后的爆破程序CM010_nop及010注册机。
百度链接是:http://pan.baidu.com/s/1skMkJY9 密码: 86pm,160个CM、我已练习过的前10个crackme程序都在里面。 |