程序化的破解创建启动盘的设计思想方法
在【兔年大礼包】中详细讲解了如何手工破解华芸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官方网站发布的固件。
它的下载地址是:
这个固件是【兔年大礼包】中详细讲解的固件。但是在写【龙年大礼包】的时候,华芸已经把固件升级到了X64_G3_4.2.1.RGE2。
它的升级版下载地址是:
因此,【龙年大礼包】的破解中,会以这个版本为范例。因此也会包括这个版本的破解。
为了让破解工作环境的通用性更强,我决定为获取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程序时,我的设计是支持两种方式的获取固件的方法。
可以运行命令:
直接从官网获取固件。
也可以事先下载好固件,把它拷贝到破解工作环境的/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_Attribute和Dump_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的尺寸即可。
由于NASYUN的篇幅限制,请看楼下,第三讲 【体验程序化的破解ADM系统与实践范例】,精彩继续!