最近在学习IOT的固件,所以找了dlink的M30固件来进行模拟,首先从官网上下载1.10版本,因为固件是加密过的,需要解密,然后再进行模拟。
固件解密
github上已经有了解密dlink固件的程序[GitHub - devttys0/delink](https://github.com/devttys0/delink.git),下载下来,使用rust进行编译最后生成delink,然后解密。
./delink M30A1_FW110B02.bin m30_110_dec.bin
解密完成后,使用binwalk来提取固件。
binwalk -Me m30_110_dec.bin
提取成功之后,可以得到squashfs文件系统。

固件模拟
固件分析
在模拟之前,需要先大概过一下这个固件的关键信息,如web服务,启动脚本等。
为了方便,我使用firmwalker对squashfs-root文件夹进行扫描。
./firmwalker.sh ./squashfs-root
完成之后查看扫描结果,看能否发现一些关键服务以及脚本。

发现了一个关键的web服务程序httpd。同时需要留意一下以下几个目录:bin, sbin,usr/bin,usr/sbin,提取出来的可执行程序可能会指向不正确的链接,如/dev/null,需要修复一下,让它们指向busybox。脚本如下:
#!/bin/sh
# 批量修改 ./bin/、./sbin/、./usr/bin/、./usr/sbin/ 下指向 /dev/null 的软链接
# 定义需要处理的目录和对应的busybox路径
TARGETS="
./bin ../bin/busybox
./sbin ../bin/busybox
./usr/bin ../../bin/busybox
./usr/sbin ../../bin/busybox
"
# 遍历每一行配置
echo "$TARGETS" | while read dir busybox_link; do
# 跳过空行
[ -z "$dir" ] && continue
# 检查目录是否存在
if [ ! -d "$dir" ]; then
echo "警告:目录 $dir 不存在,跳过该目录"
continue
fi
echo "========================================"
echo "开始处理目录:$dir(链接指向:$busybox_link)"
# 遍历目录下所有文件
for file in "$dir"/*; do
# 跳过子目录
[ -d "$file" ] && continue
# 检查是否是指向 /dev/null
