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虚拟机自动化脱壳的方法