学会破解一般保护软件的思路。这一点是很重要的。
教学对象:对于用ollydbg破解已有一般了解而想更上一层楼的朋友。
破解目标:魔术情书V5.1版
破解工具:ollydbg1.07,regmon(注册表监测软件)
开始:
一,老样子,用FI 4.50查它有没有加壳。切,这个软件加了ASPR 1.22的壳。真
是TMD烦。
二,由于是破它的限期,所以我们要找出它的程序次数的存放地方。步骤如下:
1,查文件目录。我把软件目录删掉,再重装。没有用。这就说明,程序运行次数没在文件目录下。
2,查注册表。我用System Mechanic 3.6的安全安装,载入并运行完主程序后,
安装报告说,注册表没有什么改动。(呵,不知道System Mechanic 3.6不仅可以
检查安装程序,还可以检查普通程序运行后,在系统中加入了什么东西吧!)
注册表没有什么改动,那就一定在系统目录下了!
3,查系统目录。这一次用上我们的法宝:Filemon 。经过扫描,如图:

看到上面的Friend.dll没有,我找了好久都没有找到这一个文件。后来,仔细一看,这个文件是由OSK.CNT文件动态生成的。怪不得找不着。这里头有鬼!并且再
往下,提示到期窗口就出现了。
好,找到点了,下面我们的利剑ollydbg该出来了!!
开始:
一,载入程序,由于程序加了壳,我们首先要找到入口点。我们按SHIFT+F9键20下(为什么是20下,因为21下程序就运行了嘛!)我们会来到下图处:

这是一个程序异常,我们看一下窗口右下角,如图:

在光标下面一行是:00BE8BBF
好的,我们就在00BE8BBF下断点。我们向上看,却看到了这个样子:

只有00BE8BBE而没有00BE8BBF。不要紧,我们把00BE8BBE处的指令变成NOP
(光标定位在00BE8BBE处,按空格键,输入NOP,注意下方的选择框不要找钩,
如图所示)。变成下图的样子:
[page]
我们在00BE8BBF上下个断点(也就是在这一行上双击)。
接下来,按F9运行到00BE8BBF中断后,我们向下拉窗口,大约三四十行左右吧!
会看到如下的画面:

双击光标处下个断点,按F9键运行。在00BE8C87处中断后,按一下F7键,我们会来到如下的画面:

看到没有,上图中的:
00BE8BB5 JMP EAX 中的EAX中存放的就是程序的入口点。我们在00BE8BB5处
下个断点。F9运行到00BE8BB5处,记下EAX的值,再按一下F7,我们就正式进入
到程序的真正领域了。如下图:

接下来,我们来看一下有什么可以利用的没有。点右键,查看全部字符串。如图所示:

运行后,会跳出一个窗口,最大化后,我们在光标处向上找大约十来行就会看到如下图所示:
[page]
看到光标处的“\Help\"没有,我们双击这一行,会跳到如下的窗口:

我们在光标处下断点,也就是0056D4C5处下个断点。这个地方,说明程序在读"\HELP\"录了。
按F9运行后,程序中断在0056D4C5处,果然,这时提示窗口还没有出现。
我们按F8键(相当于TRW2000中的F10)4下,在经过0056D4D1后,提示窗口就出现了。这就说明0056D4D1处有问题,我们按F7跟进去后,接下来我们就要用最有威力的一招了:动画调试
怎么个动画调试,如下图:

在点了Animate over后,我们就会发现,指令在一行一行的运行。不要急,等十来秒钟后,指令不跳了。这时提示窗口也出现了。光标停在下图的位置:

