# 海康萤石智能门锁的网关分析（2）

我们将继续分析海康萤石的智能网关，其思路是先从简单的地方着手，把不需要逆向分析的，可以直接就能观察到的输出和文件都看一看，然后再深入的研究某个细节。 在本专题的上一篇文章中，我们已经获取了电路板上Flash存储的固件内容，同时对MCU的UART引脚进行测试，确认该引脚与软排线接口连通。那么就下来，我们就想办法连上软排线的接口。

## **网关分析**

### **2.1 串口分析**

为了接通软排线，我们需要购买一段20pin的软排线，淘宝可以买到，楼下手机店可能也有。软排线的另一端连接转接板，将0.5mm间距的软排线转接为常见的2.54mm间距的排针。如下图所示：

![图2-1 软排线连接转接板](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdKZccrJ8MllgNT7hdW%2Fimage.png?alt=media\&token=db02f992-b058-46b6-8c5c-ed425a4773f3)

接下来，左侧转接板再通过usb转ttl模块连接电脑。usb转ttl模块的作用是调整电平逻辑，通过该模块，使usb接口的RS232逻辑电平转为MCU的ttl逻辑电平，反之亦然。可以在淘宝买到该模块，截图如下：

![图2-2 usb转ttl模块](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdKZj9mOS7KfcOg3ZHf%2Fimage.png?alt=media\&token=a07ff93e-7e5b-4379-93e7-2ff9ed29d824)

上图中，左侧有5个引脚，我们需要重点关注其中三个，分别是RXD引脚、TXD引脚和GND引脚。RXD引脚是该模块的输入引脚，要连接MCU的 TXD引脚，就是将MCU的输出作为usb转ttl模块的输入。TXD引脚链接MCU的RXD引脚。最后通过接通MCU的GND引脚和该模块的GND引脚实现共地。连接完成之后，如下图：

![图2-3 连接MCU的UART接口](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdKZrjct-SE60wcwkkP%2Fimage.png?alt=media\&token=745b4cbc-331b-497a-b17f-4df99fdff448)

另外，最好给网关单独准备一个带开关的电源插座，以便于我们反复重启网关，否则来回插拔网关容易导致各种问题。我们在实际操作中，软排线和软排线接口的触点位置经常虚接，暂无法确定海康萤石的软排线接口是否需要特殊的软排线才能连接，但这样也勉强能用。&#x20;

将usb转ttl模块插入电脑之后，在电脑的“设备管理器”选项卡中就会出现一个COM口，并为其分配了一个COM编号，如下图所示：

![图2-4 设备管理器选项卡](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdK_-7IVHcfwF7Lsrx7%2Fimage.png?alt=media\&token=e3a65957-b970-423e-a119-19583c3df528)

为了读取此COM口的通信数据，我们还需要一个软件，可以选择Xshell、SecureCRT或者sscom串口调试工具等。我们这里用Xshell作为读取串口的软件，相关配置如下：

![图2-5 Xshell配置串口连接](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdK_4H968qX3nahaqBz%2Fimage.png?alt=media\&token=296aa326-7cdf-4ca2-8769-20d65e005889)

按照图中的方式完成配置，其中Port选择刚刚识别到的COM口编号，其他参数选择默认就好，如有变动，我们会额外指出的。&#x20;

配置完毕后，连接该串口，给网关上电，如果一切操作都正确无误，那么就可以看到如下的输出内容：

![图2-6 串口输出内容](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdK_7urFM3dlIOsolD1%2Fimage.png?alt=media\&token=d00602fa-70f4-43ea-b046-90659d2dccd8)

上图中的输出内容显然是网关上电之后的输出日志，待系统启动完成之后，我们可以试着输入一些内容，这时就会出现登陆嵌入式Linux系统的提示字符，看来还能通过COM口登陆呢，但是登陆用户和登陆密码我们暂不知道。好吧，那就重新去翻一翻提取出来的网关固件。

### **2.2 重打包固件**

在本专题的上一篇中，我们已经把完整的网关内容提取出来了，在其中的cpio文件系统中，可以找到/etc/shadow文件，文件内容如下：

![图2-7 文件系统中/etc/shadow文件](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdK_D-Tapcct05TKrHg%2Fimage.png?alt=media\&token=7a8e9207-e7b3-40b8-b4c9-be186188d180)

借助于彩虹表，就可以找到root用户的登陆密码为abc123。使用该用户名，就可以顺利登陆海康萤石的智能网关，并使用串口shell提供的各种功能了。但是上文也提到了，我们的软排线触点可能有点虚接，有时候吹口气就断了，还是想办法弄个更稳定的连接吧。&#x20;

在海康萤石的网关固件中翻一翻，可以发现在/sbin目录中有telnetd程序，如果我们可以通过telnet连接智能网关，或许会稳定很多，如下图所示：

![图2-8 智能网关中/sbin/telnetd程序](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdK_H0aGADv9QJ8bi-A%2Fimage.png?alt=media\&token=04dff309-9f98-419d-98cf-5e3e2989ae36)

