能力值:
( LV2,RANK:10 )
2 楼
我没说明白,是ppc软件,论坛有这方面的帖子,转载别人的一篇教程吧
PPC程序破解教程初级教程ppc 2008-11-20 12:55:19 阅读185 评论0 字号:大中小
(** 注意:本文版权归德国原作者所有, 本文的目的是为中文读者介绍这篇文章。)
ida5.0破解版
da5.2破解版
如果你已经有过破解Windows软件的经验,再和PPC操作系统打交道就比较容易了。PPC掌上电脑(后面用PPC表示 “掌上电脑”)的中央处理器不同于普通的PC个人电脑,他们使用不同的运作指令集,比较常见的PPC中央处理器有StrongARM, Mips 和 SH3。不同的PPC处理器的指令集也不相同。本文只针对目前最流行的英特尔StrongARM处理器。
要做软件破解,先要选择好的破解工具。直到今天,都还没有一个基于PPC/WinCE平台专门的反编译调试器,我们只能利用个人电脑来做这些工作了。开工啦,我们这个实例比较简单,不要害怕。破解一个Windows软件和PPC/WinCE软件有什么不同呢?主要差异是…..通常破解PPC/WinCE软件要简单些。 :-)
我把IDA 5.2版 和十六进制编辑器HIEW作为本文破解的工具。
我们今天的破解目标是ScaryBear公司的GamePack Ⅰ and Ⅱ(在http://www.scarybearsoftware.com 下载或者从下面的帖子下载)。它包含了几种采用相同软件保护方法的游戏。里面有个游戏叫LINES v1.1,我们拿它开刀。首先把它在安装在你的PPC里,运行看看,找到Options的About, 你可以看到他的提示信息, 它显示这个软件只是试用版,并要求你输入注册码。当随意输入一个号码并按OK后,没有任何反应。
看看这个软件的README.TXT 说明文件:
NOTE: These games have a 14-day trial period, after which, you will need to purchase a Game Pack 2 reg code to permanently activate all 3 games. For more details, please visit: http://www.scarybearsoftware.com (本游戏已过14天试用期,若想永久使用,请购买注册码。网站上有更多细节,请查阅。)
我们把系统的时间更改到试用版过期日,再玩这个游戏,一个对话框显示出来,除非注册,游戏不能再玩了。
现在把这个游戏的执行文件拷贝到你的个人电脑里,运行前面提到的IDA工具。当IDA 问你处理器的种类(processor type)时,请选择ARM Processor: ARM. 然后它会要求一些库文件,这个例子指AYGSHELL.DLL, 从你的PPC拷过来就可以了。
回到IDA用shift+F4打开the names window搜索“a14DayTrialPeri”,这个字符串来自游戏软件过期后的提示版。
最后,你在这个位置找到“a14DayTrialPeri”:
.text:00011704 ; ---------------------------------------------------------------------------
.text:00011704 STMFD SP!, {R4-R6,LR}
.text:00011708 MOV R4, R3 ;
.text:0001170C BL sub_13578 ; <-- 用子程序检查是否注册
.text:00011710 CMP R0, #1 ; <-- is R0 = 1 ?
.text:00011714 BNE loc_11744 ; <-- 不相等?好
.text:00011718 BL sub_13964 ; <-- 你玩这婊子超过14天了吗??
.text:0001171C CMP R0, #1 ; <-- is R0 = 1?
.text:00011720 BNE loc_11744 ; <-- 不相等?好,游戏开始
.text:00011724 LDR R2, =aError ; ------------------------------------
.text:00011724 ; <-- 你没有注册,立即显示弱智的
.text:00011724 ; 过期提示版
.text:00011728 MOV R3, #0
.text:0001172C LDR R1, =a14DayTrialPeri
.text:00011730 MOV R0, #0
.text:00011734 BL MessageBoxW
.text:00011738 B loc_11840 ; <-- 跳到这个位置,不返回
.text:00011738 ; ---------------------------------------------------------------------------
.text:0001173C off_1173C DCD a14DayTrialPeri ; DATA XREF: .text:0001172C r
.text:0001173C ; \"14-Day Trial Period is over.\\nPlease vis\"...
.text:00011740 off_11740 DCD aError ; DATA XREF: .text:00011724 r
.text:00011740 ; \"Error\"
.text:00011744 ; ---------------------------------------------------------------------------
.text:00011744
请观察这一段
.text:00011718 BL sub_13964 ; <--你玩这婊子超过14天了吗??
.text:0001171C CMP R0, #1 ; <-- is R0 = 1?
.text:00011720 BNE loc_11744 ; <--不相等?好,游戏开始
★★★
在0001170C这一行里的BL调用一个子程序sub,用以检查你到底注册了没有,返回的结果被存在了R0。R0又和1作比较,如果R0不等于1,说明我们已经注册了这个游戏软件,那个弱智到期提示版就不会出现,可以继续玩。
现在我们只能把00011714这一行的BNE改为BEQ(或者B)。 NE表示不等于,EQ表示等于,我们把条件反过来,这样没有注册就变为已经注册了。
改了以后: 在0001170C这一行里的BL调用一个sub时,检查你到底注册了没有,返回的结果被存在了R0。R0又和1作比较,如果R0“等于”1,说明我们已经注册了这个游戏软件,那个弱智到期提示版就不会出现,可以继续玩。
但为了让这个游戏真的认为我们注册了它,我们应该重新考察一下sub_13578。研究了以后,我们发现这段子程序把一系列的错误的序列号带到同一位置:.text:00013680这一部分。
.text:00013578
.text:00013578 ; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||
.text:00013578
.text:00013578
.text:00013578 sub_13578 ; CODE XREF: .text:0001170C p
.text:00013578 ; .text:00011B4C p ...
.text:00013578 STMFD SP!, {R4,R5,LR}
.text:0001357C SUB SP, SP, #0xE0
.text:00013580 LDR R0, =aRegcode
.text:00013584 ADD R1, SP, #0x18
.text:00013588 BL sub_13BCC
.text:0001358C ADD R0, SP, #0x18
.text:00013590 BL wcslen
.text:00013594 CMP R0, #0xA
.text:00013598 BCC loc_13680 ; <-- WRONG KEY
.text:0001359C ADD R0, SP, #0x18
.text:000135A0 BL sub_1371C
.text:000135A4 MOVS R3, R0
.text:000135A8 BNE loc_13680 ; <-- WRONG KEY
.text:000135AC LDRH R3, [SP,#0x26]
.text:000135B0 MOV R4, #0
.text:000135B4 LDR R1, =aD
.text:000135B8 ADD R2, SP, #0x14
.text:000135BC ADD R0, SP, #0
.text:000135C0 STRH R3, [SP]
.text:000135C4 STRH R4, [SP,#2]
.text:000135C8 BL swscanf
.text:000135CC ADD R2, SP, #4
.text:000135D0 LDRH R3, [SP,#0x1E]
.text:000135D4 ADD R0, SP, #0
.text:000135D8 LDR R1, =aD_0
.text:000135DC STRH R3, [SP]
.text:000135E0 STRH R4, [SP,#2]
.text:000135E4 BL swscanf
.text:000135E8 ADD R2, SP, #8
.text:000135EC LDRH R3, [SP,#0x1C]
.text:000135F0 ADD R0, SP, #0
.text:000135F4 LDR R1, =aD_1
.text:000135F8 STRH R3, [SP]
.text:000135FC STRH R4, [SP,#2]
.text:00013600 BL swscanf
.text:00013604 ADD R2, SP, #0xC
.text:00013608 LDRH R3, [SP,#0x2A]
.text:0001360C ADD R0, SP, #0
.text:00013610 LDR R1, =aD_2
.text:00013614 STRH R3, [SP]
.text:00013618 STRH R4, [SP,#2]
.text:0001361C BL swscanf
.text:00013620 ADD R0, SP, #0x18
.text:00013624 BL sub_136A4
.text:00013628 LDRH R3, [SP,#0x2C]
.text:0001362C ADD R2, SP, #0x10
.text:00013630 MOV R5, R0
.text:00013634 LDR R1, =aD_3
.text:00013638 STRH R3, [SP,#0x18]
.text:0001363C ADD R0, SP, #0x18
.text:00013640 LDRH R3, [SP,#0x2E]
.text:00013644 STRH R4, [SP,#0x1C]
.text:00013648 STRH R3, [SP,#0x1A]
.text:0001364C BL swscanf
.text:00013650 LDR R3, [SP,#0x14]
.text:00013654 LDR R2, [SP,#0xC]
.text:00013658 CMP R3, R2
.text:0001365C BNE loc_13680 ; <-- WRONG KEY
.text:00013660 LDR R3, [SP,#4]
.text:00013664 LDR R2, [SP,#8]
.text:00013668 CMP R2, R3
.text:0001366C BNE loc_13680
.text:00013670 LDR R3, [SP,#0x10]
.text:00013674 MOV R0, #0 ; R0 = 0 你注册了
.text:00013678 CMP R5, R3
.text:0001367C BEQ loc_13684 ; <-- 呀,你的序列号是有效的
.text:00013680
.text:00013680 loc_13680 ; CODE XREF: sub_13578+20 j
.text:00013680 ; sub_13578+30 j ...
.text:00013680 MOV R0, #1 ; R0 = 1 你没有注册!
.text:00013684
.text:00013684 loc_13684 ; CODE XREF: sub_13578+104 j
.text:00013684 ADD SP, SP, #0xE0
.text:00013688 LDMFD SP!, {R4,R5,PC}
.text:00013688 ; End of function sub_13578
.text:00013688
观察这一行:
.text:00013680 MOV R0, #1 ; R0 = 1你没有注册!
要让程序认为我们使用了正确序列号的最简方法就是改变这行.text:00013680 MOV R0, #1
为.text:00013680 MOV R0, #0。
为什么这样改?因为这个程序会检查R0是不是等于1。显然,如果它等于1,游戏软件程序就知道它没有被注册。
现在到了把我们等候很久的十六进制编辑器HIEW押上床的时候了,更改PPC软件的代码要比windows软件难,那是因为我们不能简单地使用HIEW提供的PC汇编assembly-view。你需要知道指令集。(指令集参考见后面参考,市面上也有卖)
MOV (reg,values) xxxxA0E3
Mov R1,#0 0010A0E3
Mov R0,#1 0100A0E3
进入HIEW, 读入游戏程序\'lines.exe\', 找到下面这一段:
text:00013680 - 01 00 A0 E3 E0 D0 E2-30 80 BD E8 38 64 01 00
每个StrongARM精简型指令都包含4个字节,我们要修改的是:
01 00 A0 E3 (代表MOV R0, #1)
修改为
00 00 A0 E3 (代表MOV R0, #0)
把修改好的文件传回你的PPC, 覆盖掉原来的文件。(注意要完全退出这个游戏,覆盖才能成功)
祝你一次成功!
覆盖后,你再运行这个游戏软件看看,是不是破解成功了?
思考题:
本文“★★★”符号处提到“现在我们把00011714这一行的BNE改为BEQ,使条件反过来,这样没有注册就变为已经注册了。”
请问为什么不能直接改这里,完成软件的破解,而主张“为了让这个游戏真的认为我们注册了它,我们应该进一步考察….”?
本文到此为止,如果读者喜欢,今后还会编译更多的PPC/WinCE平台开发入门资料。
(** 注意:本文版权归德国原作者所有, 本文的目的是为中文读者介绍这篇文章。)