黑华芸|爱速特|华硕ASUSTOR ADM嵌入式Linux逆向工程(之二)

前言

在【兔年大礼包】中详细讲解了如何手工破解华芸NAS系统[1]。并提供了X86的华芸AS-304T系列启动盘实例。因为【兔年大礼包】中讲解的是X64系列的ADM手工破解过程,但并没有提供X64系列的ADM启动盘实例,坛友们希望我再写一篇关于华芸NAS系统破解(X64系列)的文章,并提供一个X64系列的启动盘实例。再专门讲解一下如何实施程序化的破解,以及如何创建启动盘的问题。因此在龙年来临之际,作为又一个嵌入式Linux逆向工程的教学范例。我将为大家提高关于实施程序化的破解和创建启动盘。希望大家能更好地学习,研究逆向工程的技术。从中学到有益的东西。

需要强调的是,我不是一个黑客。文章中提到的固件资源均来自于华芸官网公布的系统包和发布的固件。在参考文献中注明了所有引用的出处。此【龙年大礼包】启动工具盘的理念和启动引导的基础架构设计均绝对是老骥伏枥本人独创,并合法利用开源项目 (Tiny Core Linux Project) [2] 开发的。 也是老骥伏枥通过 NASYUN 论坛在全球独家首发。此工具盘为的是进行教学, 研究和技术交流。 禁止用于任何商业目的。

第一讲

程序化的破解创建启动盘的设计思想方法

在【兔年大礼包】中详细讲解了如何手工破解华芸NAS系统。但坛友们普遍反映,手工破解华芸NAS系统难度大,不易实施。学习起来也有一定的困难。更希望能详细讲一讲程序化的破解。

关于华芸嵌入式Linux逆向工程的手工破解问题在【兔年大礼包】中已经详细讲解了。这里就不赘述了。从整个手工破解过程看,我们需要做如下的一些对系统固件的改造。

  1. 要修改/usr/lib/libnasman.so.0.0这个动态库的二进制代码。
  2. 要利用Linux的所谓动态库劫持技术,补充一个用户自定义的动态库。
  3. 需要把添加的动态库劫持补丁到系统。
  4. 考虑到针对不用的硬件,还可能需要添加相关的设备驱动。例如:网卡驱动等等。
  5. 针对华芸的ADM系统破解,提供一些相应的工具程序。
  6. 要创建一个用户自定义的启动盘。

如果要把上述的内容,全部通过程序化来实现,就可以方便地制作破解的ADM系统了。

为了实施程序化破解,肯定需要首先构建一个可以实施的工作环境。在这个环境中,运行一些相关的工具程序,一步一步地完成上述的过程。为此我决定选用开源项目 (Tiny Core Linux Project)来构建工作环境。为什么选用Tiny Core呢?从名称就可以知道,它是一个非常小的Linux系统。破解用的工作环境,在完成破解后基本上就没有用可以废弃了。所以工作环境只要能够提供破解所需的工具的最小集合就足够了。另外Tiny Core系统还有一个优点,就是可以根据需要自由剪裁系统工具集,这非常适合我们用它来构建破解的工作环境。

为了启动盘实例的方便发布,并能同时支持legacy BIOS和UEFI。我会考虑把破解工作环境的发布盘做成一个iso9660标准格式的文件。这样的话,用户可以直接用于虚拟机上。也可以用工具软件,例如:rufus-3.8.exe 等等,将iso文件制成USB启动盘来使用。

接下来让我继续讨论在破解工作环境中的工作步骤:

第一步:要获取ADM官方网站发布的固件。

它的下载地址是:https://downloadgb.asustor.com/download/adm/X64_G3_4.0.5.RRS1.img

这个固件是【兔年大礼包】中详细讲解的固件。但是在写【龙年大礼包】的时候,华芸已经把固件升级到了X64_G3_4.2.1.RGE2。

它的升级版下载地址是:https://downloadgb.asustor.com/download/adm/X64_G3_4.2.1.RGE2.img

因此,【龙年大礼包】的破解中,会以这个版本为范例。因此也会包括这个版本的破解。

为了让破解工作环境的通用性更强,我决定为获取ADM固件专门单独写一个程序。我把它命名为:get_adm_firmware

第二步:要对获取的固件中的libnasman.so.0.0动态库做二进制代码改造。这是比较麻烦的一项工作,可以用很多方法。比如对于那些需要改造的点,可以使用AI启发式扫描定位,那样做的的话,程序设计会比较复杂,通用性强。但我准备采取更简单的办法,做一个libnasman.so.0.0模板,以此模板来定位改造点。这样会使程序设计大大简化。但缺点是对于每次升级,都需要再做另一个模板(其实也未必,小版本升级时模板并不需要变动。例如:4.0.5.RRS1升级到4.0.5.RT42时模板就没有变动。甚至升级到4.1.0.RGS1时,旧模板仍然可用,但可能会存在小的不匹配或bug),通用性差。因此,我决定为这项工作也专门单独写一个程序。我把它命名为:patch_libnasman

