小米路由器mini固件分析

来自IPTV爱好者
跳转至: 导航搜索

固件下载

最新稳定版:版本2.6.17(12月7日更新)http://bigota.miwifi.com/xiaoqiang/rom/r1cm/miwifi_r1cm_firmware_ace10_2.6.17.bin

最新开发版:版本2.9.9(1月4日更新)http://bigota.miwifi.com/xiaoqiang/rom/r1cm/miwifi_r1cm_firmware_ae50f_2.9.9.bin

固件解包

如果手头有R2D小米路由器,并且能够SSH登录,则可登录路由器后用mkxqimage对固件进行解包,具体命令为:

mkxqimage -x miwifi_r1cm_firmware_ace10_2.6.17.bin

得到:firmware.bin和xiaoqiang_version两个文件。

也可以用自己写的程序解包

#include <stdio.h>

struct {
        char magic[4];
        int size;
        unsigned int crc;
        short type;
        short model;
        unsigned int offset[4];
} header;

struct {
        char magic[4];
        unsigned int reserved;
        int size;
        unsigned int reserved2;
        char filename[32];
} section;

int main(int argc, char *argv[]) {
        int i, j;
        int size;
        FILE *input;
        FILE *output;
        char buffer[1024];

        if (argc < 2) {
                fprintf(stderr, "Usage: split filename\n");
                return 1;
        }
        if ((input = fopen(argv[1], "rb")) == NULL) {
                fprintf(stderr, "File %s open error\n", argv[1]);
                return 1;
        }
        if (fread(&header, 1, sizeof(header), input) != sizeof(header)) {
                fprintf(stderr, "File %s read error\n", argv[1]);
                return 1;
        }
        for (i=0; i<4; i++) {
                if (header.offset[i] == 0)
                        continue;
                fseek(input, header.offset[i], SEEK_SET);
                if (fread(&section, 1, sizeof(section), input) != sizeof(section))
                        continue;
                if ((output = fopen(section.filename, "wb")) == NULL) {
                        fprintf(stderr, "File %s open error\n", section.filename);
                        continue;
                }
                printf("Create file %s\n", section.filename);
                for (j=0; j<section.size; j+=sizeof(buffer)) {
                        size = section.size-j;
                        if (size > sizeof(buffer))size = sizeof(buffer);
                        if (fread(buffer, 1, size, input) != size)
                                break;
                        fwrite(buffer, 1, size, output);
                }
                fclose(output);
        }
        fclose(input);

        return 0;
}

firmware.bin文件解包

firmware.bin组合了内核文件和根文件系统,可以用实用程序binwalk分析firmware.bin,Ubuntu下可用以下命令安装binwalk。

sudo apt-get install binwalk

binwalk还可以用于分离firmware.bin文件中的squashfs根文件系统。

binwalk -e firmware.bin

得到170000.squashfs文件。Ubuntu下可用以下命令安装squashfs-tools。

sudo apt-get install squashfs-tools

解包根文件系统:

unsquashfs 170000.squashfs

根文件系统中的文件解压到目录squashfs-root中。


返回:小米路由