补丁基础教程
可能是 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是结束符,表明这个代码段已经结束。
讲到这里,大家应该对补丁的运行过程有一个大概的了解了吧。
未完待续……