“中兴B600机顶盒软件升级”的版本间的差异

来自IPTV爱好者
跳转至: 导航搜索
B600V4升级包分析
第8行: 第8行:
 
* 上海电信iTV机顶盒升级服务器地址:http://218.83.166.81:8080/b600v2/upgrade/
 
* 上海电信iTV机顶盒升级服务器地址:http://218.83.166.81:8080/b600v2/upgrade/
  
* 江苏电信iTV机顶盒升级服务器地址:http://221.231.144.27/b600/
+
* 江苏电信iTV机顶盒升级服务器地址:http://221.231.144.27/b600/  
 +
  2011.03.16 当前版本是40032407
  
 
*重庆电信itv机顶盒升级服务器地址: http://upgrade.itv.cq.cn:8080/b6oov4
 
*重庆电信itv机顶盒升级服务器地址: http://upgrade.itv.cq.cn:8080/b6oov4

2011年3月16日 (三) 05:08的版本

中兴B600机顶盒支持远程升级软件,升级服务器地址在机顶盒的配置界面中预先设置。

升级服务器实际上是Web服务器,机顶盒在每次启动时,自动检查升级服务器上是否有新的软件,如果有则提示更新软件。

具体过程是:下载更新服务器上的文件zteSTBVer.cfg,该文件记录了各种机顶盒的软件的版本号。

官方升级服务器

  2011.03.16 当前版本是40032407

B600V4升级包分析

升级包文件名:allmtd_40024801.jpg,文件大小:12.7 MB (13,377,536 字节)

下载地址:http://218.83.166.81:8080/b600v2/upgrade/allmtd_40024801.jpg

这个升级包有三部分构成:

  • 内核     - 0x00000000~0x0017FFFF 0x00180000 1536KB /dev/mtd6
  • 根文件系统  - 0x00180000~0x0037FFFF 0x00200000 2048KB /dev/mtd7 (jffs2)
  • 扩展文件系统 - 0x00380000~0x00CC1FFF 0x00942000 9480KB /dev/mtd8 (cramfs)

内核部分有长度为0x44的首部:

55 66 77 88 6B 65 72 00 00 00 00 00 00 00 00 00
----------- ----------- ----------- -----------
MAGIC WORD  ker
                 
00 00 00 00 56 34 30 30 32 34 38 30 31 20 32 30
            -----------------------------------
            版本信息:V40024801 20
30 38 2D 30 37 2D 31 30 00 00 00 00 00 00 00 00
-----------------------
08-07-10
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

00 00 00 00 00 16 8C E0 00 00 00 0C 84 40 10 00
            -----------------------------------
            内核从0x44开始

用QQ群共享中的文件分割工具SplitFile.exe把allmtd_40024801.jpg分割成三个文件kernel.bin, jffs2.bin和cramfs.bin。具体方法为:

1. 内核的起始位置是:0x00000000 结束位置不输入,长度是:0x00180000,文件另存为:kernel.bin

2. 根文件系统的起始位置是:0x00180000 结束位置不输入,长度是:0x00200000,文件另存为: j2ffs.bin

3. 扩展文件系统的起始位置是:0x00380000 结束位置不输入,长度是:0x00942000,文件另存为:cramfs.bin

内存文件的首部有版本号,用UltraEdit等支持二进制编辑的软件把版本号改成40024802。

把cramfs文件系统解压到目录cramfs中:

sh4-linux-cramfsck -x cramfs cramfs.bin

修改cramfs/bin/start文件,在其中增加两行,目的是开启FTP和Telnet服务器:

ftpd &
/usr/sbin/telnetd -l /bin/sh

把cramfs目录中的文件打包到cramfs.bin文件中

sh4-linux-mkcramfs cramfs cramfs.bin

合并三个文件为allmtd_new.jpg

cat kernel.bin j2ffs.bin cramfs.bin >allmtd_40024802.jpg

创建升级包描述文件zteSTBVer.cfg:

[Model=ZXB600V4(STBSC-ST5202-000)]
AppName=allmtd Version=40024802 Location="allmtd_40024802.jpg" Destination="/dev/mtd6" Rules={Y(!40024802)}

把zteSTBVer.cfg和allmtd_40024802.jpg复制到Web服务器的根目录中,然后把机顶盒的升级服务器地址设置成自己的Web服务器地址,就能实现机顶盒升级修改过的升级包。

mtdblock6的分析

try find normal kernel: 0xa0000000
found normal kernel:0xa0320000
name        :ker
len         :0x00168ce0
load addr   :0x84401000
entry point :0x84402000
version     :V40024601 2008-06-17
crc         :0x00b10000
reserver1   :0x0000005c
reserver2   :0x00000010
 00000000h: 55 66 77 88 6B 65 72 00 00 00 00 00 00 00 00 00 ; Ufw坘er.........
            ----------- -----------------------------------
            Magic Word           分区名 0x10 字节
 00000010h: 00 00 00 00 56 34 30 30 32 34 36 30 31 20 32 30 ; ....V40024601 20
            ----------- ---------------------------------- 
                               详细名称0x40字节
 00000020h: 30 38 2D 30 36 2D 31 37 00 00 00 00 00 00 00 00 ; 08-06-17........
            -----------------------------------------------
 00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
            -----------------------------------------------
 00000040h: 00 00 00 00 00 16 8C E0 00 00 00 0C 84 40 10 00 ; ......屶....凘..
            ----------- ----------- ----------- -----------
                         内核长度      未知1           加载地址
 00000050h: 84 40 20 00 00 60 00 B1 00 00 00 5C 00 00 00 10 ; 凘 ..`.?..\....
            ----------- ----- ----- ----------- -----------
            入口地址     头长度  CRC    保留1        保留2

内核刷坏了怎么办?

 如果错了,V4里会由SAFE分区启动,恢复KER分区。
 有时SAFE无法恢复。那么只有一个办法就是短路法。
 把盒子打开。把网线断开。加电。这时会检测网络。
 把NAND数据引脚短接一两个,就不能从SAFE启动了。 
 因此可以进入UBOOT,然后就可以从远程加载可用的内核了
 

生成jpg文件的程序

 struct jpgHeader{
 	DWORD magic;
 	char id[0x10];
 	char ver_info[0x20];
       DWORD size;
       DWORD type;
       DWORD load_addr;
       DWORD entry_addr;
       WORD  unknow;
       WORD  crc;
       DWORD reserv1;
       DWORD reserv2;
 }h;
 
 #incldue <stdio.h>
 
 int main(int argc ,char **argv ){
 	FILE * fin ,* fout ;
 	char buf[1024000;
 	int n;
 	fin = fopen(argv[1],"rb");
 	fout= fopen(argv[2],"wb+");
 	strcpy(h.id,argv[3]);
 	strcpy(h.ver_info,argv[4]);
 	
 	fwrite(&h,1,sizeof(h),fout);
 	
 	while(feof(fin)){
 		n =fread(buf,1,1024000,fin);
 		if( n == 0 ) break;
 		fwrite(buf,1,n,fout);
 		if( n != 1024000 )break;
 	}
 	fclose(fin);
 	fclose(fout);
 	
 }