第三步:对于破解过程中:补充一个用户自定义的动态库,添加动态库劫持补丁到系统,添加相关的设备驱动,添加相应的工具程序等等工作。这些事情都时静态的。可用事先把这些需要的程序,文件都准备好。在工作环境中,将它们全部放在一个指定的文件系统的目录中。为此,我在工作环境中建立了一个目录。我把它命名为:patch目录。

第四步:创建用户自定义的启动盘,将上述三个步骤准备好的东西整合在一起,创建成一个用户自定义的启动盘。我决定为这项工作也专门单独写一个程序。我把它命名为:create_adm_boot

以上就是我的程序化破解创建启动盘的设计思想。我的这些步骤和程序只是根据我的设计思想创建的。大家可以根据自己的需要,进行裁剪和改造。也可以对其中的某个程序做优化替代。例如:把patch_libnasman的模板来定位改为AI启发式扫描定位,等等。我写这篇文章的目的,就是专门讲解一下如何实施程序化的破解,以及如何创建启动盘的问题。也就是说:“授人以鱼不如授人以渔”。接下来我会讲解破解工作环境的细节。

第二讲

破解工作环境的细节

在这一讲中,让我们来看看破解工作环境中的一些细节设计。以便坛友们可用利用我的破解工作环境,对后续的升级版本继续做逆向工程。

根据上一讲的设计思想,我会在破解工作环境中建立两个目录:/home/tc/Template模板和/home/tc/patch补丁目录。Template 模板目录中将主要用于存放对libnasman.so.0.0动态库做二进制代码改造用的模板。另外,也会存放一些与版本有关添加相关的设备驱动等模块。这个目录中的东西,都是为程序化的破解辅助用途的。

patch 补丁目录里面存放用于给ADM固件的补丁。这里面会包括,改造后的libnasman.so.0.0动态库,用户自定义的劫持用的动态库,动态库劫持补丁,添加相关的设备驱动,和我为破解添加的相应工具程序,等等。在patch 补丁目录中,建立了与ADM系统对应的目录结构。例如:改造后的libnasman.so.0.0动态库,需要放回系统的/usr/lib/目录中,替换掉原系统的libnasman.so.0.0动态库。因此在patch 补丁目录就会有/usr/lib/ libnasman.so.0.0 文件。这个文件将会由破解程序创建生成,等等以此类推。在patch 补丁目录里的东西,最终会用程序打包,生成一个patch.gz的补丁文件,用grub加载到ADM的固件中。

这两个目录的内容,大家可用参照我这次提供的破解工作环境的发布盘ADM_CreateBoot.iso做分析。来了解我的设计思想细节。

关于get_adm_firmware程序,由于破解工作环境中并不包含ADM系统的固件。这个程序的主要目的是一个给用户一个下载和分析ADM系统的固件的工具。同时还需要对固件进行解包和验证固件的chsum值,确保固件为官方发布的原版。破解工作环境的Tiny Core系统可以支持大多数的网卡,但并不能保证支持所有的网卡类型。启动破解工作环境后,我已经为大家开通了ssh服务。方便大家执行破解程序。在设计get_adm_firmware程序时,我的设计是支持两种方式的获取固件的方法。

可以运行命令:

get_adm_firmware https://downloadgb.asustor.com/download/adm/X64_G3_4.2.1.RGE2.img

直接从官网获取固件。

也可以事先下载好固件,把它拷贝到破解工作环境的/home/tc目录中,再运行命令:

get_adm_firmware X64_G3_4.2.1.RGE2.img

来解析已经下载的固件。

如果解析,验证,解包成功。就会在破解工作环境的/home/tc目录中创建一个boot目录,将创建启动盘所需的固件系统文件,暂定存放在该目录之中。

关于patch_libnasman程序,这是破解固件的核心程序。它的目标就是要修改libnasman.so.0.0这个动态库的二进制代码。华芸的X64固件,以X64_G3_4.2.1.RGE2.img为例,包含了X86_64系列的九个机种。可以说基本上是X86_64系列的全系列破解。我在【兔年大礼包】中已经详细讲解了破解的机制。因此在设计patch_libnasman程序时,考虑到系列的类型,我会给一个index=x的输入参数。具体列表和对应的机型系列如下:

=================================================================

  • index=0: (AS6 Series) Atom(TM):”D27″,”D25″
  • index=1: (AS70 Series) Intel Core i3 dual-core”
  • index=2: (AS50,AS51 Series) Celeron:”J1800″,”J1900″
  • index=3: (AS61,AS62 Series) Celeron:”N30″,”J30″,”N31″,”J31″;Pentium:”J37″,”N37″
  • index=4: (AS63,AS64 Series) Celeron:”J33″,”N30″,”J34″
  • index=5: (AS52,AS53 Series) Celeron:”J4005″,”J4025″,”J4105″,”J4125″
  • index=6: (AS65 Series) Atom:”C3538″
  • index=7: (AS71 Series Gen2) Intel:”Core(TM)”,”Xeon(R)”
  • index=8: (AS66,AS67 Series Gen2) Celeron: “N5105”

