首页
社区
课程
招聘
[原创]发个ARM指令集的Crack过程
2007-7-6 16:15 30850

[原创]发个ARM指令集的Crack过程

2007-7-6 16:15
30850
ARM指令集大家应该都或多或少有点印象吧.
就是目前诺基亚等大部分手机厂商使用的指令集,构架在该结构上的称为Symbian操作系统.
比如QD/7610/N70/N95/E50.....

其中Symbian根据操作系统又细分成
Symbian OS 6.x
Symbian OS 7.x
Symbian OS 8.x
Symbian OS 9.x

根据界面分为UIQ2.0 3.0
Seires 60 1st  2nd  3rd
Seires 80

考虑到如今大部分的手机是Seires 60 2nd的,我今天就献丑一下.叙述下如何Crack一个Symbian OS的程序.

首先扫个盲.
ARM汇编程序由机器指令\伪指令(符号,数据定义) 和宏指令组成.
基本的指令格式:  <opcode>{<cond>}{S}  <Rd>,<Rn>('<opcode2>}
opcode   指令的助记符,  LDR .STR
cond        执行条件  
S             是否影响 CPSR寄存器的值?   有则为TRUN 没有则 FALSE
Rd           目标寄存器
Rn           第一个操作数的寄存器
opcode2  第二个操作数

由于CPU的核心频率的限制,Symbian 的开发人员都尽量避免浮点运算.

Symbian 开发语言有 VS 2003(C++) ,CARBIDE C++, VB , CARBIDE J. JAVA, Pthoy.
编译完成的主程序是.app,在3RD上是.exe  ,其中安装文件是SIS

好了,下面开始Crack一个Symbian 程序的过程

程序名称:colorpicker v1.00
使用工具: Ida Pro  5.0     HEX计算器

新建一个工程. 选择PDAs/Handhelds/Phones
然后选择.sis Symbian EPOC installation File.载入刚才那个SIS文件

分析完毕后.我们开始研究.

首先我们需要知道程序什么时候要求注册,Symbian程序注册的原理很简单,就是通过安装手机的串号,就是imei,也就是你在手机上拨*#06#之后产生的代码.
而程序在做注册前必须读取这个数值,于是需要命令GetMachineIdL

在汇编中搜索该单词.

.text:10000D98                 BL      PlpVariant::GetMachineIdL(TBuf<128> &)

此处获取了手机的串号

之后的代码:
.text:10000D98                 BL      PlpVariant::GetMachineIdL(TBuf<128> &)
.text:10000D98
.text:10000D9C                 ADD     R0, R4, #0
.text:10000D9E                 MOV     R1, SP
.text:10000DA0                 BL      TDes16::Copy(TDesC16 const &)
.text:10000DA0
.text:10000DA4                 ADD     SP, SP, #0x108
.text:10000DA6                 POP     {R4}
.text:10000DA8                 POP     {R0}
.text:10000DAA                 BX      R0
.text:10000DAA
.text:10000DAA ; End of function sub_10000D88

注意,从.text:10000DC2这开始


.text:10000DC2                 MOV     R5, #0         //R5移动为0
.text:10000DC4                 MOV     R6, #0         //R6 0
.text:10000DC6                 MOV     R7, #0         //R7 0
.text:10000DC6
.text:10000DC8
.text:10000DC8 loc_10000DC8                            ; CODE XREF: sub_10000DAC+3Ej
.text:10000DC8                 SUB     R0, R7, #5      //R0=R7-5
.text:10000DCA                 CMP     R0, #4
.text:10000DCC                 BLS     loc_10000DE6       //如果R0比4小.JMP到10000DE6
.text:10000DCC
.text:10000DCE                 MOV     R0, SP              //R0 指针(IMEI的位置)
.text:10000DD0                 ADD     R1, R7, #0
.text:10000DD2                 BL      TDesC16::AtC(int)   // 获取ASCII代码
.text:10000DD2
.text:10000DD6                 LDRH    R0, [R0]             //载入R0的值
.text:10000DD8                 CMP     R7, #0
.text:10000DDA                 BEQ     loc_10000DE0
.text:10000DDA
.text:10000DDC                 LDR     R4, =0x30B
.text:10000DDE                 ADD     R5, R5, R4             //R5=R5+R4
.text:10000DDE
.text:10000DE0
.text:10000DE0 loc_10000DE0                            ; CODE XREF: sub_10000DAC+2Ej
.text:10000DE0                 LSL     R0, R0, #1             //+2
.text:10000DE2                 ADD     R0, R6, R0             //R0 = R6 + R0 = 0 + R0
.text:10000DE4                 ADD     R5, R5, R0             //R5 = R5 + R0
.text:10000DE4
.text:10000DE6
.text:10000DE6 loc_10000DE6                            ; CODE XREF: sub_10000DAC+20j
.text:10000DE6                 ADD     R7, #1                  //R7 = R7 + 1
.text:10000DE8                 CMP     R7, #0xE
.text:10000DEA                 BLE     loc_10000DC8      //如果R7小于E ,JMP到10000DC8
.text:10000DEA
.text:10000DEC                 ADD     R0, R5, #0          //R0 = R5 + 0

通过上面的代码,我们可以找到这么几个规律:
1.每次循环R7会+1
2.在10000DC8处 R0 移到 R7 - 5

这里R0~R7是IMEI中的数字

这时候用任意一个HEX计算器
在第一次循环时,(10000DD6)处,假设读取到的第一个IMEI是3,3的ASCII码为33,之后R7根据条件跳转到10000DE0,R0此时值为66,R5为66
第二次循环,5, R0=35,根据R7的判断,R4=30B.R5=66+30B=371,之后R0的值要加在R5上,R5=3DB
...................

之后你转换完成R5的值,既可以完成注册

此为算法

如果想制作一个随意数字完成注册的.就需要修改
注意这里:
.text:10000DEC                 ADD     R0, R5, #0      ---> R0 = R5 + 0
如果修改成:
.text:10000DEC                 MOV     R0, #0
那么此时0为正确的注册码

如果改成:
.text:10000DEC                 MOV     R0, #1
那么此时1为正确的注册码
............................

完毕.

自我介绍一下,黑手K9998.         QQ35333120 MAIL:K9998@foxmail.com
目前从事Symbian的开发,是搞汉化的 ...
因为被BT壳所困 ....所以过来参考.........

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
  • 1.JPG (64.92kb,2358次下载)
收藏
点赞7
打赏
分享
最新回复 (34)
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
foxabu 13 2007-7-6 17:17
2
0
大多数也用于 WindowsMobile 操作系统
最初也用于WindowsMobile哈:)
雪    币: 207
活跃值: (20)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
黑手K 1 2007-7-6 17:53
3
0
正解,最初的手机破解始于PDA
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hiberhe 2007-7-7 06:53
4
0
上面关于ARM指令集的表述不是太准确.ARM是ARM公司的CPU核的指令集(具体又分ARM指令,THUMB指令,THUMB-2指令),ARM以其低功耗高性能应用越来越广,现在Cortex3又将触角伸向了8位MCU市场.好像现在蛮多的手机都在向ARM核,像TI的OMAP好像就是ARM+DSP.

