买了6688已经半个月多。我买到小八的时候,正是6688一改以往的平静,进入一个风起云涌的时刻,或者说是末日的辉煌!(小八还是有“硬”伤的)
首先是6688系列大幅降价,高高在上的价格跌到了一个让普通大众(包括我)都可以接受的地步。其次,SL456688i参考了国外的修改后,在自己的努力下,让这些修改可以应用在中文5508版下,然后更多的国外网站展现在大家的周围,一下眼界扩展到那么大,简直让人马上都难以适应。看看以前的论坛,不由得感觉自己仿佛是井底之蛙。
在这种环境下,以我的本性自然也坐不住了,于是参加到对小八的改造当中,在这个过程中,我看到了许多的国外网站,在感受技术上的差距的同时,也学到了很多的知识,并在实验当中得到宝贵的经验,下面,我就把这些奉献给大家(再不写这个就是学习报告了^_^),它主要来自于看国外高手的讨论,向SL456688i请教的和我自己摸索得来的,是从一个程序员的角度出发,并希望能起到抛砖引玉的作用。
在正文开始之前,先说一下文件地址和Flash地址的关系。所谓文件地址就是导出的FULLFW文件的地址,而Flash地址是西门子软件在Flash内部使用的地址,如函数调用和Block地址等都是用的Flash地址。其表达式如下:
Flash地址 = 1000000H - FULLFW_SIZE + 文件地址
注:其中FULLFW_SIZE为Flash+EEP的大小,6688为600000H。十六进制一律在后面放H。
一、关于EEP及相关部分。
1、EEP的存储结构:
EEP是按块Block存储的。这个大家应该都看到过一些,比如修改电压的Block67,和线路选择及飞机相关的Block71等。而EEP由主要分为两部分:EEFULL和EELITE。EEFULL主要是和机器软件的相关配置有关的内容,而EELITE更多的是和设备信息有关的内容(这些是我的理解)。从EEP中寻找Block是通过索引的,这样做有很大的好处,会编程的人都知道,链表比数组有更大的灵活性。EEP也是这样,如果Block的大小和结构发生变化,不会影响到其他的Block。在EEP中有6个EEFILL区和一个EELITE区,每个是2000H字节。开始地址分别是0000H,2000H到A000H。而从C000H到FFFFH是EELITE。每个区的索引都放在最后面,每条记录12个字节。数据结构如下:
EEPROM Block Directory Record format:
OffsetSize Description
---------------------------------------------------------
00BYTE Record starting marker [00,F0,FC] 记录标志为00,F0或FC
00= Unused block? 不用的Block
F0= Deleted block?删除的Block
FC= Used block? 当前有效的Block
01BYTE Version. [00..05]
Always zero in LBA_FS & EE_FS blocks. EE_FS在Flash中
Only EELITE blocks that has 04 & 05.
02WORD Size
04DWORDLinear address of data 此处为Flash地址
08WORD ID 为平常说的BlockXX,如Block67
0ABYTE ??? [00,01,02]
Always zero in EEFULL & EELITE blocks.
Always 02 in LBA_FS & EE_FS blocks.
0BBYTE Record ending marker [00,F0,FC,FF]
FF= No more record
注:此资料来自于SL456688i
现举例如下:Block71
FC 01 C8 00 74 F9 FF 00 47 00 00 FC
FC 开始标志,当前有效
01 版本
C8 00文件大小00C8H = 200
74 F9 FF 00Block地址,为Flash地址00FFF974H,转换为文件地址为FFF974H - A00000H = 5FF974
47 00Block ID 0047H , 0047H = 71
00 在EELITE 中为 0
FC结束标志。
2、目前我知道的有意义的Block如下。
0043H: 电池相关
0047H: 线路设定和飞机检查(可能只与第一个字节有关)
138FH: 对比度
1391H: IMEI Block 00
004CH: IMEI Block 01
1390H: IMEI Block 02
13D5H: IMEI Block 03 含有这四个Block的文件就是Map文件,Map问题我会在写一篇。
Battery status (0043):
- 0000H : BattMin Data1
- 0002H : BattMin Data2
- 0004H : BattMax Data1
- 0006H : BattMax Data2
- 0008H : BattTemp Data1
- 000AH : BattTemp Data2
- 000CH : EnvTemp Data1
- 000EH : EnvTemp Data2
- 0010H : VCXOTemp Data1
- 0012H : VCXOTemp Data2
注:以上来自于RizaPN
另外还有1394H:电池序列号和标称电压(见SL45668i的帖子)
1389H - 13ABH 的36中的24个和Java激活有关(部分有效)
二、Flash(软件)及其相关问题。
1、Flash中的数据:
Flash中的数据主要是指图片、铃声和字体Fonts,他们也是通过索引存储的。
铃声的是每条记录八个字节,有用的是地址和索引号。在中文5508版里这个索引在44E526H处
图片的是每条记录八个字节,前面两个是大小,用如下表示width * hight。中间是01 00
最后是地址,5508的索引在500000H处。
字体的我没有看
有一个需要注意的是,这些索引记录里的地址到Flash地址的转换关系为:
索引地址 Flash地址File地址
RLWORD FLWORD=RLWORD FLWORD
RHWORDFLWORD=FHWORD*4000HFLWORD - 00A0H
File_ADDRESS = ( RHWORD * 4000H + RLWORD)- 00A0
例如5508的第一条图片记录 04 04 01 00 FA 3F A1 03
为4 x 4 的图片,Flash地址为 E87FFAH 文件地址为 487FFAH
用RizaPN的软件FFMod可以处理铃声,即把你的铃声导入到Flash中代替系统铃声,他本来也可以处理图片和Fonts,但是用在中文版上好像不能找到索引,不能处理图片。
我目前正在写一个处理图片的程序,用来导出和导入Flash中的图片,比如更改开关机图片(112 -137)。
2、Flash的程序修改:
这到了关键的地方了,前面所有的东西都是数据方面的,而现在要修改程序的流程,是真正个性化6688,增加他的功能的地方。
这个我刚开始做,其实主要的任务是寻找常用函数的入口地址和函数标示符,所有的修改都基于这些,他就相当于系统提供你的API,当然西门子不愿意给你,如果在C的基础上更改这些是易如反掌,但反汇编后在做就难度很大了,而且不像PC机一样,可以动态调试,所以只能看静态的代码。但幸好RizaPN已经做了非常多的工作,虽然是在56上,当并不是所有的模块都更改了,所以,对照与56版的FLASH,相当于RizaPN已经给我们做了一个内容相当多的注释,所以说,我们已经站在了巨人的肩膀上。简单的东西可以直接比对两个版本,找到相同的地址,然后修改即可,但重要的反复的实验,找到尽可能多的函数地址和ID。这是做一切修改的基础。下午时,我对照于RizaPN的修改,更改了55版的#键。这里做一个注解给大家:
RizaPN做的修改:
Modify #[UpperRight] from "View New CB" to "Java"
It will keep the ability to use # button to view the flash message when it is there...
If you already apply this patch with the old values, don't forget to reset all data to the original ones
0x3B31AC : 7D 03 -> B0 0D ...
0x3B3398 : DA D9 1A 49 -> DA D8 B4 E1 ... (see table)
我们就先找到这个#键在5508所对应的地方,看DA D9 1A 49反汇编后就是CALL D9491A 而对应的文件地址是
CALL 39491A,我们在56中找到这个地方,拷贝一定数量的字节,然后在5508中寻找相同的部分,我找到两处,在去除跳跃地址的影响,和对后面的比对,找到一处在3C7F4。然后搜索DAD3F4C7,找到一处0x3634a6。比对和56其他部分,发现相同。因为除调用地址不同,其他指令应该相同。认定这就是5508中#键的处理。在根据和56中相同的偏移量找到表示符15 04(0415),然后从SL456688i的修改中,找到收件箱的地址和标示。分别为DAD360A0:38 01 把此值放于对因位置。写入开机,发现#的功能已变为收件箱。当然这是很幸运的,估计更多的时候是错误,因为这里有很多的猜测和运气。但这是一种方法,你可以用这个来测试其他的函数入口。因为Crack本来就需要很多的猜测和运气。比如我看到"读C"得下一个地址DAD15A06 (31065A),放进去,发现是用户群组。
好了,很累了,就先写这些吧!另外我发现写MAP只是写了上面的四个Block,根本不必非的在98下写,我会在写一篇关于如何写MAP的。
本来还向介绍一下西门子的函数库Bfb95eg.dll的一些内容,这个库是很重要的,有很多的软件用它来和手机进行通讯,它可以把启动代码载入到手机上执行,读写一些块更是小意思。国外的一些网站对它研究很深,他们把它反汇编了,然后再还原成Dephi代码。他对写和西门子的手机通讯程序很有用,比如你想写一个修改手机某些 Block的程序。如下供参考。
Function WmobileOn(MobHandle : TmobHandle; Baud : DWord) : Dword; cdecl; external "BFB95EG.DLL"
Disassembled function fith some my coments:
Code:
.text:10011670 ; Exported entry 211. WMobileOn
.text:10011670
.text:10011670 ; --------------- S U B R O U T I N E ------------------------------------
.text:10011670
.text:10011670 ; Attributes: bp-based frame
.text:10011670
.text:10011670 public WMobileOn
.text:10011670 WMobileOn proc near
.text:10011670
.text:10011670 BaudRate = dword ptr -4
.text:10011670 MobHandle = dword ptr 8
.text:10011670
.text:10011670 push ebp
.text:10011671 mov ebp, esp
.text:10011673 push ecx
.text:10011674 lea eax, [ebp+BaudRate] ; LOAD Effective Address
.text:10011677 push eax
.text:10011678 mov ecx, [ebp+MobHandle]
.text:1001167B push ecx
Get Com port Baud rate Code:
.text:1001167C call WGetComConfiguration ; Call Procedure
.text:10011681 add esp, 8 ; Add
.text:10011684 test eax, eax ; Logical Compare
.text:10011686 jnz short Configure_ComPort ; Jump if Not Zero (ZF=0)
If Success then jump to configure Com port, else jump to ErrorRet label Code:
.text:10011688 xor eax, eax ; Logical Exclusive OR
.text:1001168A jmp ErrorRet ; Jump