=================================================================

这些系列机型中,每一个特定的机型的硬件配置都在libnasman.so.0.0动态库中有对应关系的硬编码。如果你用虚拟机做实验,你可以通过调配虚拟机的配置,运行不同的机型。如果你使用实体机做实验,就要主要挑选一个适合你的实体机的系列。例如:我用蜗牛矿渣机时,就会选index=4,生成AS6304这个类型的启动盘。当然,也可生成其它系列的启动盘,但你需要启动ADM系统后,用我提供的工具程序:Nas_AttributeDump_Nas_Disk_Info等工具,具体确认哪个系列更适合你的实体机。这些问题,需要在创建启动盘后,慢慢地仔细调整。

为了让patch_libnasman程序更具有通用性,我在设计时为大家留下了一个模板选择接口。它会检查/home/tc/Template目录中的libnasman.so.0.0.<版本号>模板,容许你选择使用哪个模板去破解哪个版本的ADM系统。因此,大家也可以自行破解libnasman.so.0.0.<你的模板>,使用我的patch_libnasman程序去生成补丁文件。当然,大家也可以不用patch_libnasman程序,直接把自行手工改造的libnasman.so.0.0文件,拷贝到/home/tc/patch/usr/lib/补丁目录也是可以的。

大家可以自行对ADM系统做补丁和改造,只要把你做的改造文件拷贝到/home/tc/patch补丁目录中的与ADM系统相对应目录中即可。

关于create_adm_boot程序。这段程序就比较简单了。就是把已经解析好的ADM系统文件和补丁包集成在一起,创建一个ADM系统的启动盘。ADM系统的启动盘结构很简单。它有三个分区,第一分区是grub的启动引导分区。第二分区是ADM系统分区。第三分区是ADM系统备份分区。为了方便大家以后调试ADM系统,我在创建启动盘的时候,没有生成ADM系统备份分区,因为没有备份分区并不影响ADM系统的运行。而是把第三分区临时生成了”自举式Tiny Core破解工作环境”。这样可以方便大家通过自举式Tiny Core工具调试ADM系统。如果一切调试都没有问题,可以直接把第二分区拷贝到第三分区,做成release版(发布版)的启动盘。启动盘可以是USB盘,也可以是SATA硬盘,但不能是IDE硬盘。当然,最好用USB盘做启动盘。因为启动盘很小,只需要512M的尺寸即可。

第三讲

体验程序化的破解ADM系统与实践范例

为了便于大家学习掌握嵌入式linux逆向工程知识,【龙年大礼包】将为大家提供一个破解工作环境的发布盘ADM_CreateBoot.iso。此次的工具盘是iso9660标准格式的文件。该盘中不包含任何原厂的固件。读者需要自行去华芸的官网下载相应的固件。该盘的设计理念,系统结构,所包含的程序代码均为老骥伏枥本人独家原创已及合法使用开源的TinyCore系统。请坛友们遵守 GNU General Public License, 未经授权禁止用于商业用途。 该工具盘仅仅为的是进行教学, 研究和技术交流, 禁止用于任何商业目的

该盘的提取地址是:

接下来我将要以VirtualBox虚拟机为例,介绍具体的实践范例。

将【龙年大礼包】将为大家提供一个破解工作环境的发布盘ADM_CreateBoot.iso的iso文件添加到虚拟机的IDE口,并设置为从CDROM启动。请看如下截屏:

图片[1]-黑华芸|爱速特|华硕ASUSTOR ADM嵌入式Linux逆向工程(之二)

接下来,再创建一个USB盘,尺寸是521M就可以了,大了也没有用。因为使用破解工作环境的发布盘工具只会用到521M。下面这个截图,是创建好启动盘,删除光盘后,创建数据盘时的截图。

图片[2]-黑华芸|爱速特|华硕ASUSTOR ADM嵌入式Linux逆向工程(之二)

当然还要配置网卡。网卡可以选择Intel PRO/1000 MT Desktop,这是e1000网卡。 ADM系统自带这个网卡的驱动。当然,也可以选择virtio-net网卡,我在破解4.2.1.RGE2版本时,作为添加驱动的例子,为大家添加了virtio-net网卡驱动,后面还会专门讲一讲编译驱动模块的问题,SATA控制器等等,这里就不截图了。设置完成以后,就可以启动虚机了。请看如下截屏:

图片[3]-黑华芸|爱速特|华硕ASUSTOR ADM嵌入式Linux逆向工程(之二)

