|
本论坛【重磅】全球独家【老骥伏枥-牛年大礼包】黑威联通在线升级的若干问题
前言
本文是【老骥伏枥-狗年大礼包】嵌入式linux逆向工程:手把手教你作黑威联通[1]与【老骥伏枥-原创】制作黑威联通启动盘:进阶篇[2]的续篇。关于破解固件,逆向工程技术的细节在【狗年大礼包】那篇文章中已经详细介绍过了,这里不再赘述。【狗年大礼包】介绍办法属于静态分析的破解,需要使用工具母盘下载固件后打补丁来制作黑威联通启动盘。因此不能实现在线直接升级。也不适合没有linux基础的小白和菜鸟。这次的【牛年大礼包】将介绍如何实现动态破解,即在原始固件启动后,采用挂载“钩子”的办法来实现动态破解。以解决在线固件直接升级的问题。
最近威联通厂家对系统固件频繁升级。终止vQTS系统。并发布了基于公有云的QuTScloud将QNAP NAS的智能操作系统部署于公有云上。在可支持的云端服务中安装QuTScloud操作系统,运行云NAS,解决目前使用中的云端平台无法提供档案管理及弹性共享等需求。透过QuTScloud服务不需要自己处理云端环境复杂的进阶维护,享受轻盈又精省的NAS体验。但这个QuTScloud是需要授权并收费的。而且License费用非常贵,一年的费用足足可以购买自己的私有服务器了。威联通还在不断推出需要License付费的应用,以前免费的应用也逐渐开始变为付费应用。支持这个功能的基础是LicenseCenter QPKG这个应用包。而且QTS也逐渐靠拢以此为基础的License付费应用。为此【牛年大礼包】也做了一些必要的准备。以便于今后可以支持QTS和QuTScloud两种系统。
笔者在坛友rmt网友的大力帮助下,先后完成了“破解密文许可证算法及注册机.pdf”,“破解威联通QuTScloud付费License及注册机思路.pdf”,“关于如何实现自授权的方法.pdf”,“关于如何实现通过OpenWRT虚拟路由器授权的方法.pdf”等有关文章。但考虑到这些破解文章的发表不利于厂家的新产品研发,因此暂不发表上述文章。有兴趣研究这些技术的网友,可以联系我们。
需要强调的是,我不是一个黑客。资源来自于威联通官网公布的系统包和发布的固件。参考文献中注明所有引用的出处。本文深入浅出地介绍如何对原始固件启动后安插钩子的办法来实现动态破解的嵌入式linux逆向工程技术。此【牛年大礼包】工具盘的理念和启动引导的基础架构设计均绝对是老骥伏枥本人独创,并合法利用开源项目 (Tiny Core Linux Project) [3] 开发的。 也是老骥伏枥通过 NASYUN 论坛在全球独家首发。此工具盘为的是进行教学, 研究和技术交流。 禁止用于任何商业目的。
第一讲
关于固件的在线升级
自从【狗年大礼包】发表三年以来,广大坛友们勇于实践,使用工具母盘下载固件后打补丁来制作黑威联通启动盘,进行研究和技术交流。大家普遍提出了关于固件的在线升级的问题。由于【狗年大礼包】介绍办法属于静态分析的破解,需要使用工具母盘下载固件后打补丁来制作黑威联通启动盘。因此不能实现在线直接升级。那么如何才能实现在线直接固件升级呢?
让我们先来厘清一些在线直接固件升级到底需要解决什么问题才能实现。固件升级时肯定是固件的代码有了不同程度的更新。这种更改肯定对原有的破解补丁有影响,如果直接固件升级的话,会破坏原有的补丁。退一步而言,就算不升级固件,也不能直接使用原厂固件来覆盖包含有补丁的固件。原因很简单,如果可以直接使用原厂固件而不需要打补丁的话,那就不需要破解了。
【狗年大礼包】中我使用的办法是做一个/sbin/hal_app1模拟/sbin/hal_app三个有关于硬件相关的启动功能,替代/sbin/hal_app的这三个功能。这样做有优点也优缺点。优点是简单易行,缺点是要补丁所有相关的用到这个功能的脚本文件。使用工具母盘的人和仔细读过那篇文章的人都知道,安插补丁需要修改10几个文件。还有就是这样的做法不可以在线固件直接升级。
因为一方面需要安插破解补丁文件,一方面又不能静态插入补丁。解决的思路当然只能是在原始固件启动后,采用挂载“钩子”的办法来实现动态破解。以解决在线固件直接升级的问题。这也是嵌入式linux逆向工程中常用的技术。实现起来也不难。关键的问题是,必须首先完成静态分析的破解才有机会进一步实现动态破解。【狗年大礼包】就是我们这次教程的基础。
这次我们在系统启动之前,不能修改/sbin/hal_app文件了。当然需要改在启动之后才能对原系统固件动手脚。我们可以在启动之后修改/sbin/hal_app。但我再次通过使用IDA Pro工具对/sbin/hal_app仔细分析之后发现。其实不必修改/sbin/hal_app,只需要对model.conf中的启动盘进行仔细配置。它的三个有关于硬件相关的启动功能都是可以正常工作的。
此处内容已经被作者隐藏,请输入验证码查看微信扫描右侧二维码关注nasyun官方微信,回复“看帖”,获取验证码。在微信里搜索“那是云”也可关注官方微信。
另外,/sbin/hal_app中还有一个蹊跷的细节。它会读取启动盘根目录下的grubenv文件来确定 --get_boot_pd_part port_id=XXX,obj_index=YYY的返回值。这一点我在【狗年大礼包】工具母盘中没有注意到的一个蹊跷的细节。因为采用了替代/sbin/hal_app的这三个功能,所以忽略了这些细节的东西。因为这次将实施动态破解,所以希望改动的东西越少越好。因此再次通过使用IDA Pro工具对/sbin/hal_app仔细分析,才发现了这个问题。这样一来,我们只需要配置model.conf文件和添加grubenv文件,就不需要再对/sbin/hal_app进行任何修改了。与之对应的修改补丁也就都不需要了。
但是为了能够支持各种各样的不同硬件,动态破解补丁仍然是必不可少的。至少model.conf这个配置文件必须在固件启动后,系统建立起来以前,动态地补丁到系统中才行。否则就不可能实现黑威联通。另外还有就是添加必要的网卡驱动模块,系统温度测控Super I/O芯片驱动模块等等。
在讲解详细动态破解补丁之前,让我们再来复习一下【狗年大礼包】中关于威联通启动最小系统内核后的一系列执行动作。这对于我们选择挂载“钩子”的位置甚为重要。
威联通启动最小系统内核后
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并且开始实施安装各种设备。
从上述的分析中可以看出,我们可以有几种挂载“钩子”的位置:
a. 添加一个/etc/rcS_init.d/S10hook_init_before_S20文件,让它在开始执行S20init_check之前做些必要的补丁任务。
b. 添加一个/etc/rcS_init.d/S21hook_init_after_S20文件,让它在开始执行S20init_check之后做些必要的补丁任务。
c. 因为S20init_check开始实施安装各种设备,而有些任务需要插入S20init_check之中进行,因此我们可以用sed命令在S20init_check脚本中插入钩子。
本次的【牛年大礼包】就是采用sed命令在S20init_check脚本中插入钩子办法。在linux启动的grub.cfg文件中,使用initrd ($bootdev,2)/boot/initrd.boot ($root)/patch.gz 的方法,在initrd.boot之后再次加载patch.gz补丁,覆盖掉/etc/model.conf文件和覆盖掉/sbin/init执行脚本,并在init中安插laojifuli_patch钩子,这是一个脚本文件,放在patch.gz补丁中,大家可以根据自己的需要把任务添加到它里面去。例如:添加必要的网卡驱动模块,系统温度测控Super I/O芯片驱动模块等等。具体源代码请参见/sbin/init文件。我在【牛年大礼包】中,已经添加了一些必要的虚拟机用的网卡驱动模块。最新的版本中,网卡驱动模块/etc/init.d/load_lan_module.sh脚本来管理。加载网卡驱动模块就变得非常容易了。只需要把相应的.ko文件拷贝到/lib/modules/4.14.24-qnap目录中即可。
由于NASYUN的篇幅限制,请看楼下,第二讲 【关于序列号与洗白】,精彩继续!
|