注意，该程序是指向busybox的软链接，如果把解压缩出的固件内容拿到windows环境后，可能会导致/sbin目录中是空的。可以使用串口shell登陆设备，然后运行telnetd程序，但这就意味着每次设备重启之后，我们都要使用shell启动telnetd程序，这样操作也很麻烦。&#x20;

继续翻找，我们在squashfs文件系统中找到initrun.sh脚本，通过名字和内容可以判断该脚本是在网关上电启动后进行初始化操作的。如果我们在该脚本中启动telnetd，然后将固件重新打包烧录回去，应该就不需要软排线了，为此我们给initrun.sh增加telnetd命令，如下图：

![图2-9 在initrun.sh中启动telnetd程序](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdK_MFSi9N_bFYClvI-%2Fimage.png?alt=media\&token=8e658804-d8ca-4b8a-b03e-4acf4c41aa2a)

接下来，就要考虑如何将固件重新打包，然后刷回至Flash中了。固件解包时，只要binwalk跑一下就完事了，但是重打包就相对麻烦一些。我们刚刚修改了initrun.sh文件，该文件在squashfs文件系统中，所以就需要重新打包squashfs文件系统，但mksquashfs在打包时，有很多细节的参数和配置，这些参数和配置将直接影响我们重打包的系统是否可以正常运行，此外，还有设备只能识别特定版本的mksquashfs打包出来的固件。&#x20;

为解决squashfs文件系统打包的问题，我们最好参考一下MT7688AN的官方SDK。假设海康萤石的开发者基于该SDK的进行开发的，那么我们也根据SDK中的固件打包方法进行操作，得到的固件应该就是可运行的。首先在官网上下载MT7688 SDK，链接如下：<http://labs.mediatek.com/zh-cn/platform/linkit-smart-7688，如下图：>

![图2-10 下载MT7688 SDK文件](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdK_Uxe9UJL2aPHBOtK%2Fimage.png?alt=media\&token=58481a09-1a48-49ea-9aa4-80436ce3eafb)

![图2-11 打包squashfs文件系统的命令和参数](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdK_XlGDBoZHHtePkPX%2Fimage.png?alt=media\&token=9e468641-39ab-4e7b-9116-a6430a5b5273)

同时，在‘staging\_dir\host\bin’目录中可以找到图2-11 中的mksquashfs4程序，如下图所示：

![图2-12 打包squashfs文件系统需要的程序](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdK__RMWkWGtLGO6vqU%2Fimage.png?alt=media\&token=b67f4bc5-63e6-48fd-a65c-7b2b051c0d2d)

我们试着用图2-12中的程序和图2-11中的参数打包一下开启telnetd程序的squashfs文件系统，如下图所示：

![图2-13 完成squashfs文件系统打包](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdK_di4XuG0ZGUQH0Ub%2Fimage.png?alt=media\&token=45bfbb25-bd10-4e2b-b6d6-733d2f79309b)

上图中，-comp xz是选择xz压缩格式，通过binwalk可以直接查看到原固件中的压缩格式，所以我们也选择该压缩格式。&#x20;

最后，将打包后的文件系统重新放回固件文件中。我们用了一个颇为简单粗暴的方法，即用UltraEdit直接16进制编辑。上一篇的binwalk分析结果显示从地址0x700000开始的位置是squashfs文件系统的位置，如下图：

![图2-14 十六进制编辑固件](https://3519990514-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mc9RUlvJLCDxdpf1zh2%2F-MdKZbgdGTK0jfSh-vjS%2F-MdK_iuf9mJLoDBAkP4m%2Fimage.png?alt=media\&token=9457e6d1-6ad4-436f-a567-83c79f68270f)

我们只需要将重新打包的squashfs文件覆盖到此处即可，需要注意的是固件文件从地址0x900000起始就是另一个squashfs文件系统了，所以，覆盖完成后需要调整两个文件系统之间的填充字节数量以保证另一个squashfs文件系统的起始偏移仍然是0x900000。至此，我们完成了重打包工作。

### **2.3 固件烧录**

固件的烧录和固件的提取是类似的，依旧是把Flash芯片用热风枪吹下来，然后通过编程器以及配套的软件将2.2章中我们获得的固件文件烧录至Flash中，操作过程可以参考本专题第九篇中的提取固件过程，这里就不再赘述了。

烧录完成之后，我们给智能网关上电，可以观测到网关是正常启动了，那么这说明我们重打包的固件是可以运行的。由此，我们获得了固件编辑能力，如果有必要的话，可以随时编辑和调整固件中的各种程序。

## **小结**

在本篇中，我们主要讨论了2件事情，其一是使用usb转ttl模块连接上了海康萤石网关设备的软排线接口，通过UART接口观察到了系统启动时的输出，并登陆了嵌入式Linux系统；其二是我们开启了海康萤石的网关的telnetd程序，并对该固件进行重打包，最后将重打包的固件刷入Flash中，我们的固件是可以顺利执行的。在本专题的后续文章中，我们在此基础上继续分析和研究海康萤石的智能网关，希望各位读者能有所收获。
