爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1140|回复: 8
收起左侧

[分享] SYMBIAN 平台的手机软件破解教程!

[复制链接]
发表于 2006-12-28 17:02:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册会员 微信登录

x
设备:
一个7650或3650或是其他S60手机
红外或者蓝牙连接


OK,开始!先在手机上安装CallCounter v1.1试用版(请下载附件),寻找存在的时间或功能限制。发现程序从后台调入前台时,会弹出一个对话框说有20天试用期并有时间延时,提醒你注册该软件就可以去除这个延时。再多看看,似乎没有别的功能限制。好,运行SeleQ,到c:\system\a pp\callcounter\下面找到.app文件,这是可执行文件,相当于PC中的.exe文件,通过红外或蓝牙传送到PC中,用IDA Pro打开。

确认一系列对话框后,在IDA View-A标签中就应该能看到程序的汇编代码了。不过对于这个软件,现在还看不到,你现在只能看到大量DCD 0x22004468模样的数据。。它是采用Thumb模式编译,一个命令占2个字节,IDA默认不能解码。在程序的开头处找到CODE32,点一下,然后按alt+g,弹出一个对话框Segment Register Value,在Value里面输入1,点OK。然后菜单项Options->General,点第二个标签Analysis,右下角有个按钮Reanalyse program,点一下开始对代码进行重新分析。一会儿,汇编代码就出来了。一般情况下不能将所有代码完全分析,你就得手工逐个的右击DCD 0x...等数据,选择undefine,然后重新进行Reanalyse program的工作,直到你能看清楚自己所感兴趣的代码为止。累吧?呵呵。

现在看右边偏上的框Names window,这里有非常重要的字符串,你会发现aYouHave,aDayLeft,aRegisterCallCo等与注册有关的字符串。双击aYouHave,代码框会立即跳到字符串所在的地方:

.text:10007C30 aYouHave unicode 0, <You have >,0 ; DATA XREF: .text:1000062C

右击参考连接DATA XREF,选择jump to cross reference,就能跳到调用这个字符串的代码,我们选择up方向的一个,又跳到了这里:

.text:1000062C off_1000062C DCD aYouHave ; DATA XREF: .text:10000602

再重复上面的步骤,jump to cross reference,跳到了真正调用字符串的代码:

.text:10000602 LDR R1, =aYouHave ; Load from Memory

LDR是load from memory的意思,从内存中读取这个字符串。在下面不远的地方,你会看到有多少天试用时间剩余的信息:

.text:10000620 LDR R1, =aDayLeft_ ; Load from Memory

这一堆的代码是未注册版本才会调用的,以提示用户还有多少天可用。要破解它,就必须跳过这些代码的执行。我们往上检查代码,注意左边红色的线条,这都是条件判断的转向,就是破解的关键。上面不远处我们发现了:

.text:100005C2 B loc_10000678 ; Branch

B就是无条件跳转,程序运行到这里,都会无条件转到loc_10000678处继续运行,右击loc_10000678,选择jump immediate,就能跳到该处,到这里一看,注意了没有,已经跳过了剩余多少天的提示信息代码的执行。如何让这个B得以执行呢?继续往上走:

.text:10000576 CMP R6, #0x13 ; Set cond. codes on Op1 - Op2
.text:10000578 BLE loc_100005C4 ; Branch

第一行是比较R6和16进制数13的大小,13h就是十进制的20,就是该软件的试用期限,BLE表示如果R6小于或等于20的时候,会跳转到loc_100005c4,就是说在试用期之内啦。我们到那儿看看,发现下面就是显示你还有多少天剩余的信息了, 不过这个跳转已经跳过了我们要找的B,所以,B执行的条件就是超过20天后,哈哈,原来我们刚才要找的B的执行结果却是软件过期的提示。。

那我们只好继续往上走了,想想,如果是已经注册版本,不就不会检查试用天数么?看来我们必须要它跳过比较R6和0x13的命令。同上面一样,不远的地方,我们找到了:

.text:1000054E LDR R0, [R0] ; Load from Memory
.text:10000550 CMP R0, #0 ; Set cond. codes on Op1 - Op2
.text:10000552 BEQ loc_10000556 ; Branch
.text:10000554 B loc_1000068A ; Branch

看来R0的值是个关键,如果R0等于0,就会按照BEQ的命令,去检查试用天数,如果R0不等于0,就B到loc_1000058A,跟过去看看,这段程序已经基本结束了。看来R0如果非0,就表示是注册版本。

好了,我们开始动手,把BEQ loc_10000556这段代码“注释”掉,用NOP命令填充,用鼠标点一下BEQ的位置,看看状态栏的显示000005CE,然后用UltraEdit打开callcounter.app文件,转到0x5CE位置,看两个字节:00 D0,这是BEQ loc_...这条命令的二进制表示。在ARM的thumb方式汇编中,NOP的二进制是C0 46,现在我们可以用c0 46来替换00 D0,修改后保存好,传到手机里,用新的.app替换旧的,运行,看一下结果!

替换的时候注意,先把后台运行的callcounter给shutdown掉。替换后重新运行,放到后台,再调到前台,哈哈,那个延时的对话框已经消失了!不过。。不要高兴太早,搞破解和开发一样,要拿出专业精神,多测试测试。好像没什么问题吧?不多菜单 里面还有个Register Now的选项,让人看着不舒服,也可能表示并没有完全破解哦。我们注意到上面的代码,R0的值是从一开始R0所在的内存地方取出来重新赋予的。所以我想,如果一开始就把那个地方写成非0,程序一启动的时候就认为是完全版,就没有register now菜单的出现和任何时间限制了。