了解ARM指令集及使用的具体ARM芯片,破解基于ARM指令集的程序应试还是比较简单的,至少会比X86上简单很多,毕竟嵌入式不可能像PC上那么复杂(至少目前为止),没太多防破解的技术.

基本上ARM这类破解都是基于静态分析吧,当然也可以用Realview,ADS之类调试,不过发觉调试之类程序远没PC上直观.我没分析过基于OS的,不知道是不是会简单些.前不久分析一个Firmware发现,要对ARM的程序进行很好的反编译比X86复杂,特别是ARM和THUMB混用的时候,还有就是B指令的"滥用",再加上文字池,很是费解.

我对x86汇编远没ARM汇编熟悉,甚至连X86的好多指令都不了解,但是用IDA反编译C/C++写的DLL时,基于上都能读得懂.但是用IDA反汇编一个ARM固件程序时,发觉蛮吃力的.主要是它是ARM和THUMB混用,再加上是"裸"的,不像基于OS的,有调用和执行规则,很多地方IDA都识别不出来.当时主要是基于硬件的特征来定位,如芯片的寄存器,中断向量等,一小段一小段的定位.

也有可能我对IDA还不熟悉(毕竟是为了分析一个程序,临时才学习用的,之前基本没破解方面的技能),不知道用IDA分析ARM的程序有什么技巧呢?看IDA的网站好像5.1对ARM的支持有加强,可是找不到可用的.
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
foxabu 13 2007-7-7 09:36
5
0
如果调试PDA的程序还是挂到VS中动态调试好点。奥:)
不过调试OS就不清楚了   不知道有没有模拟器可以用。
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hiberhe 2007-7-7 14:45
6
0
我是做嵌入式的,不过用的一般是ARM7的片子,不是PDA或手机这类.有时想反汇编看看编译的库,或者RTOS的库,感觉IDA在反的时候,不如其对Win32程序那么强.
雪    币: 1767
活跃值: (751)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
yijun8354 12 2007-7-8 14:14
7
0
开哈眼界~~
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xyer 2007-7-9 10:13
8
0
感谢楼主,我正在学ollydbg
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhucheba 2007-7-9 13:05
9
0
学习,好资料
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sober 2007-7-17 16:10
10
0
如果程序是带调试信息的,感觉用ADS本身自带的反编译工具会更准确,IDA反而不如它。
雪    币: 255
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
孤行有你 2007-8-9 16:11
11
0
我搞单片机的
也来支持一下!
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gdwz 2007-8-15 02:13
12
0
RAM。我也是刚刚接触
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
steelc 2007-8-15 07:19
13
0
不明白,这些都是哪个系统的指令?Windows? WinCE? MCU?
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hiberhe 2007-8-15 08:44
14
0
ARM呀,怎么指令扯到Windows,WinCE了? 这是ARM公司的微控制器ARM的指令,在嵌入式中用得比较多的,手机中很多也用ARM.
雪    币: 109
活跃值: (383)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
cater 5 2007-8-16 02:10
15
0
终于你到这里发帖啦?
嘿嘿,身为南京的老兄表示happy
透露下BiNpDa进了目啊?
我s60 2nd的打过两个感觉比
s60 3rd的要简单许多,
本来我也想开发个s60.v2的逆向分析地,
可惜感觉太简单了就木发了。
s60.v2的关键api就是getmachineidl这个涵数,
用于获取手机串码imei滴,由于手机权限问题软件劫获硬件指纹大多都是串码
因此逆向分析的时候一般抓这里。

