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:
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