赞助论坛
  • 33717阅读
  • 0回复

怎样修改空中升鸡数据 [复制链接]

楼层直达

发帖
58
精华
11
金币
882
威望
105
贡献
113
好评
41
注册
2010-01-05
楼主    quicktime 发表于: 2010-06-18 23:34:17 
怎样修改空中升鸡数据

空中升级的最后一部就是把抓到的空中升级数据刷写到flash。
那么升级代码在什么地方开始刷写flash,升级代码从空中抓下来后又暂存在哪呢?

对于海尔系列(包括大小海尔),在bin的0400~1FF00, 搜索E4 FF FE 7D 06 FC 12, 从这里开始是刷写flash的代码。

那么升级代码从空中抓下来后又暂存在哪呢?这个大小海尔是不一样的,暂存的地址就是boot时,应用程序数据的第一次加载地址。

大海尔是RAM内存的5F0000, 长度不应该超过1A0000
小海尔是RAM内存的410000,长度不应该超过A0000

如果在刷写flash前,插入代码,修改该处资料,理论上可以定制升级代码。
但要注意的是,升级数据时lzss压缩过的,要获得有意义的修改必须先解压,修改后再压缩回去,同时还要更新flash header处的crc32.
更新flash header处的crc32,则涉及到修改flash header资料,重计算升级资料的CRC32,复杂度都要上去一些。
总体上这些技术上都没有问题,是可以做到的。

[b]目前最简单的,可以玩一个假升级。比如不想升级把自己做的修改覆盖掉[/b]。可以这样玩:
以卓异大海尔的bin为例:

[quote]
经过今天的测试,这一段的方法行不通。请跳过。

[size=1]1. 搜索E4 FF FE 7D 06 FC 12,记下该处地址,比如是XXXXXX,同时记住最后的12后面跟随的三个数字,比如是YYYYYY。
2. 搜索78 06 79 00 7A 00,记下该处地址,比如是ZZZZZZ,ZZZZZZ应该小于000400。
3. 在bin的400~1FF00之间找一个空闲的都是FFFF的地方,空闲区要长。比如该处地址为MMMMMM
4. 把XXXXXX处找到的YYYYYY修改成MMMMMM
5. 修改地址MMMMMM处数据。依次录入:12 ZZZZZZ E4 FF FE 7D 06 FC 12 YYYYYY
6. 注意,以上的XXXXXX, YYYYYY等都必须是完整的3字节数据,不足用零补齐,比如000326.
7. 继续录入,90 26 5D 70 74 FF F0 A3 F0 A3 F0 A3 F0 A3 E4 F0 A3 F0 A3 F0 A3 F0 A3 22
8. 重新修正01FFF8处CRC32。OK, 刷机测试。

不想知道原理的这段跳过。第7步的时候,实际耍了个花招。地址265D17是卓异大海尔的flash header的刷机前暂存地址
那段数据实际是个小程序,把flash header的偏移59处的CRC32改为FFFFFFFF,应用软件CRC32计算长度改为0。这样骗过CRC32计算程序,让程序误以为应用程序区数据的CRC32为FFFFFFFF。

如果是卓异小海尔,第7步的90 26 5D 70应该要改成:90 26 63 00.
[/size]
[/quote]

下面是用卓异大海尔的bin测试通过。

1. 12 5D DB 38 7B 27 7A 5D 79 17. 同时记住数字12后面跟随的三个数字YYYYYY, 这里YYYYYY就是5DDB38

2. 在bin的400~1FF00之间找一个空闲的都是FFFF的地方,空闲区要长。该处地址值变换代码空间地址,对于卓异海尔bin,把该处的地址值减0400H加上5D0000,得到三个字节数字。比如是MMMMMM

3. 把第1步找到的YYYYYY修改成MMMMMM

5. 修改地址MMMMMM处数据。依次录入:C0 86 75 86 01 90 26 5D 70 05 86 90 02 00 59 75 86 20 78 08 E0 F0 A3 A3 D8 FA D0 86 22

6. 注意,以上的YYYYYY,MMMMMM等都必须是完整的3字节数据,不足用零补齐,比如000326.

7. 重新修正01FFF8处CRC32。OK, 刷机测试。

这个方法骗过升级程序, 升级日期和版本号更新,而实际程序数据没有更新。

不想知道原理的这段请跳过。
昨天的设想主要有两点,一是在刷写flash前,重新加载flash的应用程序数据,覆盖掉空中升级数据。
二是修改flash header的应用程序crc32计算长度为零。让CRC32计算程序误以为应用程序区数据的CRC32为FFFFFFFF
但这两个设想实测下来都有点问题。
第一点,因为上面提到的插入代码点,Flash已经被擦除掉了,无法重新加载旧数据了。解决办法,代码插入点提前到擦flash之前,然后干脆跳过刷写程序。
第二是修改flash header的应用程序crc32计算长度的方法,可以欺骗升级程序。但应用程序本身会自我校验,这个花招欺骗的了升级程序,欺骗不了应用程序。解决办法是复制旧的crc32资料到新的flash header。

[color=darkred]小海尔,俺没有仔细看过。有兴趣者可根据大海尔的代码特征去分析分析[/color]
本帖最近评分记录: 14 条评分