新手必读:补丁基础教程( 二 )


4a77f0:7502 f001;字串ID
【新手必读:补丁基础教程】4a7c50:DAc110cf DAcaced3;函数
看到这里,你是不是已经有点明白了?补丁还有一种常见格式,我举下面这个例子说明
例 2:3118的 直接发送免提短信
;作者:RizaPN&coollang
;适用:3118V17
;说明:直接发送免提短信,用法是在短信前加一个空格!
;此修改完全符合GSM规范,如果对方手机不能免提显示,则是对方不能完全支持规范 。
0x395994:E6FCA011DAC000E70x20E700:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88808890EC00E6005800F3F8E5103D0A
0x20E710:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F2F31067F25F003D25E7F2F000F7F2
0x20E720:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5100D2047F808003D1DF3F2F310F3F3
0x20E730:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41046F100203D16E7F21800F7F2E510
0x20E740:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F2F1102D0F2922F7F2F110C02F88F0
0x20E750:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6FCF310E6FD5800E6FEF510F0FDDAFE
0x20E760:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECAD0802FC0098909880E6FCA011DB00
看到有什么不同了么?
①:地址前面多了 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 = FileAddress0x800000 。而0x800000 = 8M 。就是说在FLASH的前面填上8M的空间来进行16M寻址 。
3118:FlashAddress = FileAddress0xA00000 。而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是结束符,表明这个代码段已经结束 。
讲到这里,大家应该对补丁的运行过程有一个大概的了解了吧 。
未完待续……

推荐阅读