本帖最后由 f541883216 于 2018-3-3 07:15 编辑
接下来,就可以展开tgz文件包,研究固件的详细内容了。展开后从如下截屏可以看到很多的固件文件。现在来判断所有这些固件的文件是做什么的,还为时过早。但有两个文件的用途,根据经验是可以确定无疑的。一个是bzImage,另一是initrd.boot。
下面我来解释一下这两个文件:
在linux系统中,vmlinux(vmlinuz)是一个包含linux kernel的静态连结的执行档,档案型态可能是linux接受的执行档格式之一(ELF、COFF或a.out),vmlinuz是一种统称,有两种具体的表现形式zImage和bzImage。bzimage和zImage的区别在于本身的大小,以及加载到内存时的地址不同,zImage在0~640KB,而bzImage则在1M以上的位置。
随着 linux Kernel 的成长,核心的内容日益增加超越了原本的限制大小。 bzImage (big zImage) 格式则为了克服此缺点开始发展,利用将核心切割成不连续的记忆体区块来克服大小限制。
bzImage 格式仍然是以zlib 演算法来做压缩,虽然有一些广泛的误解就是因为以bz- 为开头,而让人误以为是使用bzip2 压缩方式(bzip2 套件所带的工具程式通常是以bz- 为开头的,例如bzless, bzcat ...)。bzImage 档案是一个特殊的格式,包含了 bootsect.o + setup.o + misc.o + piggy.o 串接。 piggy.o 包含了一个 gzip 格式的 vmlinux 档案(可以参看 arch/i386/boot/下的 compressed/Makefile piggy.o)
initrd文件是Linux初始RAM磁盘文件。初始RAM磁盘(initrd)是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统[9]。initrd 与内核绑定在一起,并作为内核引导过程的一部分进行加载。内核然后会将这个 initrd 文件作为其两阶段引导过程的一部分来加载模块,这样才能稍后使用真正的文件系统,并挂载实际的根文件系统。
initrd 中包含了实现这个目标所需要的目录和可执行程序的最小集合,例如将内核模块加载到内核中所使用的 insmod 工具。在桌面或服务器 Linux 系统中,initrd 是一个临时的文件系统。其生存周期很短,只会用作到真实文件系统的一个桥梁。在没有存储设备的嵌入式系统中,initrd 是永久的根文件系统。
有了这两个文件我们就可以做个启动盘试一试了。至少可以建立一个最小系统,作为进一步破解固件的基础。
思索与分析:
现在我们要用bzImage,initrd.boot这两个文件做一个启动盘。但我们需要大约了解威联通DOM的结构是什么样的。我可以用SSH登陆威联通TS288设备,然后用fdisk -l命令查一查。但同时我也会在网上查一查。我发现了一篇日文的文章“QNAPの基本構造について”[10]一下让我对威联通系统结构有了深入的了解。大大加快了破解固件的速度。部分截屏如下:
接下来我就开始创建一个威联通的启动盘了。启动盘接结构和原理与我在【老骥伏枥-鸡年大礼包】[11]中创建黑群晖启动盘是一样的, 那篇文章有非常详细的介绍。这里就不赘述了。有兴趣的坛友请参看我的那篇文章。这次我做的黑威联通启动盘,从原理到风格都与黑群晖启动盘一致。有意思的是,去年【鸡年大礼包】做的是黑群晖启动盘。今年【狗年大礼包】做的是黑威联通启动盘。而且风格一致,像是系列作品。
我的威联通启动盘接结构截图如下:
我的启动盘与威联通DOM稍有不同。我放大了sd?1分区,因为威联通启动用的是旧的grub 0.97,而我打算用更新版的GRUB2。另外我还要引进Tiny Core Linux[1],做系统救援,和启动创建工具母盘。我还做了一个sd?7分区,作为备用。其中的?表示linux 的udev设备加载时分配的a-z字符。
把GRUB2; Tiny Core文件拷贝到sd?1分区中。编辑修改grub.cfg文件。其它分区sd?2至sd?7全部放空。把固件包中的相关文件拷贝到sd?2分区中。一共是如下十个文件:
bzImage
bzImage.cksum
initrd.boot
initrd.boot.cksum
qpkg.tar
qpkg.tar.cksum
rootfs2.bz
rootfs2.bz.cksum
rootfs_ext.tgz
rootfs_ext.tgz.cksum
你可能会问,你如何知道要拷贝这十个文件呢?这是得益于那篇日文的文章。做逆向工程破解固件时,除了自己的经验外,借助互联网吸取他人的经验会取得事半功倍的效果。
破解固件的启动盘就这样制作完成了。马上启动一下试一试。嘿嘿,很快控制台就出现了如下的截图登录界面:
显然,破解威联通固件并不是那么简单。威联通固件哪会只设一个坑,迈过去就是一马平川呢。不过这也是一个好兆头。证明了固件的最小系统已经成功建立起来了。既然有登录界面,那我就就用威联通的默认用户:admin,和默认密码:admin登录一下试一试。哈哈,可以成功登录系统。截图如下:
接下来我要介绍一下威联通内核的启动过程。 这也是从那篇日文文章[10]上读来的。所以我才会说,它大大加快了我的破解固件的速度。
威联通启动最小系统内核后
1.按照/etc/inittab中所述执行以下两个进程
null :: sysinit:/sbin/hwclock - hctosys
:: sysinit:/etc/init.d/rcS
2.根据/etc/init.d/rcS的描述(/etc/rcS_init.d/S20init_check),在/etc/rcS_init.d /下执行每一个名字从S?开始的脚本。
它的脚本代码如下截图:
3.执行/etc/rcS_init.d/S20init_check并开始时安装各种设备。
mount -t proc /proc /proc
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
mount -o remount,rw /
mkdir /sys
mount -t sysfs sysfs/sys
[ -d /tmp ] || mkdir /tmp
mount -t tmpfs tmpfs /tmp -o size=32M
4.从Model_Name.conf和BOOT.conf中加载Model名称和体系结构。
#Model_Name是Makefile中的INTERNAL_MODEL,TS-879U和TS-879都是TS-879
Model_Name =`cat /etc/default_config/Model_Name.conf 2> /dev/null`
#BOOT_CONF是平台类型,TS-879是TS-NASX 86
BOOT_CONF =`/ bin / cat /etc/default_config/BOOT.conf 2> /dev/null`
if [“x $ {Model_Name}”=“xTS - 230”] || [“x $ {Model_Name}”=“xHS - 200”]; then
/bin/echo s35390a 0x30> /sys/class /i2c-dev /i2c-3 /device /new_device
fi
※可以用cat命令查看一下:Model_Name.conf和BOOT.conf来确定设备的model和cpu类型。
#cat /etc/default_config/Model_Name.conf
TS-869
#cat /etc/default_config/BOOT.conf
TS-NASX 86
5.装载USB设备(与USB stick文件系统安装分开)
74 [$?= 0] || /bin/echo“mount usbfs failed。”
6.使用hal_app命令展开DOM的第二个分区上的rootfs2.gz。
#从启动分区中提取rootfs2.gz
/sbin/hal_app --boot
作为一个特定的进程,在/mnt/boot_disk/上挂载DOM的第二个分区。之后,将/mnt/boot_disk/boot/rootfs2.bz的内容扩展为解压“tar jxf /mnt/ boot_disk/boot/rootfs2.bz -C /”
※rootfs2.bz的内容是这样的,会为根目录中的/home;/lib;/usr添加更多的系统所需的程序。
drwxr-xr-x 4 admin administ 4096 Apr 10 04:37 home/
drwxr-xr-x 3 admin administ 4096 Apr 10 04:23 lib/
drwxr-xr-x 8 admin administ 4096 Apr 10 04:32 usr/
这条信息很重要,它给了我明确的暗示。/sbin/hal_app这段程序很有可能就是破解威联通固件的第二个坑。显然,/sbin/hal_app是与硬件有关联的。为需要破解它才能实现从DOM的第二个分区上提取,并展开rootfs2.gz。让我们先暂时记住这个坑,继续完成启动过程的介绍。
7.挂载根(HDA_ROOT),ext_root,和swap。
用一个名为storage_util的命令,它所做的事情已经超出了猜测的范围。我很抱歉我认为/mnt/HDA_ROOT和/mnt/ext和swap是在从脚本编写方法思考之后安装的。
/bin/echo“mount HDD system root ...”
/bin/echo "mount HDD system root..."
# parse the out put and find count
/sbin/storage_util --sys_startup
# mount
/dev/md9 on /mnt/HDA_ROOT type ext3 (rw,data=ordered)
/dev/md13 on /mnt/ext type ext3 (rw,data=ordered)
# cat /proc/swaps
Filename Type Size Used Priority
/dev/md256 partition 530108 0 -1
这条信息也很重要,它是不是另一个坑,现在还不能确定。让我们先暂时做个标记,视破解的情况而定。
8.使用sys_startup_p2选项激活LVM并挂载cachedev设备。
#run hal_daemon,check_lan_port.sh is implement by load_lan_module.sh and hal_util_net.c
/sbin/daemon_mgr hal_daemon start "/sbin/hal_daemon -f"
/sbin/storage_util --sys_startup_p2
由于NASYUN的篇幅限制,请继续看楼下,【手把手教你破解威联通固件】, 精彩继续!
|