此时只能选择“创建华芸启动盘的TinyCore 10.1 System工具”,输入用户名:admin,密码:admin。然后会进入TinyCore的控制台界面。 此时我已经为大家打开了SSHD服务,容许你使用PuTTY SSH Client方便连接操作。屏幕上显示是英文的,为什么不用汉语的呢?因为希望这个工具盘尽量小,所以它没有安装汉字字库。

在TinyCore的控制台界面,默认的用户:tc,默认的密码:admin。破解工作环境的默认的工作目录是/home/tc

接下来就可以在破解工作环境中按照第一讲的设计理念,开始对华芸的ADM固件进行程序化的破解了。

先做第一步,运行命令:get_adm_firmware  获取华芸ADM系统的固件。建议直接从官网获取。【龙年大礼包】现在经过测试的最高版本是4.2.1.RGE2。大家也可试其它版本,但不能保证可以正常运行。建议在使用【龙年大礼包】的程序化破解工作环境之前,请仔细阅读【兔年大礼包】讲解的破解原理。以达到学习,研究华芸NAS嵌入式Linux逆向工程目的。笔者希望传授知识,而不是破解华芸的ADM系统让大家来使用。如果你想使用该系统,请购买正版的系统。

get_adm_firmware https://downloadgb.asustor.com/download/adm/X64_G3_4.2.1.RGE2.img

执行上述命令成功后,在TinyCore的控制台界面会显示出有关信息。这里就不截图了。

再做第二步,运行命令:patch_libnasman index=? ,其中?是0-8之间的一个数字,请参见第二讲中的详细介绍来选择。下面仅仅以patch_libnasman index=4 为例做说明,并不代表必须选择index=4

./patch_libnasman index=4

There are following ADM version for you to patch ADM firmware
[1]=>[4.2.1.RGE2]
[2]=>[4.0.5.RRS1]
Please select the following [number] to patch ADM firmware[defaule is 1]:1
Start to patch the ADM firmware version: [4.1.2.RGE2]
===========================
=======By Laojifuli========
===========================
Starting patch the CPU PCI Brideg
ISA bridge: Intel Corporation Atom Processor Z36xxx/Z37xxx Series Power Control Unit (rev 11)
===========================
Starting patch the SATA controller
1: SATA controller: Intel Corporation Atom Processor E3800 Series SATA AHCI Controller (rev 11)
2: SATA controller: Marvell Technology Group Ltd. Device 9215 (rev 11)
===========================
Starting patch the Network Adapter
1: Ethernet controller: Intel Corporation I211 Gigabit Network Connection (rev 03)
===========================
Starting patch the IDE controller
Host bridge: Intel Corporation Atom Processor Z36xxx/Z37xxx Series SoC Transaction Register (rev 11)
===========================
========Successful=========
===========================

执行命令后,屏幕上会出现提示;让你选择版本。这次的【龙年大礼包】支持两个版本,一个是【兔年大礼包】中讲解的版本,另一个是比较新的4.2.1.RGE2版本。如果你有自己的版本,只要将它放在模板的目录中,按照第二讲中目的命名规则,也会在屏幕上会出现提示。默认的选择是以字符排序的高版本在前,低版本在后。选择版本后,就会继续完成破解,并显示结果成功与否。

为了便于大家做实验,我的一些配置和实验结果如下:(并不全面,仅仅是一小部分)

index=0实验结果: [AS-602T] 配置一个SATA卡,数据盘必须设定在:sata port=6或7 。eSATA port=4或5 。
index=1实验结果:[AS7008T] 必须有两个SATA卡,数据盘必须设定在:Sata Order [8]: 4, 5, 0, 1, 8, 9, 6, 7。ESata Order [2]: 2, 3。
index=2实验结果:[AS5004T] 配置一个SATA卡,数据盘必须设定在:Sata Order [4]: 0, 1, 4, 5。ESata Order [2]: 2, 3。
index=3实验结果:[AS6102T] 配置一个SATA卡,数据盘必须设定在:Sata Order [2]: 0, 1。ESata Order [2]: 2, 3
index=4实验结果:[AS6304T] 配置一个SATA卡,数据盘必须设定在:Sata Order [4]: 1, 0, 2, 3。不支持eSata
index=5实验结果:[AS5204T] 配置一个SATA卡,数据盘必须设定在:Sata Order [4]: 0, 1, 2, 3。不支持eSata
index=6实验结果:[AS6504R] 配置 一个SATA卡,数据盘必须设定在:Sata Order [4]: 7, 6, 5, 4。不支持eSataindex=7实验结果:[AS7112R] 必须有三个SATA卡,数据盘必须设定在:Sata Order [12]: 27, 49, 50, 2, 26, 48, 51, 3, 25, 24, 1, 0。index=8实验结果:[AS6702T] 配置一个SATA卡,数据盘必须设定在:Sata Order [2]: 1, 0。

