主页 > 路由器 > 腾达AC9官方固件结构及改造

腾达AC9官方固件结构及改造

2017年4月10日 腾达AC9官方固件结构及改造有7条评论 阅读: 14,868 次

先激活0元购,再拆机

先拆外面两个螺丝,然后用工具从左下角凹槽处撬开

里面是无螺丝设计

焊接ttl插针:

 

波特率为115200,上电后可以看到串口启动信息:

 

分区信息:

[ 0.830000] Creating 7 MTD partitions on "bcmsflash":
[ 0.830000] 0x000000000000-0x000000800000 : "All"
[ 0.840000] 0x000000000000-0x000000040000 : "Bootloader"
[ 0.840000] 0x000000040000-0x0000007d0000 : "KernelFS"
[ 0.850000] 0x0000001cb48c-0x0000007d0000 : "rootfs"
[ 0.850000] 0x0000007d0000-0x0000007e0000 : "CFM_BACKUP"
[ 0.860000] 0x0000007e0000-0x0000007f0000 : "CFM"
[ 0.860000] 0x0000007f0000-0x000000800000 : "nvram"

~ # cat /proc/mtd
dev: size erasesize name
mtd0: 00800000 00010000 "All"
mtd1: 00040000 00010000 "Bootloader"
mtd2: 00790000 00010000 "KernelFS"
mtd3: 00604b74 00010000 "rootfs"
mtd4: 00010000 00010000 "CFM_BACKUP"
mtd5: 00010000 00010000 "CFM"
mtd6: 00010000 00010000 "nvram"

 

启动完成,提示:

Normal startupGive root password for system maintenance
(or type Control-D for normal startup):

要密码

 

刷美版固件(US_Acrux1200-AC_V15.03.2.14_EN_NEX01.bin),开telnet

计算机(192.168.1.100)上开tftp服务器,备份cfe

cd /tmp
cat /dev/mtd1 > /tmp/Bootloader.bin
tftp -p -r Bootloader.bin -l /tmp/Bootloader.bin 192.168.0.100

备份整个固件:

cd /tmp
cat /dev/mtd0 > /tmp/all.bin
tftp -p -r all.bin -l /tmp/all.bin 192.168.0.100

不用tftp也可以备份,插上U盘,U盘路径为:

/var/etc/upan/sda1

~ # mount
rootfs on / type rootfs (rw)
/dev/root on / type squashfs (ro,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=62816k,nr_inodes=15704,mode=755)
none on /var type ramfs (rw,relatime)
proc on /proc type proc (rw,relatime)
none on /tmp type ramfs (rw,relatime)
none on /sys type sysfs (rw,relatime)
mdev on /dev type ramfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
none on /var/etc/upan type tmpfs (rw,relatime,size=2048k)
/dev/sda1 on /var/etc/upan/sda1 type ufsd (rw,relatime,nls=utf8,force)

备份bootloader:

 

cat /dev/mtd1 > /tmp/Bootloader.bin
cp  /tmp/Bootloader.bin /var/etc/upan/sda1/Bootloader.bin

 

备份整个固件:

cat /dev/mtd0 > /tmp/all.bin

cp  /tmp/all.bin /var/etc/upan/sda1/all.bin

 

AC9的FLASH分区图如下:

用binwalk对美版固件进行分析:

可以发现固件分为4个部分:0x40字节的头部、TRX Header、linux kernel(LZMA压缩)、squashfs文件系统

TRX Header的内容如下(0x40-0x5b):

TRX Header的定义:

struct trx_header {
uint32_t magic; /* "HDR0" */
uint32_t len; /* Length of file including header */
uint32_t crc32; /* 32-bit CRC from flag_version to end of file */
uint32_t flag_version; /* 0:15 flags, 16:31 version */
uint32_t offsets[3]; /* Offsets of partitions from start of header */
};

  • offset[0] = lzma-loader
  • offset[1] = Linux-Kernel
  • offset[2] = rootfs

magic:HDR0
length:7860224 (0x77f000)
crc32:0xF1B2C209
flag_version:0_1
trx header offset:0x1C
kernel LZMA offset:0X18b48c
filesystem offset:0

0X5C-0X18B4cB:linux kernel区,lzma压缩,解压后的尺寸:4100320z字节

 

0X18B4cc-最后:squashfs文件系统区

 

根据上面的描述,分离出linux kernel和squashfs文件系统,分别命名为kernel.bin和fs.bin,然后找一个openwrt SDK的trx执行程序,通过此程序可以自动生成trx头文件:

