我针对 AMOI E8手机的ROM进行分析和替换文件,主要顺着手工修改写下去,其它的就不多说明了,以免越看越乱,如有不足之处还望指教。
前言:
需要工具软件: dumprom , rommaster , WinHex 以及本人写的一个程序(非必须)。目录设置:把 ROM 文件和软件( nk_MP_060716.nba )放在统一目录下,例如我用 E:\rom ,要增加的文件放 E:\rom\add 。在 ROM 文件中的十六进制数都是倒过来表示,比如“ 1A2B3C4D ”会成为“ 4D3C2B1A ”可以用我写的程序来进行倒序(hamsrom.ys168.com)。
一、分析篇:
用 dumprom 分析文件结构,打开命令提示符(开始-运行-输入 cmd 回车)输入“ E:\rom\dump.exe E:\rom\nk_MP_060716.nba > E:\rom\dumpinfo.txt ” ( 可以直接把文件拖放到命令提示符窗口内 ) 回车,打开 dumpinfo.txt,可以看到首行img00000000:hdr=82ff1234,base=80040000,commandlineoffset=80040000,这个是指 ROM 中的基准偏移量为 80040000 ,就是指 ROM 文件的偏移量起始 0 位是手机中的 80040000 位.
再往下看有一行 80040040 - 80040048 L00000008 'ECEC' -> 82ff1234 ,用 WinHex 打开 ROM 文件,可以看到偏移量 40 (也就是手机中的 80040040 )就是 'ECEC' ,是 ROM 的标志(一般分析 ROM 可以先找 ECEC ),后面紧跟的十六进制数 34 12 FF 82 ,我们应该把它倒过来即 82 FF 12 34 ,这就文件指针的开始地址, 82ff1234-80040000 得 ROM 文件实际地址 02FB1234 ,转到文件偏移量 02FB1234 就可以得到我们要修改的文件的所有信息了,查找dumpinfo.txt 中“ 82ff1234 ”就可以找到一段 82ff1234 - 82ff1288 L00000054 rom_00 header: dlls=01ac01dd-02000000 phys=80040000-82ff70b0, 279 modules, 542 files, 1 copyentries ext=80078640 ram=88480000-8a000000 cputype=000001c2 ,这就是 ROM 信息,需要特别说明的是 rom 文件的 2fb1264 位的“ 1E02 ”是指文件数量“ 021E ”= 542 ,我们手动增加文件后也要改这个数。
dumpinfo.txt 往下一行,这就是文件指针区开始的第一个文件 nk.exe ,这是一个 modent ,分散在 ROM 文件中的几个地方,有兴趣可以再分析,先用简单一些的 filent (单一文件)说起,
转到 dumpinfo.txt 最后倒数第三行, 82ff7094 - 82ff70b0 L0000001c filent 541 00000001 01c4f9ea1f89bb00 31 31 812b7fdc SkinSetting.lnk
说明: 82ff7094 - 82ff70b0 L0000001c :这一段信息在文件 82ff7094 - 82ff70b0 长度 0000001c ; filent :单一文件; 541 ,文件数编号;00000001 :文件在手机中的状态,这个比较重要,但知道一般我们要加的用 00000005 (无压缩,可在手机中拷出)和 00000805 (压缩)就可以了;01c4f9ea1f89bb00 :文件修改时间,从 1601 年起,以 10^(-7) 秒计;
31 31 :前一个是文件实际大小,后一个是 ROM 中的实际大小,如果有压缩两个数字就不会一样,可以往上找看看文件状态为 00000805 的行;812b7fdc :文件实际内容的起始地址 812b7fdc-80040000=01277FDC 。
用 WinHex 打开 ROM 文件,移动到最底端, 2fb7094 到 2fb70af 这 1c 长度的内容就是上面 dumpinfo.txt 最后倒数第三行中的信息, 01000000 00BB891F EAF9C401 1F000000 1F000000 2CBECB80 DC7F2B81.
和上面内容对应起来看
01000000 --> 00000001 文件在手机中的状态
00BB891F EAF9C401 文件修改时间
1F000000 --> 0000001F=31 文件实际大小
1F000000 --> 0000001F=31 ROM 中的实际大小
2CBECB80 --> 80CBBE2C =00C7BE2C 指向文件名内容地址 "SkinSetting.lnk"
DC7F2B81 --> 812B7FDC=01277FDC 文件实际内容的起始地址
每个文件指针段长度都为 1c ,如果文件删除后,整个段会被删除,后面的段会向前补上,所以我们先删除一些文件后,在 ROM 文件的最后就会产生一大段的 0000000 ,我们可以紧接前面的数据加入自己的文件指针信息。
(待续…)