关于如何确定硬盘的盘位,在【龙年大礼包】中我为大家准备了lsscsi  命令。用它可以检查自己机器当然的SATA卡上硬盘的port配置。如果是虚拟机,这个port是可以自行调整的。但实体机就不能随意调整了。例如:我配置的AS-602T这个机型

tc@box:~$ lsscsi
[7:0:0:0]    disk    ATA      VBOX HARDDISK    1.0   /dev/sdb
[8:0:0:0]    cd/dvd  VBOX     CD-ROM           1.0   /dev/sr0
[10:0:0:0]   disk    VBOX     HARDDISK         1.0   /dev/sda

数据盘在ATA  VBOX  port 7的位置。USB盘在VBOX  port 10的位置。CDROM盘在 port 8的位置。

大家可以对照我上面的实验结果列表,确定自己的硬件适合安装哪个系列的破解。一般的情况是数据盘必须在指定的位置上。启动盘最好不要在指定的数据盘位置上。这样的话,在安装ADM系统的时候,启动盘就不会出现的数据盘的列表中,就不会出现误将启动盘做为数据盘格式化和删除启动盘内容的危险。

其实,不论配置成哪个系列,都是用相同的ADM系统软件。性能主要是由硬件的配置来决定的。因此如果你用虚拟机安装系统时,上述的九个系列性能上其实并无差异。差异仅仅是配置而已。以及启动后显示的系统系列信息不同而已。

第三步就是用命令:create_adm_boot创建启动盘了。这个命令没有参数,直接运行程序就可以了。创建启动盘的成败,对于虚拟机而言,一般都不会失败。但有时也会有点问题,例如:我用QEMU虚拟机调试时连续创建了20几次启动盘后,就出现了创建启动盘失败的问题。因此我会彻底删除虚拟机,重建一个新的,问题就解决了。估计是虚拟机系统有点小小的bug吧。对于实体机而言,就与USB盘的质量,以及UEFI或BIOS固件有关系了。所以如果不能创建启动盘,请仔细耐心检查调试。因为创建启动盘的过程比较复杂,我写的create_adm_boot程序也可能存在bug。作为教学的体验盘,请大家多多包含。

启动盘创建完成后,这个破解工作环境的ADM_CreateBoot.iso工具盘的使命就结束了。可以把它扔掉了。

使用创建的启动盘启动系统后,如果出现AS0000T-XXXX的登陆标识画面,就是破解的机型与系统有不匹配的问题。请参考如下截屏:

图片[4]-黑华芸|爱速特|华硕ASUSTOR ADM嵌入式Linux逆向工程(之二)

但这时仍然是可以用默认的账号和密码登录到系统的,登录后可以用我为大家提供的工具,检查和重新配置系统。华芸ADM系统,在没有安装前,默认的账号是:root。密码是:admin它还为大家提供了ssh服务。这就非常方便我们调试系统。

例如:使用默认的账号和密码,通过ssh登录到系统。

xxxxx@J1900-Ubuntu18:~$ ssh [email protected]
The authenticity of host ‘192.168.122.181 (192.168.122.181)’ can’t be established.
ECDSA key fingerprint is SHA256:qYz9pqEjQYh/DAW2irCNBF2+ZjqESK76qcQvpourg5c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.122.181’ (ECDSA) to the list of known hosts.
[email protected]’s password:
root@AS0000T-3687:~ #

登录后可以使用我为大家提供的工具:Probe_Nas_Pch命令查看系统。

root@AS0000T-3687:~ # Probe_Nas_Pch
===Probe_Nas_Pch===
===return[0];data[4]===
root@AS0000T-3687:~ #

可以看到,我们使用的是index=4这个系列的系统,再用工具:Nas_Attribute 命令,这时的PCH: [9]为9。显然是系统与硬件的配置不匹配。序列号Serial Number: [AX1108000PL0000]也不正确。还要就是也没有检查的数据盘。

root@AS0000T-3687:~ # Nas_Attribute
===Dump_Nas_Attribute===
Nas Attributes:
  Model: [AS0000T] (AS [0] Series, PCH: [9], Chassis: [0], Rever: [0])
  Version: [4.0.5.RRS1], Boot From: [/dev/sda2, ext2] (bus: 0x000), HP: [0], S3: [0], KLS: [0], LCM: [0], MA: [0],
OB: [0], WW: [0]
  Serial Number: [AX1108000PL0000], Host ID: [52-54-00-D8-36-87]
  NAS with [1] LAN, [0] USB, [0] SATA, [0] ESATA
  Lan Order [1]: 0,
  Usb Order [0]:
  Sata Order [0]:
  M.2 Order [0]:
  ESata Order [0]:

我还为大家提供了:Dump_Nas_InfoDump_Nas_StatDump_Nas_Disk_Info等等工具,大家可以根据需要来使用。

