定制ROM进阶篇(替换摄像头驱动)
定制ROM进阶篇(替换摄像头驱动)
因为dumpromx是个人产品,非官方工具,所以对ROM镜象的操作还不是很完善,目前还不能操作所有的.exe/.dll模块,也不能删除文件模块,所以这样只能手工用WINHEX对ROM镜象数据进行操作,所以要分析ROM镜象的数据结构。。。。
从注册表和程序文件的原代码,大致可以找到相关驱动库名称,不过摄像头驱动不用这么麻烦了,月色已经在先完成,俺们只要对比文件就行了。。。大致有四个文件:camera.exe/ov9650.dll(ov7648.dll)/htccamera1.dll/jpegenc.dll(130W对应为ov9650.dll,30W对应为ov7648.dll),camera.exe和jpegenc.dll可以用dumpromx直接替换,ov9650.dll和htccamera1.dll需要用WINHEX手工替换。不过要先进行ov9650.dll和htccamera1.dll的替换后再用dumpromx替换camera.exe和jpegenc.dll。
手工替换文件的操作都大致相同,由于要用ov7648.dll替换ov9650.dll,文件名不同,复杂一些(需要修改原代码中ov7648为ov9650),所以以ov9650.dll为例。。。
使用两个ROM镜象: 585h-os.nb(130摄像头的585行货ROM),575y-os.nb(30W摄像头的575样机ROM)。。。
命令:dumpromx 585h-os.nb -d temp -f ov9650.dll
命令:dumpromx 575y-os.nb -d temp -f ov7648.dll
得到585ROM的文件ov9650.dll.0/ov9650.dll.1/ov9650.dll.2/ov9650.dll.eo,575ROM的文件ov7648.dll.0/ov7648.dll.1/ov7648.dll.2/ov7648.dll.eo,ov9650.dll和ov7648.dll无用。
命令: dumpromx 585h-os.nb -f ov9650.dll >585h.txt
行01:83700000 - 83700000 L00000000 rom_05 start
行02:83700048 - 8370009c L00000054 rom_05 header: dlls=01f601f6-02000000 phys=83700000-83ab6880, 60 modules, 48 files, 0 copyentries ext=00000000 ram=8c000000-8db80000 cputype=000001c0
行03:8370073c - 8370075c L00000020 modent 53 00000007 01c5455e5086fd0f 29944 84fb6000 OV9650.dll
行04:8389efd4 - 8389efdf L0000000b modname OV9650.dll
行05:837f71fc - 837f7268 L0000006c e32 struct 3 objs, img=212e entrypt=000011e8 base=03b00000 v4.21 tp9 OV9650.dll
行06:837f7268 - 837f72b0 L00000048 o32 struct OV9650.dll
行07:83888000 - 8388c6a2 L000046a2 o32 region_0 rva=00001000 vsize=000046a2 real=03b01000 psize=00004800 f=68000020 for OV9650.dll
行08:8397774c - 839788f1 L000011a5 o32 region_1 rva=00006000 vsize=00001ba0 real=01f6b000 psize=000011a5 f=c8002040 for OV9650.dll
行09:83881428 - 8388160c L000001e4 o32 region_2 rva=00008000 vsize=00000340 real=03b08000 psize=000001e4 f=48002040 for OV9650.dll
行10:83ab6880 - 83ab6880 L00000000 rom_05 end
行11:83ab6880 - 83b40000 unknown
命令: dumpromx 575y-os.nb -f ov7648.dll >575y.txt
行01: 83700000 - 83700000 L00000000 rom_05 start
行02: 83a28fb4 - 83a29008 L00000054 rom_05 header: dlls=01f501f5-02000000 phys=83700000-83a29bec, 61 modules, 39 files, 0 copyentries ext=00000000 ram=8c000000-8db80000 cputype=000001c0
行03: 83a29688 - 83a296a8 L00000020 modent 52 00000007 01c4c2ec2e239646 17656 84f9b000 OV7648.dll
行04: 838a4fe4 - 838a4fef L0000000b modname OV7648.dll
行05: 8387d868 - 8387d8d4 L0000006c e32 struct 3 objs, img=212e entrypt=000012d8 base=03b00000 v4.21 tp9 OV7648.dll
行06: 8387d8d4 - 8387d91c L00000048 o32 struct OV7648.dll
行07: 83885000 - 83887ae2 L00002ae2 o32 region_0 rva=00001000 vsize=00002ae2 real=03b01000 psize=00002c00 f=68000020 for OV7648.dll
行08: 8387a9e4 - 8387ae2a L00000446 o32 region_1 rva=00004000 vsize=000008f4 real=01f6c000 psize=00000446 f=c8002040 for OV7648.dll
行09: 8387ae2c - 8387af98 L0000016c o32 region_2 rva=00005000 vsize=00000228 real=03b05000 psize=0000016c f=48002040 for OV7648.dll
行10: 83a29bec - 83a29bec L00000000 rom_05 end
行11: 83a29bec - 83b40000 unknown
以上两个命令得到585h.txt/575y.txt,为ov9650.dll/ov7648.dll在585h-ROM/575y-ROM镜象中的文件数据,以上只是整理后的与文件相关的数据行,无关的数据行已经清除,并进行了整理。。。。信息数据行的结构:第一字段83888000 - 8388c6a2为本行数据的逻辑位址,第二字段L000046a2为本行数据的字节数,第三字段modname为内容描述,后面只分析了部分数据,末尾有文件名,这是找到需要数据行的依据。。。。
行01--ROM_05数据块开始/start,ROM数据可见的分五块,需要的几个文件都在ROM_05
行02--ROM_05数据块中所有文件的头描述/header,这里找到一个需要修改的位址/phys=83700000-83ab6880,ROM_05的开始和结束位址,因为要加数据进去,所以要修改块结束位址/83ab6880,否则用dumpromx再添加文件时就会破坏ROM镜象的数据结构
行03--文件头描述/modent,这里找到三个需要修改的位址,文件名/modname、文件数据头/e32 struct 3 objs、文件数据块结构/o32 struct,在此将这三个数据块的位址转向,指向添加在ROM_05末尾的ov7648.dll的数据
行04--文件名/modname
行05/行06--文件数据块结构描述/e32 struct 3 objs,两行数据位址是相连的,这里找到三个需要修改的位址,就是下面三个数据块的位址
行07/行08/行09--文件数据内容,分三块,region_0/region_1/region_2
行10--ROM_05数据块结束/end
行11--ROM_05空闲的字节数,两个位址相减就得到剩余的空间字节数,要添加的文件总字节数不能超过这个,否则就加不进去了
行05/行06对应文件ov9650.dll.eo,行07/行08/行09对应文件ov9650.dll.0/ov9650.dll.1/ov9650.dll.2,俺们要做的就是把575样机ROM的ov7648.dll.eo/ov7648.dll.0/ov7648.dll.1/ov7648.dll.2替换对应的585行货ROM文件,其实是把575ROM的数据添加到585ROM的末尾,然后将文件指向为添加的数据。。。测试了好多次都无法将数据在ROM内部直接替换原数据,即使替换后提取的文件完全相同,刷机后也无法运行,郁闷。。。。可能数据分析还不够完善。。。。
俺用EXCEL制表(附件),以ROM_05末尾end位址为插入点,根据575y.txt中modname/e32 struct/region_0/region_1/region_2数据行各自的字节数,计算得到需添加数据新的位址,在ov7648.dll.eo中修改ov7648.dll.0/ov7648.dll.1/ov7648.dll.2要添加定位的位址,然后将
modname/ov7648.dll.eo/ov7648.dll.0/ov7648.dll.1/ov7648.dll.2数据块用WINHEX写入到计算的ROM_05末尾对应的位址处,就搞定了。。。
WINHEX操作
打开ov7648.dll.0,搜索--替换文本 "ov7648"为"ov9650",有两处,保存关闭
打开ov7648.dll.eo,手工寻找十六进制字节,575y.txt中行07/行08/行09第一字段第一个位址,在WINHEX中十六进制数据排列为反序,如83885000应寻找字段为00 50 88 83,用表中计算的位址字段写入,行07/行08/行09共三个字段(天蓝色),保存关闭
打开585h-os.nb,位置--转到偏移量 16C0048(585h.txt行02第一字段第一个位址),(因为ROM镜象中所显示的位址为逻辑位址,在WINHEX中打开ROM文件显示的偏移量为物理位址,所以要进行转换,在EXCEL中可以转换,在此步操作中需要“转到偏移量”都是物理位址,写入的字节却是逻辑位址),手工寻找字段83a29bec即EC 9B A2 83,用表中计算的位址字段写入83ABA370即70 A3 AB 83(紫色),哦,一般在末尾留一点空,改为整字节,即 70 A3 AB 90,ROM_05结束位址修改完成。。。
位置--转到偏移量 16C073C(585h.txt行03第一字段第一个位址),手工寻找字段8389efd4(即D4 EF 89 83,(modname)),写入83ab6880
,即80 68 ab 83(浅蓝色),另两个字段8387d868(68 d8 87 83)--83AB688B(8b 68 ab 83),8387d8d4(d4 d8 87 83)--83AB68F7(f7 68 ab 83),文件数据指向修改完成。。。
添加数据(表格中偏移量为黄色)
位置--转到偏移量 1A76880(585h.txt行10第一字段第一个位址),在WINHEX后面文本栏写入"OV9650.DLL"
位置--转到偏移量 1A7688B,另打开文件ov7648.dll.eo,转到ov7648.dll.eo文件窗口,Ctrl+A,Ctrl+Shift+C,(已经把ov7648.dll.eo所有十六进制数据复制到剪粘板);再转回585h-os.nb文件窗口,确定光标在偏移量1A7688B,Ctrl+B,(将剪粘板数据写入文件),点确定
位置--转到偏移量 1A7693F,另打开文件ov7648.dll.0,转到ov7648.dll.0文件窗口,Ctrl+A,Ctrl+Shift+C;再转回585h-os.nb文件窗口,确定光标在偏移量1A7693F,Ctrl+B,点确定
位置--转到偏移量 1A79421,另打开文件ov7648.dll.1,转到ov7648.dll.1文件窗口,Ctrl+A,Ctrl+Shift+C;再转回585h-os.nb文件窗口,确定光标在偏移量1A79421,Ctrl+B,点确定
位置--转到偏移量 1A79867,另打开文件ov7648.dll.2,转到ov7648.dll.1文件窗口,Ctrl+A,Ctrl+Shift+C;再转回585h-os.nb文件窗口,确定光标在偏移量11A79867,Ctrl+B,点确定
保存,完成ov9650.dll数据的替换
同以上操作,可完成htccamera1.dll数据的替换
最后用dumpromx替换camera.exe和jpegenc.dll文件,得到jpegenc.dll.nb,改名为nk.nb
测试写入文件的正确性,命令:dumpromx nk.nb -v,如果信息显示如原585h-os.nb一样正常,成功了一半了。。。
最后生成.nbf文件写入手机测试吧。。。。