./trx -o b.bin  -m 7860288  -f kernel.bin -f fs.bin

-m参数指定最大长度,只要大于固件长度即可

生成的文件为b.bin,其头部与原始的固件一致:

此固件可以在CFE下面刷写了,但还不能在WEB页面刷写,需要再加上原固件最开始的0x40字节

最开始0x40字节的分析

#define IH_MAGIC        0x27051956      /* Image Magic Number           */

typedef struct image_header {
        uint32_t        ih_magic;       /* Image Header Magic Number    */
        uint32_t        ih_hcrc;        /* Image Header CRC Checksum    */
        uint32_t        ih_time;        /* Image Creation Timestamp     */
        uint32_t        ih_size;        /* Image Data Size              */
        uint32_t        ih_load;        /* Data  Load  Address          */
        uint32_t        ih_ep;          /* Entry Point Address          */
        uint32_t        ih_dcrc;        /* Image Data CRC Checksum      */
        uint8_t         ih_os;          /* Operating System             */
        uint8_t         ih_arch;        /* CPU architecture             */
        uint8_t         ih_type;        /* Image Type                   */
        uint8_t         ih_comp;        /* Compression Type             */
        uint8_t         ih_other[32];      /* Image Name           */
} image_header_t;

腾达在正常头部信息中增加了0X20开始的16字节定义,此处原来是用于描述固件名称

正常的生成固件头的命令:

./mkimage -A arm -a 0x80000000 -e 0x80008000 -C lzma -d ac9.bin ac9_new.bin

 

修改固件:

先解包squashfs文件系统

sudo unsquashfs -d squashfs-root fs.bin

修改后打包:

sudo ./mksquashfs4 ./squashfs-root ./newsecondchunk.bin -noappend -root-owned -comp xz -b 128k -processors 1
./trx -o new.bin -m 7929856 -f kernel.bin -f newsecondchunk.bin

----------------------------------------------------------------------------------------------------------------------------------

上述为固件解包及打包过程,下面对固件进行定制。

首先看可疑进程:

jsprocess为网购比价进程,与K2的一样

ucloud_v2与business_proc不知道是啥东西

查看网络进程:
tcp:

除了ucloud_v2与business_proc,还有一个app_data_center 也处于网络连接状态

udp:

重新 更新到最新V15.03.05.14多国语言版本进行定制。

1、首先增加telnet服务,方法是修改/etc_ro/init.d/rcS

在最后增加:

telnetd &

echo -e 'admin\nadmin' | passwd root

设置telnet密码为admin

2、增加定制版本号

修改/webroot_ro/js/main.js

 

3、增加广告屏蔽界面

修改/webroot_ro/main.html,增加如下部分:

修改后的界面如下:

如果本文对你有帮助,请打赏作者,鼓励我们继续写作!

评论:7

  1. twitter 回复
    2017年4月13日 于 下午1:58

    厉害的大神,希望以后会有给力的固件。代表全体Ac9er 谢谢您。

  2. JS 回复
    2017年4月14日 于 上午10:29

    希望大神能加入双拨功能,0元购的有原版的居然没有

  3. gnu 回复
    2017年4月16日 于 上午11:06

    lz如何直接编译个opkg命令进去?

    • ywb 回复
      2017年4月17日 于 上午8:55

      与openwrt架构不同,不能用opkg

  4. 9900 回复
    2017年4月21日 于 下午2:35

    大神请添加kms

  5. ninggu2008 回复
    2017年4月26日 于 下午9:45

    大神,有没有可能加入ext分区支持(从华硕固件应该可以提取),这是安装entware必须的。

    另外,国内版固件自带ufsd.ko,但是没启用,用的ntfs-3g加载分区,美版固件启用了ufsd。请问能否从美版借鉴一下,让国内版也默认自动用ufsd驱动加载ntfs分区?

  6. ilanyu 回复
    2017年5月16日 于 下午12:28

    大神,可以讲下 http://pan.baidu.com/s/1pKH4oo7 里koolproxy的二进制文件为啥只有200多k的吗,我看到官方给的是500多k,用upx解压后,再用最好的打包模式打包可以打包到400多k,也不能到200多k,我看到你给的koolproxy也是用upx3.93打包过的,但是无法解包,大神可以讲下怎么弄的吗,谢谢

发表评论

电子邮件地址不会被公开。 必填项已用*标注