首页
社区
课程
招聘
手机软件破解
发表于: 2010-5-30 16:38 8386

手机软件破解

2010-5-30 16:38
8386
我有一款手机软件,行业软件,计算类,绿色版,请教如何调试,od调试不了
请教

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 201
活跃值: (11)
能力值: ( 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平台开发入门资料。

(** 注意:本文版权归德国原作者所有, 本文的目的是为中文读者介绍这篇文章。)
2010-5-30 21:07
0
雪    币: 276
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
IDA配合手机模拟器就可以了。
2010-5-31 08:34
0
游客
登录 | 注册 方可回帖
返回
//