補丁基礎教程
可能是 2128的壇子起步比較晚的緣故,現在有很多機油對補丁這個東西覺得很難搞明白,特別是一些需要自己diy的補丁,看到那些代碼就暈了(我剛開始也是這樣的^_^那個暈哦…)。其實想把每個補丁的意思搞明白很簡單,應用補丁更是簡單,所以寫了這篇文章送給小2壇子上的所有機油,2128也好,3118也好,A55也好,不管你用的什么機器,不會用補丁的,不理解補丁原理的,耐心看下去吧。
先說刷補丁的工具,是V_klay。但是由于V_klay的用法以前的機油已經講過很多次了,教程也有好幾篇,我在這里也不打算再費勁去寫他,大家可以看看相關的文章,這里推薦RainMoon的《 詳解 V-Klay》 這篇,已經詳細得不能再詳細了。
為了完全迎合新人的需要,在這篇文章里我盡量甩掉生澀的專業詞匯,拋開復雜的匯編程序,只講最基本的原理和應用。老鳥請不要笑哦 ^_^ 這里面也有我這半年來的成長過程中的真實體會和慢慢摸爬滾打積累的一些經驗,希望對大家有用。
第一節 補丁的基礎知識
我跟周圍的人說到“補丁”的這個詞的時候,他們大多數的反映是“補丁是什么?有什么用??手機也要打補丁么?”,其實在這個論壇上懷有這個疑問的應該也有吧,那我們先來說一下什么是補丁。
很難給補丁下一個完整的定義,什么是補丁?我想:
改善手機功能,使我們的愛機能夠更好的為我們服務的代碼段就可以稱之為“補丁”。
可能有的人會問,那些代碼是表示什么意思呢?怎么使用這些呢?這個就是對 V_klay的格式搞不清楚了,我們先從一個簡單的例子來講解一些相關的知識。
例 1:2128的#鍵快捷方式的修改
說明: #鍵加右軟鍵由“讀小區廣播”到“未接來電”
4a77f0:7502 a400;字串ID
這個可以說是一個標準的補丁,先來說一說他的結構:
例如在這個補丁中的第二行是 4a7c50 : DAc110cf DAcaf49d ;函數 ,這一行的結構 分為以下四個部分:
①: 4a7c50 : 要寫入補丁的地址, 說明補丁要修改的地方是在手機內存的 4a7c50這個位置,相當于手機內存單元的門牌號碼,以冒號結束,這是固定的格式。
②: DAc110cf 舊數據,相當于以前在 4a7c50這個屋里住的良好市民。
③: DAcaf49d 新數據,相當于把 dac110cf趕出家門自己住進去的恐怖分子。 ^_^
④:大家一定注意到了補丁代碼的后面常常跟有文字,這些也是補丁所必須的么?當然不是! ";"(英文的分號) 后面是注釋的內容,是為了說明補丁的作用,對補丁的功能是沒有影響的。
再來解釋一下這個補丁的功能是如何實現的 :這個補丁的意思是要實現把待機時的 #鍵的功能由原來的“讀小區廣播”變成“未接來電”。
大家可能注意到了,在每個功能函數前都有 DA這兩個字母,他的意思就是call,意思是叫他后面跟的這個地址上的函數出來工作。
所謂函數入口地址,也就是 c110cf和caf49d,也是手機內存里的門牌號碼,分別住的是實現“讀小區廣播”和“未接來電”這個功能的程序模塊。為什么是的,我們不管它,好用就行。
當 V_klay執行完“4a7c50:dac110cf daCAF49d”這一句之后,我們手機上的#鍵的功能就已經變成“未接來電”了,但是當你按下#鍵,你會發現在右軟鍵上的還是 “讀 CB”這幾個字。所以需要找到這幾個字住的地方,把他們趕出去,換上“未接來電”這幾個字住進去。
在這個補丁里: 7502表示的就是在屏幕上顯示“ 讀 CB ”這幾個字,而 4a77f0就是“ 讀 CB” 在手機內存里的地址, a400則表示恐怖分子啦 ^_^
這個補丁可以按自己的需要定制,只需要你把新數據的函數入口地址和字串 ID換成你需要的功能,相關的函數地址和字串可以看“2128補丁匯總”。比如下面這個就是把#鍵換成”轉移設定”。
4a77f0:7502 f001;字串ID
4a7c50:DAc110cf DAcaced3;函數
看到這里,你是不是已經有點明白了?補丁還有一種常見格式,我舉下面這個例子說明
例 2:3118的 直接發送免提短信
;作者:RizaPN & coollang
;適用:3118V17
;說明:直接發送免提短信,用法是在短信前加一個空格!
;此修改完全符合GSM規范,如果對方手機不能免提顯示,則是對方不能完全支持規范。
0x395994: E6FCA011 DAC000E7 0x20E700: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 88808890EC00E6005800F3F8E5103D0A
0x20E710: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F3F2F31067F25F003D25E7F2F000F7F2
0x20E720: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E5100D2047F808003D1DF3F2F310F3F3
0x20E730: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F41046F100203D16E7F21800F7F2E510
0x20E740: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F3F2F1102D0F2922F7F2F110C02F88F0
0x20E750: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E6FCF310E6FD5800E6FEF510F0FDDAFE
0x20E760: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ECAD0802FC0098909880E6FCA011DB00
看到有什么不同了么?
①:地址前面多了 0x(注意,是“零”x,而不是“歐”x),不管他,對補丁沒有影響。是可要可不要的。
②:除了第一行以外,舊數據全部都是 FFFFFFFF……,那問題就來了:
1> 這些 F究竟代表什么呢? 2>怎么會有這種結構呢? 3>這種結構究竟是什么意思呢?
下面我來一個一個地說:
1:這些FFFFF實際上就是手機里空白的地方,這些地方沒有被西門子公司寫上實現手機功能的代碼,而是完全空白的,就像沒有開墾的處女地一樣。
2:像這樣一類的補丁就是利用了手機里的空白地址,在這里寫上自己的代碼,實現自己想要的功能。
3:這個就是關鍵了,其實原理很簡單,你把自己的代碼寫好了,也刷進去了,但是和西門子的常規程序沒有聯系怎么實現自己想要的功能呢?第一行就是起這種連接作用,他銜接了手機的常規程序和補丁程序。大家在第一行的新數據里是不是又看到了DA這個字節,也就是call,在call后面跟的肯定是地址,而且是補丁第二行的地址,但是“C000E7”這個地址并沒有在下面的補丁中出現,這是怎么回事呢?
到這里也不得不講一點比較難懂的東西了。
因為西門子用的是 C166的處理器芯片, 尋址空間 和 pc機上的 286一個等級),為16M,所以在手機內部是用統一的16M地址來處理Flash的。2128的FLASH只有8M,而3118的FLASH是6M,所以有如下公式 :
2128:FlashAddress = FileAddress + 0x800000。而0x800000 = 8M。就是說在FLASH的前面填上8M的空間來進行16M尋址。
3118:FlashAddress = FileAddress + 0xA00000。而0xA00000 = 10M。
例如例 2中的 DAC000E7 這個指令,DA表示CALLS函數調用。而 C000E7 則是被調函數的地址,其中C0是段地址(seg),而E700則是段內偏移量。 注意,是 E700而不是00E7。那這個地址就是所謂的 FlashAddress,而轉換成相對應的文件地址(FileAddress),就是 20E700,大家看出什么規律了么?
C = 12,A = 10,C - A = 2
就這么簡單,大家可以把 2128的免提短信算一算 看看是不是和結論符合。
最后說一下補丁的返回,一個補丁實現完他的功能后不能老是占著 CPU的資源啊,所以要返回原來調用它的地方的下一句繼續運行手機的常規程序,這就用到了返回語句。
大家可以看到在例 2最后一行的最后4個字母,是DB00,DB的反匯編就是rets,作用是返回調用的地方,在這個補丁里就是返回到常規程序中395994的下一句。而00是結束符,表明這個代碼段已經結束。
講到這里,大家應該對補丁的運行過程有一個大概的了解了吧。
未完待續……
新聞熱點
疑難解答
圖片精選