玩转补丁移植

补丁很神秘吗?补丁移植很难吗?我能自己移植补丁吗?我说不好,不过我相信,看完这篇文章你一定会手痒痒 。搞补丁移植没有任何经验,但是我有自己的思路:就象自学日语德语一样,不要教科书,直接去日本德国的网站找感兴趣的东西看,越糊涂越好,坚持下去,大彻大悟之时,再去比照别人的经验 。所以,至今也不太了解别人是如何移植补丁的 。
写完这篇文章后,我想自己应该去深造一下了 。如果你觉得我下面的方法比较苯、比较另类,我希望你会谅解 。
在研究、移植补丁之前,需要知晓几个必备的条件:
1、不必具有太多的相关专业知识,但是必须具有清晰、灵活的思路;
2、需要一定的耐心和搞坏爱机的心理承受能力;
3、具备几个软件和文件:UltraEdit(二进制文本编辑软件)、Smelter(Fullflash综合分析工具)、IDA(反汇编调试工具)、ABraGen(ArshOr写的分支跳转计算工具)、补丁手机的Fullflash和你自己手机的Fullflash 。
一般情况下,我们认为FUBU(FUllflash BackUp)和Fullflash是有所区别的:FUBU是手机的.fbk格式的整机备份(x65flasher-backup-fullflash),内部含有解释性的地址参数,所以在Restore时不用提供起始地址和长度;Fullflash是.bin格式的整机备份(x65flasher-Read Flash),是A0000000H开始的“原汁原味”的纯二进制文件,可以重新定位到任何地址段,是这里移植补丁所需要的格式 。
有关地址的说明:x65有32M内存,使用8位地址,基址为A0000000,反汇编都是基于这个基址的,而在V_Klay格式的补丁中,必须去掉最高位的A,剩下的7位数据可以去掉或者保留最前面的0 。
IDA的基本用法:处理器选ARM或者ARM 710a;ROM和Loading地址选A0000000;切换到16位的Thumb状态用Alt G,Value=https://www.rkxy.com.cn/sjjc/1;定位地址按G键;反汇编按C键...
我们下面会通过三个比较典型的例子,介绍一下补丁移植的基本方法,大家细嚼慢咽,就会品出“腊肉”的滋味 。
请先准备好干净的、没刷过下面补丁的S65 v25和C6C v25(或者其他机型)的Fullflash,我们来把S65 v25的补丁移植到你的手机上 。

一、通话时间50秒提示

1.补丁原型:
;S65
0B7BBB6: 00 32

2.基本思路:
上面的补丁是把S65手机中地址为0B7BBB6处的一个字节的16进制数据00(代表默认的60秒)替换为32(表示50秒) 。
在C6C(或者其他类型)手机中,数据00可能不在0B7BBB6这个位置上,我们必须重新找到这个位置 。要从32M(32x1024x1024)个字节的数据里面直接找到这个特定的00几乎是不可能的 。但是由于这两款手机的软件系统结构具有相当的一致性,我们可以将这个00数据及其周围的一段数据作为特征字串,在C6C的Fullflash里面搜索一下,看看能不能找到一个唯一的位置,然后,把这个位置的00改为32,刷进C6C进行测试 。

3. 补丁移植

3.1 用UltraEdit打开S65的Fullflash,找到00B7BBB0这一行(00位于这一行的0B7BBB6这个位置上);
3.2 从00B7BBB6开始,直到这一行结束,用“鼠标右键-Hex复制选定区”进行复制;
3.3 用UltraEdit打开C6C的Fullflash,在搜索功能里面,粘贴上面复制的内容,去掉开头的地址和后面的乱码,只要有用的数据:00 29 06 D1 2A 1C 2B 1C 5B 21
3.4 搜索的结果,在地址00b006b2这里找到了这个和S65一样的特征字串,继续搜索,没有发现其他位置有这个字串,现在,我们认定这就是我们要找的位置了;
3.5 新建一个V_Klay文件,输入0b006b2: 00 32,刷进手机试一下补丁的效果 。
3.6 很幸运,一次成功 。

4. 最终补丁:

;C6C
0b006b2: 00 32

5.补充说明:
如果特征字串选的太短,可能会搜索到多个结果,难以确定真实有效的位置;如果字串太长,可能一个位置也找不到 。所以,应该由短到长逐渐改变字串的长度,缩小地址范围 。

推荐阅读