我这次给大家展示的不成功的情况是:我在硬件上配置了两个SATA controller。因此我需要删除一个SATA controller,才能使系统匹配所选的系统。如何调整系统的匹配问题,需要你自己实验,并积累经验。当然也可以通过逆向工程分析系统程序,来找出不匹配的原因。

一般情况下,启动后先执行:Nas_Attribute,测试系统结构,再执行:Dump_Nas_Disk_Info,查看硬盘。

接下来我再谈一谈关于华芸产品系列号的问题。华芸产品的系列号是写在硬件中的I2C_Device设备上的,这是一个特殊的硬件,华芸有一个专门的硬件驱动,可以通过libnasman.so.0.0动态库里的Scan_I2C_Device函数来读取里面的信息。破解的系统一般不可能配备这种硬件。因此,为了能方便地自定义系列号,我在grub.cfg文件启动时向内核的/proc/cmdline传递一个描述系列号的参数:sn=4660(这个数字可以从1到65000)。默认的4660是因为华芸会把它译成16进制的1234,没有别的意思。不过我建议大家在破解后,还是应当修改一下创建好的启动盘的第一分区中的grub目录中的grub.cfg文件。以免大家都用相同的华芸产品系列号,可能会造成注册或利用华芸产品服务时的问题。例如:可以选用sn=26214(6666六六大顺);sn=34952(8888发发发)等等自己喜欢的系列号。

第四讲

编译华芸ADM系统设备驱动

华芸的ADM系统默认支持e1000和e1000e网卡,它也有igb的网卡驱动,但启动时没有加载。为了让创建的启动盘能够支持更多类型的网卡,我为大家编译了几个网卡驱动,并写了一段启动加载脚本作为例子。

先从简单的启动加载脚本说起。启动脚本要放入/etc/init.d目录。由patch.gz通过grub补丁到系统中。文件名:S10extmodules。它的内容如下:

#!/bin/sh
#
# Load the external modules....(by laojifuli)
#
case "$1" in
  start)
        echo "Starting extmodules...."
        # Supports all 82575/6, 82580, I350, I354, and I210/I211 based gigabit network connections
        modprobe igb
        sleep 1
        depmod # Update the module dependencies for the currently running kernel.
        # Supports VMware vmxnet3 virtual NIC driver
        #insmod /lib/modules/`uname -r`/vmxnet3.ko
        modprobe vmxnet3
        sleep 1
        # Supports Virtio network driver
        #for x in failover net_failover virtio_net; do
        #       insmod /lib/modules/`uname -r`/"$x.ko"
        #done
        #sleep 1
        # Supports RealTek RTL-8139 Fast Ethernet driver
        for x in mii 8139cp; do
                #insmod /lib/modules/`uname -r`/"$x.ko"
                modprobe "$x"
        done
        sleep 1
        NETDEVICES="$(awk -F: '/eth.:|tr.:/{print $1}' /proc/net/dev 2>/dev/null)"
        for DEVICE in $NETDEVICES; do
                ifconfig $DEVICE | grep -q "inet addr"
                if [ "$?" != 0 ]; then
                        ifconfig $DEVICE up
                        sleep 1
                fi
        done
        ;;
  stop)
        echo "Stopping extmodules...."
        # Unlaod all 82575/6, 82580, I350, I354, and I210/I211 based gigabit network connections
        rmmod igb
        # Unlaod VMware vmxnet3 virtual NIC driver
        rmmod vmxnet3
        # Unlaod Virtio network driver
        rmmod failover net_failover virtio_net
        # RealTek RTL-8139 Fast Ethernet driver
        rmmod mii 8139too
        ;;
  restart|reload)
        "$0" stop
        "$0" start
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac
exit $?

再谈编译网卡驱动的问题。

以下是我在编译华芸ADM系统的设备驱动时遇到的问题和解决的办法。如果你不需要自己编译驱动,这一讲的内容可以忽略。

