2010年1月17日星期日

1073机固件的解压及打包

解压固件

0. 准备工作
下载附件,解压,上传到Linux的/usr/local/bin

chmod a+x /usr/local/bin/unyaffs
chmod a+x /usr/local/bin/mkyaffs2image


1. 把install.img上传到Linux机器上或者直接用Linux去它的官网下载

2. 把install.img放到/root/firmware目录下
接下来在/root/firmware 目录下再建三个子目录 install img1 img2 备用

cd /root/firmware
mkdir img1 img2 install


这样/root/firmware目录下有三个暂时为空的子目录 install img1 img2 和一个文件 install.img

3. 解压install.img

cd install
tar xvf ../install.img


这样就解开了install.img,所有内容在 /root/firmware/install 目录下

4. 接下来,进入install/package2,可以看到两个img文件,yaffs2_1.img 和 yaffs2_2.img。
yaffs2_1.img比较大,这是最终系统的/分区,yaffs2_2.img很小,对应未来的/usr/local/etc。
这两个文件是yaffs2格式的磁盘镜像文件。需要对它们进一步处理。

5. 继续解压yaffs2镜像文件,需要用到unyaffs这个工具

cd ~/firmware/img1
unyaffs ../install/package2/yaffs2_1.img
cd ~/firmware/img2
unyaffs ../install/package2/yaffs2_2.img


这样就把yaffs2_1.img和yaffs2_2.img的实际内容分别解压到了img1和img2目录

到此解压结束。

打包固件

6. 从img1和img2目录分别创建新的yaffs2文件镜像
需要用到另外一个工具,mkyaffs2image

cd ~/firmware
mkyaffs2image img1 yaffs2_1.img
mkyaffs2image img2 yaffs2_2.img


7. 覆盖掉原来的镜像文件

cd install/package2
mv ~/firmware/yaffs2_1.img .
mv ~/firmware/yaffs2_2.img .


8. 把install目录下的所有内容重新打包,生成新的镜像文件

cd ~/firmware/install
tar cvf ../install-new.img *


生成新的固件,位于/root/firmware,名为install-new.img

题外话,海信的那个比较杯具,/居然是squashfs的。
需要用squashfs的一套工具,思路类似,操作不能照搬
而且squashfs是个只读的文件系统...

简单的说一下固件的"定制"

像M880这种就很必要,至少得要开官方固件没开的telnet
ASUS的O!Play则官方就开了telnet,其实就可以凑合着用了

开telnet包括两个方面,一是打开telnet服务,二是给root设置密码
对M880,它的busybox已经带了telnetd只是没有默认运行,还是很省事的,
要不就得找个带telnetd的busybox或者上dropbear [Cool]

前面已经说了怎么解压固件,在第五步之后,img1和img2目录已经有内容了
img1对应播放器的实际根目录

进入img1/etc目录(刷机后的/etc)
编辑inetd.conf,有一行
代码:

#telnet stream tcp nowait root /usr/sbin/telnetd telnetd

开头的#表示注解,去掉#就可以了,也就是改成
代码:

telnet stream tcp nowait root /usr/sbin/telnetd telnetd

这样telnetd就会开机运行了。

接下来要给root设置密码,编辑img2/passwd
原来的:
代码:

root:$1$t8mJjTYe$65Ob2BiKYcNIrXV1VJ7OG1:0:0:root::/bin/sh

这个有两个问题,一是root的密码不知道,二是没给root指定HOME目录
改成
代码:

root::0:0:root:/root:/bin/sh

设定root密码为空,HOME目录为/root,对应的,去img1目录下mkdir root(刷机后的/root)

要设置自定义密码,先在Linux上改一个然后复制/etc/passwd字段的对应内容过来,比如
代码:

root:$1$FlXXJQ54$l.bhqOx.OHY6mR9nAuomF0:0:0:root:/root:/bin/sh

$1$FlXXJQ54$l.bhqOx.OHY6mR9nAuomF0就是加密后的toor。
这样设置之后,默认密码为toor(toor是root的反写,也是BackTrack的默认密码)。
当然设成空密码刷机之后再telnet进去用passwd改也是一样的,
只要别忘记就好。

分析文件结构,我觉得理论上只改img2/passwd就够了,
为了稳妥起见,img1/etc/passwd也不妨照改一份。

雅黑字体:
这个更简单了,在img1/usr/local/bin/Resource下有四个ttf文件,只有gkai00mp.ttf是实际字体,另外三个是指向它的符号链接。只要把雅黑(msyh.ttf)改名并覆盖掉原始的gkai00mp.ttf就可以了。

改完之后按首贴的方法重新打包img1和img2目录生成新的刷机固件即可。

来源

0 个无聊的人: