首页 > 学院 > 手机玩家 > 正文

6688经验半月谈

2024-06-08 15:03:07
字体:
来源:转载
供稿:网友
买了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:
OffsetSize Description
---------------------------------------------------------
00BYTE Record starting marker [00,F0,FC] 记录标志为00,F0或FC
00= Unused block? 不用的Block
F0= Deleted block?删除的Block
FC= Used block? 当前有效的Block
01BYTE Version. [00..05]
Always zero in LBA_FS & EE_FS blocks. EE_FS在Flash中
Only EELITE blocks that has 04 & 05.
02Word Size
04DWORDLinear address of data 此处为Flash地址
08WORD ID 为平常说的BlockXX,如Block67
0ABYTE ??? [00,01,02]
Always zero in EEFULL & EELITE blocks.
Always 02 in LBA_FS & EE_FS blocks.
0BBYTE 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 00Block地址,为Flash地址00FFF974H,转换为文件地址为FFF974H - A00000H = 5FF974
47 00Block 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
RHWORDFLWORD=FHWORD*4000HFLWORD - 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
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选