|
  
- UID
- 44437
- 帖子
- 3267
- 精华
- 5
- 积分
- 3396
- 威望
- 142
- 玖钱
- 10832
- 论坛宣传币
- 122
- 阅读权限
- 200
- 在线时间
- 1519 小时
- 注册时间
- 2009-4-20
    .gif) .gif) .gif) .gif) .gif) .gif) .gif)
|
倒霉的板凳
发表于 2010-3-5 23:36
| 只看该作者
【三星swift系统补丁移植教程3】以"短信中号码用OK键粘贴"为例
本篇补丁移植以“短信中号码用OK键粘贴”为例,其补丁作用是:当你看短信时,如果短信中有电话号码,这时你选择剪切地址,将把号码剪切,然后你按ok键就可直接粘贴号码,便于保存。源补丁是D908IZCGE3的,目的是将其移植到D908IZCHF1上去。值得一说的是,同机型不同版本间的补丁移植大多数情况下是很简单的,因为同机型不同版本之间cla固件的代码都很相似。
在这里需要借用丛林猎手大大的补丁移植教程中一些内容(因为这些内容我不知怎么用专业词汇去说,呵呵)。
patches制作一般有3种,
一:搜索固定代码(第一类patch)
二:搜索固定代码,更换调用指针(第二类patch)
三:搜索固定代码 配合反编译BIN文件,得到assamble for ARM 指令(第三类patch)。
第三种方法需要 ARM指令集及反汇编指令,需要一定ARM基础,所以暂时搁置一下,但事实上,在没有熟练前2种补丁的移植方法,第3种补丁移植起来会有很大的困难,所以初学者切不能想一步登天,这个得慢慢来,有了一定基础后再接触第3类补丁。不用着急,学会前2类补丁的移植方法后,40%的补丁你都会不在话下了。。。。。
好了,进入正题,我的前2篇教程中所举的例子都属于第一类补丁,这类补丁的移植方法很简单,靠搜索固定代码来得到。说白了就是smp补丁中to后面的代码不用改,form后面的代码可能会改也可能不用改,视固件的代码而定。而今天所举的例子,“短信中号码用OK键粘贴”补丁则属于第二类补丁,大概思路是更换调用指针。这类补丁不多,但也不少。下面来看一下补丁:
<?xml version="1.0" encoding="Windows-1251"?>
<patch version="0.4">
<info title="短信中号码用OK键粘贴" id="615E8A63" group="短信" version="1">
<description short="当你看短信时,如果短信中有电话号码,这时你选择剪切地址,将把号码剪切,然后你按ok键就可直接粘贴号码,便于保存。" />
<author nickname="Longhair" fullname="" status=" email="longhair@sgh.ru" www="" icq="252687401" />
<author nickname="ruoyi850" fullname="木子" status="" email="" www="" icq="19761740" />
</info>
<patchdata firmware="D908iZCGE3" >
<changes>
<nord offset="0x00F19AF8" from="1CD02C20" to="C09BF120" />
</changes>
</patchdata>
</patch>
下面我们用hex workshop软件打开E3的CLA,然后转到地址0x00F19AF8 (hex workshop的简单使用方法参看前2篇教程),你会看到一片代码,其中还有很多地址指针,其中0x00F19AF8处的代码1CD02C20也是一个地址调用指针(不明白意思的可以不用明白),因为SWIFT系列的ROM是从0x20000000(或0x10000000,如D608,D908等固件)开始编译的,而且SWIFT系列的地址是和AGERE系列一样两位两位颠倒调用的,所以调用1CD02C20这个地址,实际上是调用BIN里的0x002CD01C这里的控制循环代码。于是我们用hex转到E3的这个地址0x002CD01C,你同样看到很多代码(貌似是废话,呵呵),往后看,复制一串代码,如170800000E0000000000000000000000170800001C00,然后在F1中查找这段代码,结果是找到3个,那F1中对应的究竟是哪个呢?我们回过头来看在E3中查找这段代码,同样找到了3个,而0x002CD01C地址是第2个(按查找到后软件排列的顺序第2个),那么我们猜测F1中也是第2个,但只是猜测,还不能完全确定,那么我们还是观察E3中这第2个地址,也就是0x002CD01C的周围,看到地址0x002CD01C上面那行有串代码170800000E00000000000000000000003400FFFF,我们再回头看F1中刚刚查找到的那3个可疑(未确定,暂时说可疑吧)地址,发现只有第2个地址上方有170800000E00000000000000000000003400FFFF这段代码,再进一步比较E3中地址0x002CD01C周围的代码和F1中第2个地址0x002CEFCC周围的代码,发现这2处是如此的相似!那么结果就是它了,而地址0x002CD01C是刚刚将form后面的调用指针1CD02C20反转后得到的,反过来,我们将F1中找到的那个地址0x002CEFCC也反转过来得到CCEF2C20,则这个调用指针则为F1中这个补丁from后面的那个指针了。
确定了form后面的代码,那么现在如何确定代码所在的地址呢?在F1中搜索代码CCEF2C20(刚刚得到的指针),发现搜到了3个,究竟是第几个地址呢?我们在E3中搜索指针1CD02C20,发现也是3个。而补丁中选择的是第1个,由此我们也猜测在F1中也是第1个0x00F183BC,仔细对比一下,发现F1中的第一个地址周围的代码和E3中的第一个地址周围的代码很相似,那么我们就确定了猜测是正确的,与是得到了半个补丁,F1中补丁应为 <nord offset="0x00F183BC" from="CCEF2C20"
现在确定to后面的代码,很容易发现,to后面的代码也是一个地址指针,将C09BF120反转后得到0x00F19BC0,在E3中转到这个地址,我们复制看到的一段代码17240200000000000000000000000000170800000E00,在F1中搜索这段代码,同样还是搜到了3个,现在怎么确定呢?我们同样可以反过头来在E3中也搜索代码17240200000000000000000000000000170800000E00,也是3个,E3中选择的是第2个地址,也就是0x00F19BC0,现在我们来观察下这个地址,你仔细的话就会发现这个地址和E3这个补丁中form前面的地址0x00F19AF8很接近,我们在E3的CLA中转到0x00F19AF8这个地址,发现他就在地址0x00F19BC0上面不远,现在我们观察在F1中搜到代码17240200000000000000000000000000170800000E00的3个地址,很显然,第2个地址0x00F18484和F1补丁中form前面的地址0x00F183BC很接近,在F1中转到0x00F183BC这个地址,发现也确实是在地址0x00F18484上面不远,由此我们确定了这个地址确实是0x00F18484无疑,我们将这个地址反转过来变为地址指针8484F120,现在我们确定了to后面的语句为8484F120,于是终于大功告成了。E3这个补丁移植到F1后为:
<?xml version="1.0" encoding="Windows-1251"?>
<patch version="0.4">
<info title="短信中号码用OK键粘贴" id="615E8A63" group="短信" version="1">
<description short="当你看短信时,如果短信中有电话号码,这时你选择剪切地址,将把号码剪切,然后你按ok键就可直接粘贴号码,便于保存。" />
<author nickname="Longhair" fullname="" status=" email="longhair@sgh.ru" www="" icq="252687401" />
<author nickname="ruoyi850" fullname="木子" status="" email="" www="" icq="19761740" />
</info>
<patchdata firmware="D908iZCHF1" >
<changes>
<nord offset="0x00F183BC" from="CCEF2C20" to="8484F120" />
</changes>
</patchdata>
</patch>
这个补丁移植到此位止就结束啦!移植这类补丁时注意力一定要集中,刚开始或许你会有点头晕,因为一下要反转一下要搜索代码确定地址再反转,所以要慢慢来,将此篇教程慢慢理解,这类补丁我还会选择几个作为例子出教程,你也可以选择用E3的补丁作为练习。总之移植补丁一定要找相似地址,就是目标地址周围的代码和源补丁地址周围的代码尽可能相似(一般情况下对应的指针都会不同,这点大家练习多了就会看出来)。
移植类补丁确定from后面的代码时也可以用普通搜索相似代码的方法,现在在E3中转到地址0x00F19AF8,我们在此地址下面的第2行看到这段代码750001000141000000000000300000007C240300020002000000000000000000 (为什么是这段?因为这段比较特殊,在固件中搜到的几率相对较小,在找相似地址时选取的搜索代码不能是固件中很常见的,如5C00000000000000..... 因为这样是很难确定相似地址的,所以要选择特殊的代码进行搜索),我们在F1中搜索代码750001000141000000000000300000007C240300020002000000000000000000 ,仅仅找到一个,地址为0x00F183F4,我们在回过头来在E3中搜索这段代码,也是只有一个,地址是0x00F19B30,而E3的补丁中地址选取的是0x00F183BC,这个地址所在位置就在地址0x00F19B30的上方第2行,于是我们猜想F1中的相似地址也应在代码750001000141000000000000300000007C240300020002000000000000000000所在地址的上面第2行,确定为地址0x00F183BC,代码为CCEF2C20,现在我们将这个地址和0x00F19AF8周围的代码仔细比较一下,发现很相似,那么我们也可以确定是这个地址。可见,找from后面的代码也不一定要将代码反转为地址再搜索相似地址,最后又将找到的相似地址反转再确定所在地址,这样的方法是先确定from后面的语句再确定所在地址,刚我们看到这个另外的方法是先确定地址再确定指针代码,刚好反过来。2种方法第2中简单些,但不同的补丁移植时会有不同,2种方法可以自由选择,一个不行选另外一个,要懂得运用!
讲了这么多,最后再重点将下地址指针的反转,如指针CCEF2C20反转为地址结果为0x002CEFCC,怎么变过来的呢?我们将指针CCEF2C20分隔开:
指针: CC EF 2C 20
地址:0x00 2C EF CC
再举一例,地址0x003BDC03反转为指针:
地址:0x00 3B DC 03
指针: 03 DC 3B 20
在举一例,指针23EC2021反转为地址:
指针: 23 EC 20 21
地址:0x01 20 EC 23
最后一例,地址0x0123E500反转为指针:
地址:0x01 23 E5 00
指针: 00 E5 23 21
互相对比下你就会发现规律了,其实是很简单的,但要细心不要反转错。记住,指针结尾的20反转为地址应为00,结尾的21反转为地址为01,反之亦然!(原因前面讲过了,因为SWIFT系列的ROM是从0x20000000开始编译的......这里也要注意,像D908 D608的补丁指针都是以10或11结尾的,反转后对应的是00和01)。
这篇教程可能比较长,但只要细心就会轻松读懂的!不要认为这是很难的东西,半年以前我能用2个小时基本理解透并成功移植补丁,那么你们同样能够办到!找相似地址并非一件难事,也并非一件易事,方法可以变化的多端,只是看你该怎么运用了 |
|