这就说明这个CALL有问题了,程序在这个时候已经判断完是否已过期了。现在我们向上看一个,有没有可以跳过这个CALL的地方或者程序判断是否过期的地方。如下
所示:
代码如下:
00567EC6 8B8D 04FCFFFF MOV ECX,DWORD PTR SS:[EBP-3FC]
00567ECC 8B97 04070000 MOV EDX,DWORD PTR DS:[EDI+704]
00567ED2 8BC7 MOV EAX,EDI
00567ED4 E8 53CAFFFF CALL 复件_MSQ.0056492C
00567ED9 A1 6C725800 MOV EAX,DWORD PTR DS:[58726C]
00567EDE FF40 0C INC DWORD PTR DS:[EAX+C]
00567EE1 A1 6C725800 MOV EAX,DWORD PTR DS:[58726C] ;重点:
00567EE6 8B40 0C MOV EAX,DWORD PTR DS:[EAX+C] ;取程序次数
00567EE9 83F8 1A CMP EAX,1A ;判断是否大于1A也就是十六进制的25
00567EEC 74 09 JE SHORT MSQ.00567EF7 ;相等就跳,跳就死定了。
00567EEE 83F8 1A CMP EAX,1A ;看是否小于25
00567EF1 0F8E C6010000 JLE ;小于就跳,一定要跳,因为往下走,就出现提示窗口了。
00567EF7 8B0D BCA95700 MOV ECX,DWORD PTR DS:[57A9BC] ; MSQ.00587264TR
00567EFD A1 CCA85700 MOV EAX,DWORD PTR DS:[57A8CC]
00567F02 8B00 MOV EAX,DWORD PTR DS:[EAX]
00567F04 8B15 601F5600 MOV EDX,DWORD PTR DS:[561F60] ; MSQ.00561FACTR
00567F0A E8 8DDAEEFF CALL 复件_MSQ.0045599C:[
00567F0F 33C0 XOR EAX,EAX
00567F11 55 PUSH EBP
00567F12 68 DB7F5600 PUSH 复件_MSQ.00567FDB
00567F17 64:FF30 PUSH DWORD PTR FS:[EAX]
00567F1A 64:8920 MOV DWORD PTR FS:[EAX],ESP
00567F1D 8B87 A4060000 MOV EAX,DWORD PTR DS:[EDI+6A4]
00567F23 8B40 24 MOV EAX,DWORD PTR DS:[EAX+24]
00567F26 33D2 XOR EDX,EDX
00567F28 E8 FB43FEFF CALL 复件_MSQ.0054C328
00567F2D B2 01 MOV DL,1
00567F2F E8 5044FEFF CALL 复件_MSQ.0054C384
00567F34 A1 BCA95700 MOV EAX,DWORD PTR DS:[57A9BC]
00567F39 8B00 MOV EAX,DWORD PTR DS:[EAX]
00567F3B 8B80 E0020000 MOV EAX,DWORD PTR DS:[EAX+2E0]
00567F41 33D2 XOR EDX,EDX
00567F43 E8 88E5ECFF CALL 复件_MSQ.004364D0
00567F48 A1 BCA95700 MOV EAX,DWORD PTR DS:[57A9BC]
00567F4D 8B00 MOV EAX,DWORD PTR DS:[EAX]
00567F4F 8B80 E0020000 MOV EAX,DWORD PTR DS:[EAX+2E0][page]
00567F55 33D2 XOR EDX,EDX
00567F57 8B08 MOV ECX,DWORD PTR DS:[EAX]
00567F59 FF51 5C CALL DWORD PTR DS:[ECX+5C]
00567F5C A1 BCA95700 MOV EAX,DWORD PTR DS:[57A9BC]
00567F61 8B00 MOV EAX,DWORD PTR DS:[EAX]
00567F63 8B80 E0020000 MOV EAX,DWORD PTR DS:[EAX+2E0]
00567F69 33D2 XOR EDX,EDX
00567F6B 8990 08010000 MOV DWORD PTR DS:[EAX+108],EDX
00567F71 8990 0C010000 MOV DWORD PTR DS:[EAX+10C],EDX
00567F77 A1 BCA95700 MOV EAX,DWORD PTR DS:[57A9BC]
00567F7C 8B00 MOV EAX,DWORD PTR DS:[EAX]
00567F7E 8B80 D4020000 MOV EAX,DWORD PTR DS:[EAX+2D4]
00567F84 33D2 XOR EDX,EDX
00567F86 E8 45E5ECFF CALL 复件_MSQ.004364D0
00567F8B A1 6C725800 MOV EAX,DWORD PTR DS:[58726C]
00567F90 8B50 0C MOV EDX,DWORD PTR DS:[EAX+C]
00567F93 A1 BCA95700 MOV EAX,DWORD PTR DS:[57A9BC]
00567F98 8B00 MOV EAX,DWORD PTR DS:[EAX]
00567F9A 8B80 E8020000 MOV EAX,DWORD PTR DS:[EAX+2E8]
00567FA0 E8 939EFFFF CALL 复件_MSQ.00561E38:[
00567FA5 8B87 A0040000 MOV EAX,DWORD PTR DS:[EDI+4A0]
00567FAB C740 0C 08000000 MOV DWORD PTR DS:[EAX+C],8
00567FB2 A1 BCA95700 MOV EAX,DWORD PTR DS:[57A9BC]
00567FB7 8B00 MOV EAX,DWORD PTR DS:[EAX]
00567FB9 8B10 MOV EDX,DWORD PTR DS:[EAX]
00567FBB FF92 D8000000 CALL DWORD PTR DS:[EDX+D8] ; 这里就出现了提示窗口
00567FC1 33C0 XOR EAX,EAX
00567FC3 5A POP EDX
00567FC4 59 POP ECX
00567FC5 59 POP ECX
00567FC6 64:8910 MOV DWORD PTR FS:[EAX],EDX
00567FC9 68 A2815600 PUSH 复件_MSQ.005681A2X]
00567FCE A1 BCA95700 MOV EAX,DWORD PTR DS:[57A9BC]
00567FD3 8B00 MOV EAX,DWORD PTR DS:[EAX]
00567FD5 E8 B2AFE9FF CALL 复件_MSQ.00402F8C:[
00567FDA C3 RETN
#####################################################################
我们把这处的指令:
00567EE1 A1 6C725800 MOV EAX,DWORD PTR DS:[58726C] ;重点:
00567EE6 8B40 0C MOV EAX,DWORD PTR DS:[EAX+C] ;取程序次数
00567EE9 83F8 1A CMP EAX,1A ;判断是否大于1A也就是十六进制的25
00567EEC 74 09 JE SHORT 复件_MSQ.00567EF7 ;相等就跳,跳就死定了。
00567EEE 83F8 1A CMP EAX,1A ;看是否小于25
00567EF1 0F8E C6010000 JLE 复件_MSQ.005680BD ;小于就跳,一定要跳,因为往下走,就出现提示窗口了。
改成这样子的,令程序运行次数永远是1 :
00567EE6 C740 0C 01000000 MOV DWORD PTR DS:[EAX+C],1
00567EED E9 CB010000 JMP 复件_MSQ.005680BDAX
00567EF2 90 NOP
00567EF3 90 NOP
00567EF4 90 NOP
00567EF5 90 NOP
00567EF6 90 NOP
接下来的事,不用我说了吧。如果你是一个脱壳高手,你可以脱了壳后直接改。如果不是,你只有写一个进程补丁了,因为这个软件加的壳还没有现成的脱壳机,只能手动脱壳!!!如果你是一个算法狂,你可以跟入
00567ED4 E8 53CAFFFF CALL 复件_MSQ.0056492C
这个CALL,来对日期的运算过程求逆。以写出最完美的无限日期破解文件。具体的破解文件可以参考我在论坛上发布的破解文件。下面我就给出日期运算的重点语句来:
程序在读出osk.cnt文件中的值后,进行下面的运算。
00460D37 46 INC ESI
00460D38 8D55 EF LEA EDX,DWORD PTR SS:[EBP-11]
00460D3B B9 01000000 MOV ECX,1
00460D40 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
00460D43 8B38 MOV EDI,DWORD PTR DS:[EAX]
00460D45 FF57 04 CALL DWORD PTR DS:[EDI+4]
00460D48 8A45 EF MOV AL,BYTE PTR SS:[EBP-11]
;取osk.cnt文件中值
00460D4B 0FB7D3 MOVZX EDX,BX
00460D4E C1EA 08 SHR EDX,8
00460D51 3055 EF XOR BYTE PTR SS:[EBP-11],DL
00460D54 25 FF000000 AND EAX,0FF
00460D59 66:03D8 ADD BX,AX
00460D5C 66:69C3 6FCA IMUL AX,BX,0CA6F
00460D61 66:05 8754 ADD AX,5487
00460D65 8BD8 MOV EBX,EAX
00460D67 8D55 EF LEA EDX,DWORD PTR SS:[EBP-11]
00460D6A B9 01000000 MOV ECX,1
00460D6F 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
00460D72 8B38 MOV EDI,DWORD PTR DS:[EAX]
00460D74 FF57 08 CALL DWORD PTR DS:[EDI+8]
00460D77 4E DEC ESI
00460D78 ^75 BE JNZ SHORT MSQingSh.00460D38
这个软件的试用版没有跳过提示窗口的跳转,我估计只有注册版才会拿掉提示窗口的程序代码。这只是我个人的意见。请指教!
总结;
1,用ollydbg脱aspr 1.22壳。
2,对有过期提示窗口的程序的破解。
3,对注册码存放位置或者软件运行次数存放位置的寻找步骤!!!