嘿嘿,k兄放个s60.v3的教程吧…
还有,有空在看雪发个完整的crack教程啦。
从解包,破解,汉化,打包的,图文要并貌哦!
雪    币: 260
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kalahan 2007-12-27 22:59
16
0
支持黑手~~努力前进
我也汉化~~
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
soyuz 2008-1-1 17:48
17
0
x86可以很方便的动态调试,arm等就比较麻烦些了,需要对芯片本身配置比较熟悉(包括具体平台的外围器件)
前段时间在反汇编摩托罗拉某个型号的DSP芯片的程序,才60K的代码,反汇编出来2万多行,花了两个月的业余时间才算基本搞明白...
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bcbin 2008-1-1 20:56
18
0
收下看看
雪    币: 260
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kalahan 2008-4-4 23:40
19
0
学习下
打包?
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
眠的森林 2008-4-18 22:50
20
0
就逆向调试来说,S60手机没啥好玩,很乏味

Windows Mobile手机系统已经可以很好的进行ARM动态调试了,这导致WM系统的逆向可以和PC机的软件相姘美

Windows Mobile的逆向发展很快,现在用于破解已经是极其简单的初级应用,用于直接修改二进制代码,修改程序,增加功能,在不同的WINDOWS MOBILE系统间移植程序(二进制代码移植)
雪    币: 89
活跃值: (159)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxhaishixx 2008-4-19 17:25
21
0
强!其他什么也不说了!
雪    币: 276
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kwzlj 2008-4-22 16:02
22
0
相对来说手机上的程序加密都比较简单,加壳也一般用的UPX,很多程序注册码正确的话,直接返回一个数据1,不正确就返回0,Crack起来比较简单,当然要做注册机就必须要弄清楚算法了,目前遇到一个应用加密比较成功的程序,至今没有办法Crack,用了微软的Crypto API加密,关键代码被加密了,必须要作者提供的授权文件才能正确将加密的代码解密,不知有没有懂ARM的高手可以试试,一个Microsoft Mobile上的程序,软件在这:http://www.enjoysoft.cn/
雪    币: 261
活跃值: (78)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
hacker一疒亻 2008-7-25 10:54
23
0
不理解呢  你们这么做了之后  能有什么效果呢  手机是中毒了 还是不能使用了  还是功能更多了?  不懂
雪    币: 315
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
antime 2008-7-25 14:28
24
0
现在连 Arm 也不放过了,天降大任于此人也
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
mstwugui 6 2008-7-25 15:15
25
0
x86也好arm也好,逆向工程不是只能用来破解的,学汇编怎么奔着这个方向跑,哎
游客
登录 | 注册 方可回帖
返回