刚开始学习破解,这是首次破解的过程记录,希望对刚开始的朋友能有所帮助。
操作系统:win98
破解对象:日语老师V1.0
软件介绍:该软件为日语教学软件,共24课,未注册版本只能学习第一课的内容。安装该软件后,有一个独立的exe程序,名称"注册日语老师.exe"。
1、peid查壳->无壳,编程语言vb5/6。
2、动态找注册码:
TRW2000加载"注册日语老师.exe",注册界面上有两个edit框,上面一个已经自动填写了"F78EE074"(硬盘序号)。在下面的edit框填写假码"12345678",^N调出TRW下断点 __vbastrcomp,F5返回应用程序点注册按钮,TRW拦下,pmodule至程序领空,很幸运,注册码"A17EZPIH"存放在寄存器EAX中。
3、静态暴破:
⑴、使用w32dasm加载"注册日语老师.exe",在串式参考里都是乱码,我不知道有什么方法可以显示出乱码,我当时的考虑是这些乱码与有意义的字符串在字节数上是否有对应关系,乱码中的"桁?x.Ncknx!"是与"注册码不正确!"在字串长度上唯一可以对应的,反汇编的代码显示405A33处调用了"桁?x.Ncknx!",向上查找这个假定的"注册失败模块"是由40593D处的跳转而来。将40593D处的代码"je 00405A03"给NOP掉就可以了。
⑵、使用OD也可以实现上述过程:
前面重复的过程省略
相关代码段:
00405919 . FF15 88104000 call [<&MSVBVM60.__vbaStrCmp>] ; MSVBVM60.__vbaStrCmp //很熟悉的字串比较
......
0040593D . /0F84 C0000000 je 00405A03 //关键跳转
//不跳转:
00405943 . 8B0F mov ecx, [edi]
......
004059AD . C785 3CFDFFFF>mov dword ptr [ebp-2C4], 00401F84
查看内存401F84处
乱码:桁?b?,.?sQ?.0邋??^0T?板/Tㄒ!
对应:注册成功,请关闭《日语老师》后重新启动! //长度不一致是由于逗号处使用了宽字符
//跳转:
00405A03 > \8B35 24114000 mov esi, [<&MSVBVM60.__vbaVarDup>] ; MSVBVM60.__vbaVarDup
......
00405A33 . C785 2CFDFFFF>mov dword ptr [ebp-2D4], 00401FB4
查看内存401FB4处
乱码:桁?x.Ncknx!
对应:注册码不正确!
把40593D开始的0F84 C0000000 改成9090 90909090 (即NOP) 破解版就完成了。
4、内存注册机:
有了OD很清晰的分析,制作内存注册机应该没有难度了。
使用keymake->其他->内存注册机。
中断地址列表部分
中断地址:405919
中断次数:1
第一字节:FF
指令长度:10
注册码部分
内存方式->寄存器EAX->宽字符串
ok!生成内存注册机!
5、关于算法:
确实跟踪注册算法是最耗时耗力的工作,但只要细致和坚持是可以做到的。
该注册算法解释如下:
第一步:计算出一个"变异码"(不知道应该用什么词来命名),变异码的计算过程为硬盘序号最后一个字符的ASCII减去第一个字符的ASCII,如果结果>=0,那么该数字就是变异码,否则就用最后一个字符的ASCII减去第三个字符的ASCII(结果值可以为负数)。
第二步:将硬盘序号的每一位分别与变异数取和。
第三步:第二步的结果按位数分别计算,第一位-1;第二位-2;第三位+3;第四位+4;第五位+25(5的平方);第六位+36(6的平方);第七位+10;第八位+11。
第四步:把第三步的结果当作ASCII值,然后转换为对应的数字或者字母。如果某位的数值超出范围,则按照字串"nmQR22IH"填入对应的位置。
示例:
硬盘序号 F 7 8 E E 0 7 4
ASCII 70 55 56 69 69 48 55 52 52-56=-4
第二步: 66 51 52 65 65 44 51 48
-1 -2 +3 +4 +25 +36 +10 +11
第三步: 65 49 55 69 90 80 61 59 48~57(0~9) 65~90(A~Z)
第四步: A 1 7 E Z P
候补字串 n m Q R 2 2 I H
注册码: A 1 7 E Z P I H
第一次破解,第一次写破文,凡事都会有第一次,仅以此致和我一样刚开始起步的朋友,只是不知道我拙劣的表述是否能对你有所帮助?
[课程]Linux pwn 探索篇!