为了编译华芸ADM系统的设备驱动,就必须要下载华芸ADM系统的Linux内核。需要下载asustor公司的改造版本才行(这个版本的下载地址是https://sourceforge.net/projects/asgpl/files/ADM4.1.0/asustor_GPL_linux-5.13.x.tar.bz2/download):asustor_GPL_linux-5.13.x.tar.bz2 这个版本中主目录的Makefile有一些华芸对Linux内核的改动。

实际上的设定如下:

VERSION = 5
PATCHLEVEL = 13
SUBLEVEL = x
TRUESUBLEVEL = 19
EXTRAVERSION =
NAME = Opossums on Parade
ASUSTOR = “asustor”

当然还有一些其它改动。从这里我们可以看到,华芸ADM的Linux内核是从5.13.19版本衍生而来的。华芸是一间很著名的公司,它也非常遵守GPL的规定。它的衍生版本,也为我们提供了必要的Linux内核信息。并不像有些公司,会故意隐瞒一些信息。所以对于华芸ADM的这个衍生版本,我们才可以编译一些自定义的设备驱动。但编译自定义的设备驱动并不是只要又源代码就可以的简单的事情。因此,我才要在这了专门讨论一下关于编译网卡驱动的问题。

编译设备驱动前需要先编译内核。一般情况是:最好能够获得内核编译的“.config”文件。华芸的ADM系统也提供了。这个文件可以从运行的系统中的:/proc/config.gz 得到。华芸的ko模块的版本签名(vermagic)为5.13.x SMP mod_unload modversions。它对应于“.config”文件中的设置:

CONFIG_SMP := y
CONFIG_MODVERSIONS := y
CONFIG_MODULE_SRCVERSION_ALL := y

尽管华芸提供了编译内核的详细信息。CONFIG_CC_VERSION_TEXT=”x86_64-asustor_x64_g3_2020.12.24-linux-gnu-gcc (crosstool-NG 1.24.0) 7.4.0″。但由于它使用的gcc版本7.4.0是比较古老的版本,如果我们用其它的gcc版本编译内核,就有可能造成编译出来的设备驱动与华芸ADM的运行版本不匹配的问题。所以我才要在这里专门讲一讲。

关于CONFIG_MODVERSIONS与Module.symvers的本质:

在编译 vmlinux 时,最后会利用 modpost 来解析 vmlinux.o 对象文件,并将基本内核导出的所有符号都记录到文件 Module.symvers 中去。如果没有打开 CONFIG_MODVERSIONS 选项,那么你看到的 Module.symvers 文件中第一列符号 CRC 校验值都是 0x00000000 。如果打开该选项,那么第一列就会显示出各个符号的 CRC 校验值,如:

0x2d6c0f40      put_mnt_ns      vmlinux EXPORT_SYMBOL
0x6c386a8c      clear_bdi_congested     vmlinux EXPORT_SYMBOL
… …

一旦设置过这个配置选项,就意味着打开了内核的Module versioning功能。Module versioning 功能应用在我们使用模块的场合。如果 Module versioning 功能被打开的话,它会以每个导出符号的 C 原型声明作为输入,计算出对应的CRC校验值,保存在文件 Module.symvers 中。如此一来,内核在后面要加载使用模块的时候,会两相比较模块中的CRC值和保存下来的CRC值,如果发现不相等,内核就拒绝加载这个模块。华芸ADM的Linux内核衍生版就打开了内核的Module versioning功能。这就使得我们编译自定义的设备驱动时,要保持严格的一致性。否则模块就会被内核拒绝加载。

让我们来了解一下Linux内核模块加载时的检查步骤:

首先, 会进行模块签名验证,然后才是版本检查。

版本检查又分为 vermagic 检查和 CRC校验检查, 这又和内核的编译选项”CONFIG_MODVERSIONS”相关

kernel 打开 CONFIG_MODVERSIONS, module 不打开 CONFIG_MODVERSIONS : 将不会检查CRC, 但是会完整匹配vermagic, 但是因为两者的vermagic中“modversions”的差别, 模块将不能加载成功

kernel 打开 CONFIG_MODVERSIONS, module 打开 CONFIG_MODVERSIONS, 将会检查CRC, 然后匹配vermagic的第一个空格后的部分, 例如, 若vermagic为“5.13.x SMP mod_unload modversions”, 则只会使用” SMP mod_unload modversions来匹配”, 即SMP, 模块卸载等关键特性还是需要进行检查

kernel 不打开 CONFIG_MODVERSIONS, module 打开 CONFIG_MODVERSIONS, 将会完整匹配vermagic, 但是因为两者的vermagic中“modversions”的差别, 模块将不能加载成功

kernel 不打开 CONFIG_MODVERSIONS, module 不打开 CONFIG_MODVERSIONS, 完整匹配vermagic

因为华芸的ADM系统打开了CONFIG_MODVERSIONS。因此版本检查包括 vermagic 检查和 CRC校验检查。是属于相对严格的检查。如果编译设备驱动时使用的gcc版本不同,将直接影响到CRC校验,编译出来的ko模块就不能用。

这就涉及到了一个问题,就是如何从华芸的ADM运行系统中提取出”CONFIG_MODVERSIONS”要求的CRC值呢?也就是:关于如何从srtipped vmlinux系统文件里获取标号crc的问题。

从srtipped vmlinux系统文件里获取标号crc的是可以实现的,但实现起来非常麻烦。需要用c语言写一段如下程序,即可bump出一个Module.symvers文件。使用这个文件,就可以直接编译出可以用于ADM 的NAS系统内核5.13.x的模块了。因为逆向工程的需要,我针对华芸的ADM编写了一个专门用于bump出一个Module.symvers文件的程序。但这次的龙年大礼包不会提供这个专门的程序。

为了方便坛友们将来自己编译设备驱动,我在这次的【龙年大礼包】里为大家提供了一个内核模块toolkit.ko文件,为用户提供接口去搜索标号的crc。但这个内核模块每次只能搜索一个标号的crc值。

重要提示: Intel 的 CPU 将特权级别分为 4 个级别。toolkit.ko是内核模块,拥有对CPU的ring0 级别的特权。Linux将ring0用于内核,将ring3用于普通进程。没有在ring0上运行的进程代码,也没有在ring3上运行的内核代码。从ring3必须使用80h软中断只有一个进入内核的入口点,它允许从其所在区域跳转用户代码到内核代码所在的区域。这个特权级别比root特权的控制更强。当然自己认为,我写的toolkit.ko模块肯定是安全的(如果需要源代码可以联系我)。但是,我要提醒大家千万不要随便加载来源不明的第三方内核模块危险!危险!危险!重要的话连说三遍。尽管我的模块是安全的,但也仅仅是为了逆向工程的教学目的。我也不建议大家将它用于生产系统。非必要不要加载,用完后尽快卸载。

在这里我为大家提供了一个内核模块toolkit.ko中。搜索标号的方案是采用一个灵活的方案。可以让用户根据需要搜索标号。利用了Linux内核提供了两个函数可以解决这个问题。

typedef unsigned long (*kallsyms_lookup_name_t)(const char *name);
typedef bool (*find_symbol_t)(struct find_symbol_arg *fsa);

Linux2.6以前的版本,这两个函数的接口是暴露给编程模块的,编程时可以直接使用。但现在的版本,可能是因为安全的原因吧,这两个函数一般是再不暴露出来的。但我们仍然可以使用暴露的 register_kprobe() 函数注册这两个函数来获得它在内核的地址,并来使用它。

因为toolkit.ko模块是内核程序,它与用户程序需要一个交互的接口。有很多种方法提供这样的接口。在【龙年大礼包】里我使用 /proc/find_symbol 虚拟文件系统来提供用户接口。用户可以使用控制台命令:

  1. modprobe toolkit (加载toolkit,创建 /proc/find_symbol 虚拟文件系统用户接口)
  2. cat /proc/find_symbol (第一次读入虚拟文件,将显示帮助信息。)
  3. echo \”module_layout\” > /proc/find_symbol (向虚拟文件系统用户接口请求“module_layout”的符号信息。)
  4. cat /proc/find_symbol (从虚拟文件系统用户接口读出请求的符号信息)
  5. rmmod toolkit (卸载 toolkit)

我的这个toolkit程序中,对从用户数据区复制到内核区的数据有严格的限制。限定为只取前64个字节。如果你试图向/proc/find_symbol虚拟文件系统用户接口发送大量的数据,实施buffer overflow攻击,我的程序将不予理睬,数据会滞留在用户数据区。将影响你的正常使用该工具。这一点请务必注意。

当然,也可以用脚本,或编程语言来使用虚拟文件系统接口。虽然这个toolkit.ko内核模块每次只能搜索一个标号的crc值,如果使用脚本或编程语言的话,就可以通过loop循环的方法,一次获取多个标号的crc值。

结束语

很高兴能与大家分享此次的成果。本教程中详细讲解了破解和启动盘的制作过程中各种细节技术详情。

此次的【龙年大礼包】是对华芸x86-64的全系列的破解逆向工程教学。详细讲解了如何在Linux逆向工程的手工破解的基础上,来实现全部通过程序化的做逆向工程破解。更为重要的是详细讲解了这一过程的设计思想,和设计理念。针对华芸的ADM系统,建立一个可扩展的逆向工程破解平台。为实现因华芸ADM系统升级,再做破解升级提供方便更新。并针对华芸的ADM系统破解,提供一些相应的工具程序。

文章的最后,老骥伏枥要再次郑重声明:撰写本文与制作【龙年大礼包】的目的是为了探索,研究,学习嵌入式linux逆向工程技术。禁止利用本文提供的技术和使用本教程的工具盘从事任何非法商业牟利性活动。

参考文献

[1]【老骥伏枥-兔年大礼包】华芸NAS嵌入式Linux逆向工程(之一)https://www.naslab.club/193.html

[2] Tiny Core Linux -维基百科,自由的百科全书 https://zh.wikipedia.org/wiki/Tiny_Core_Linux

此文绝对是本人【原创】。如果你对本文的观点有不同意见,可以回帖喷我,本人从不固步自封,固持己见。

本文标题:黑华芸|爱速特|华硕ASUSTOR ADM嵌入式Linux逆向工程(之二)
原文链接:https://www.naslab.club/813.html
温馨提示:本文最后更新于2024-03-18 22:00,因系统或软件版本更新,可能会导致文章内容或资源失效,如有发现请在下方留言或联系社长Mojelly,我们将及时进行更新修复!
© 版权声明
THE END
如果文章对您有帮助可以分享或打赏作者
点赞1 分享
laojifuli的头像-NAS研玩社超级会员
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容