好,重新来,继续看右边的Name window窗口,往下拉,找啊找,找啊找。。发现aThankYouForReg这个字符串很醒目,不是么?模仿上面的步骤,跳两次,就找到这些代码了:

.text:100030C0 CMP R0, #0x13 ; Set cond. codes on Op1 - Op2
.text:100030C2 BLE loc_100030D0 ; Branch
.text:100030C4 ADD R4, SP, #0x298 ; Rd = Op1 + Op2
.text:100030C6 LDR R1, =aThankYouForReg ; Load from Memory
.text:100030C8 B loc_100030D4 ; Branch

咦?又拿R0和20天比较?我们看看它能跳到哪里,一看,也是一个感谢注册的信息aThankYouForR_0,后面多了个0,哦,不过没什么差别,都是注册成功,只不过有一个提醒你重新启动手机。不管了,往上走,非常近的地方,关键来了。。

.text:1000309C ADD R0, R7, #0 ; Rd = Op1 + Op2
.text:1000309E MOV R1, SP ; Rd = Op2
.text:100030A0 BL sub_1000340C ; Branch with Link
.text:100030A4 CMP R0, #0 ; Set cond. codes on Op1 - Op2
.text:100030A6 BEQ loc_1000318C ; Branch
.text:100030A8 MOV R0, #0x90 ; Rd = Op2
.text:100030AA BL sub_100061A0 ; Branch with Link

看到了吗?判断R0是否为0,如果是0,就跳到loc_1000318C,如果非0,就显示注册成功的信息。这段代码肯定是尝试输入注册码之后执行的,在这里我们不想通过NOP掉BEQ这段代码来实现注册成功,因为我们并不想自己去输入注册码,而是想直接 修改内存中的信息来实现注册。所以,现在就必须看看sub_1000340C这个函数了,右击函数,选择jump immediately,就跳到这个函数了,往下拉,使劲拉啊,一般给R0赋值都在函数快结束的时候哦,好,就在这里:

.text:10003496 BNE loc_1000349A ; Branch
.text:10003498 MOV R1, #1 ; Rd = Op2
.text:1000349A
.text:1000349A loc_1000349A ; CODE XREF: sub_1000340C+8A
.text:1000349A CMP R1, #0 ; Set cond. codes on Op1 - Op2
.text:1000349C BNE loc_100034A2 ; Branch
.text:1000349E MOV R0, #0 ; Rd = Op2 <-------这里让R0=0
.text:100034A0 B loc_100034A4 ; Branch

.text:100034A2 loc_100034A2 ; CODE XREF: sub_1000340C+90
.text:100034A2 MOV R0, #1 ; Rd = Op2 <-------这里让R0=1
.text:100034A4
.text:100034A4 loc_100034A4 ; CODE XREF: sub_1000340C+94
.text:100034A4 ADD SP, SP, #0x160 ; Rd = Op1 + Op2
.text:100034A6 POP {R3} ; Pop registers
.text:100034A8 MOV R8, R3 ; Rd = Op2
.text:100034AA POP {R4-R7} ; Pop registers
.text:100034AC POP {R1} ; Pop registers
.text:100034AE BX R1 ; Branch to/from Thumb mode

看到了么,有个条件判断来决定给R0赋予什么值,0或者1,呵呵,我们所要的就是不管什么条件,R0都是为1,所以该修改什么,各位都知道了吧。。就是把:

.text:1000349E MOV R0, #0

修改为

.text:1000349E MOV R0, #1

好了,点一下这个命令,看看状态栏里的偏移值,是0000351A,操起ultraedit这把宝刀,跳到0x351A,找到对应的二进制为00 20,我们要做的只要修改00为01,指令就变成mov r0, #1了。保存,传到手机,哈哈,Register now菜单也消失了。嗯,这样破解比较完美。
 楼主| 发表于 2006-12-28 17:05:34 | 显示全部楼层
附件改日:(
回复 支持 反对

使用道具 举报

发表于 2007-1-1 16:47:03 | 显示全部楼层
:) :) :) :)
回复 支持 反对

使用道具 举报

发表于 2007-1-2 21:55:58 | 显示全部楼层
这个要顶。并且加入收藏
回复 支持 反对

使用道具 举报

发表于 2007-1-3 14:54:46 | 显示全部楼层
写入文件的命令是什么?
请问楼主知道吗?

就是说我想改变程序中写入的文件的路径,这样就可以把很多软件改成A盘版的了
回复 支持 反对

使用道具 举报

发表于 2007-1-4 00:07:30 | 显示全部楼层
楼主对诺基亚也有研究?
回复 支持 反对

使用道具 举报

发表于 2007-1-10 20:50:46 | 显示全部楼层
等全了再评分
回复 支持 反对

使用道具 举报

发表于 2007-2-22 14:44:15 | 显示全部楼层
高人,偶像
回复 支持 反对

使用道具 举报

发表于 2007-3-19 20:09:47 | 显示全部楼层
正在学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员 微信登录

本版积分规则

小黑屋|Archiver|手机版|爱技术 ( 沪ICP备08115260号-3 )

GMT+8, 2024-4-23 22:59

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表