首页
社区
课程
招聘
[原创]中兴ZTE ZX279128S芯片固件解密
发表于: 2023-4-23 23:10 34136

[原创]中兴ZTE ZX279128S芯片固件解密

2023-4-23 23:10
34136
收藏
免费 8
支持
分享
最新回复 (79)
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
Q老Q 博主文中说修改完固件后重启失败,能上传一下启动过程中的完整串口log吗
Boot NAND
start read bootheader
start read secondboot
non secure boot
Jump
ddr size is 0x20000000


U-Boot 2013.04-svn1633 (Oct 19 2021 - 10:18:42)

CPU  : ZX279128S@A9,1000MHZ
Board: ZXIC zx279128sevb
CONFIG_SYS_SDRAM_SIZE = 0x20000000
DRAM:  512 MiB
NAND:  boot mode: 1
NAND_special nand special:0

Manu ID: 0x98, Chip ID: 0xda (Toshiba NAND 256MiB 3,3V 8-bit)
256 MiB
CONFIG_SYS_SDRAM_SIZE = 0x20000000
<nand_read_skip_bad_,1308>!mtdpart=0x4,offset=0x400000,mtdpartoffset=0x4200000,mtdPartsize=0x600000,length=0xc
<zxic_gpio_init>(1029):invalid vid!!! use default!!!
<nand_read_skip_bad_,1308>!mtdpart=0x1,offset=0x0,mtdpartoffset=0x180000,mtdPartsize=0x80000,length=0x20000
In:    serial
Out:   serial
Err:   serial
clk_pll env is not setted, core clk won't change
Net:   enter ref_clk_set.. mode = 0 .
enter pll_cfg_fractional
ref_clk_set success!
gpon serdes init
innerGeLedPolarSet 0
innerGeLedPolarSet 0
innerGeLedPolarSet 0
innerGeLedPolarSet 0
eth0

Hit 1 to upgrade software version
Hit any key to stop autoboot:  0
do_mcupg function enter..
tm_pon_tm_init
after pon_tm_qmg_init
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
multi upgrade check timeout.
Receive multicast packet failed (>.<)
do_mcupg function enter..
mac 1 phy status changed: 1000M full-duplex
-----smac_init
multi upgrade check timeout.
Receive multicast packet failed (>.<)
disable phy
[DEBUG] setup_zxic_vid_param 123 ADDR:0x5effc000
addr=200000
addr=2200000
select=0x1
search=0x2
<nand_read_skip_bad_,1308>!mtdpart=0x4,offset=0x0,mtdpartoffset=0x4200000,mtdPartsize=0x600000,length=0x1000
BootImageNum=0x00000001,1
select=0x1
search=0x2
search->result[select].entry=22001e0
mtd_length=182d160
<nand_read_skip_bad_,1308>!mtdpart=0x3,offset=0x0,mtdpartoffset=0x2200000,mtdPartsize=0x2000000,length=0x182d160
<nand_read_skip_bad_,1308>!mtdpart=0x0,offset=0x0,mtdpartoffset=0x0,mtdPartsize=0x180000,length=0x80000
lseek=0x46868000
cmdline=U-Boot V32.AA1.01 20211019105552
## Booting kernel from Legacy Image at 440001e0 ...
   Image Name:   Linux Kernel Image
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    25349952 Bytes = 24.2 MiB
   Load Address: 40008000
   Entry Point:  40008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK
----------------------
|-->setup versioninfo tag...

Starting kernel ...
这是完整的日志,我删掉了几行和ID有关的敏感消息,应该不影响。
2023-4-27 20:57
0
雪    币: 4660
活跃值: (3696)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
27
Starting kernel ...   后面还有信息吗,这之后是文件系统没有被正常启动吗
2023-4-28 09:43
0
雪    币: 1237
活跃值: (1679)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
最近我也在研究一些中兴的ONU/路由产品,手上有一台中兴的E1600路由,也是ZX279128S@A9,但uboot有密码,试了常见的root/Zte521啥的几个都不对,也还没找到开telnet的方法,想提取固件分析,看来只能上编程器了,Flash是SPANSION S34ML01G200TFI00,TSOP48封装的Nand Flash,有点棘手。。。
*** Press 1 means entering boot mode***
cspboot:1279 Entering boot mode ...
*** Please input bootmode password: ***
2023-4-28 20:31
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29

使用原版备用固件可以启动,自己编译的固件无法启动,看来真是uboot里做了手脚。


Hit 1 to upgrade software version

Hit any key to stop autoboot:  0 

=> 

=> 

=> 

=> nand read 0x44000000 0x200000 0x16CAF33


NAND read: device 0 offset 0x200000, size 0x16caf33

 23899955 bytes read: OK

=> bootm 440001e0

## Booting kernel from Legacy Image at 440001e0 ...

   Image Name:   Linux Kernel Image

   Image Type:   ARM Linux Kernel Image (uncompressed)

   Data Size:    23830179 Bytes = 22.7 MiB

   Load Address: 40008000

   Entry Point:  40008000

   Verifying Checksum ... OK

   Loading Kernel Image ... OK

OK

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

|-->setup versioninfo tag...


Starting kernel ...


Booting Linux on physical CPU 0x0

Initializing cgroup subsys cpuset

Initializing cgroup subsys cpu

Initializing cgroup subsys cpuacct

Linux version 4.1.25+ (cmdc@dell-PowerEdge-T440) (gcc version 4.9.4 (Buildroot 2017.05-svn2186) ) #3 SMP PREEMPT We1

CPU: ARMv7 Processor [414fc091] revision 1 (ARMv7), cr=18c5387d

CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache

Machine model: ZTE ZX279128S

Ignoring memory range 0x0 - 0x40000000

Ignoring memory block 0x0 - 0x20000000

Memory policy: Data cache writealloc

======= zx_map_io pon =======

======= zx_map_io =======

acl length 0x400000

opc length 0x100000

PERCPU: Embedded 11 pages/cpu @dfb56000 s15756 r8192 d21108 u45056

Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 129920


最后于 2023-4-29 09:31 被XYUU编辑 ,原因:
2023-4-29 09:20
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
Q老Q Starting kernel ... 后面还有信息吗,这之后是文件系统没有被正常启动吗
还是没有成功,我自己使用原包配置编译的kernel,刷入后启动依然是卡在了
=> bootm 440001e0
## Booting kernel from Legacy Image at 440001e0 ...
   Image Name:   Linux Kernel Image
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    24959156 Bytes = 23.8 MiB
   Load Address: 40008000
   Entry Point:  40008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OKRL-A Z for help | 115200 8N1 | NOR | Minicom 2.8 | VT102 | 脱机 | ttyUSB0                                         ----------------------
|-->setup versioninfo tag...

Starting kernel ...
后面就没有信息了,要裹足不前了。
2023-4-29 09:20
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
龙岱客 最近我也在研究一些中兴的ONU/路由产品,手上有一台中兴的E1600路由,也是ZX279128S@A9,但uboot有密码,试了常见的root/Zte521啥的几个都不对,也还没找到开telnet的方 ...

提取固件不用编程器,直接nanddump命令就能搞出来,只有刷坏uboot后救砖才需要上编程器。我这个是已经进了telnet和ttl后的进展情况。

最后于 2023-4-29 09:34 被XYUU编辑 ,原因:
2023-4-29 09:33
0
雪    币: 1237
活跃值: (1679)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
我手上这个uboot需要密码,telnet常规方法也开不了
2023-4-29 09:43
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33

如果你有编程器救砖的话,你可以试试刷我上传的uboot,但我感觉好像也没啥意义,因为我这个也有一个很强的校验在里边。

最后于 2023-4-29 10:03 被XYUU编辑 ,原因:
2023-4-29 10:00
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
Q老Q Starting kernel ...   后面还有信息吗,这之后是文件系统没有被正常启动吗

我在uboot下使用tftp载入我解出来的uImage和zImage,然后用bootm和bootz都可以正常启动进去,但用我自己编译的则不行,我的编译配置以及版本和原版里是一致的内容,除了少了证书内容。估计得等恩山的uboot流传出来了。


我手头没有编程器,自己改uboot的话大概率是变砖的,没有可靠的uboot目前已经不敢下一步了。

我这边如果要继续往下走,就只能逆向uboot,然后找到固件中无法继续下一步的逻辑,然后处理固件使其能过。

但如果是公钥证书在uboot里,我要做出能通过的固件就基本没有可能了。


感觉太难了,搞了很久,学了好多知识,从固件拆包、ida分析、ttl调试、kernel编译、编译配置提取、zImage制作、uImage制作、总计花费了半个多月了。

原本只是想加个自启和crond,一路下来不断被挫折,又不断有惊喜,最后竟是遗憾的结局。

最后于 2023-4-29 13:07 被XYUU编辑 ,原因:
2023-4-29 12:48
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35

固件搞不定,只能继续找其他的破绽了,设置关闭4个Java插件,研究后发现这些Java程序主要作用就是未经我同意上报我的上网网址。
sidbg 1 DB set CMCCBundleInfo 0 AutoStart 0
sidbg 1 DB set CMCCBundleInfo 1 AutoStart 0
sidbg 1 DB set CMCCBundleInfo 2 AutoStart 0
sidbg 1 DB set CMCCBundleInfo 3 AutoStart 0

cspd主要作用就是对sidbg的设置内容进行管理,里边大量调用了PCStartProgram,也就是启动一个应用,并执行指定参数,如:启动telnetd、ftpd、smbd、iptable之类的内容。其中里边有一个gamespeed的入口,我本想利用,结果它并没有外部路径,输入env查看path情况,只有几个无法改动的位置。

osgid这个主要作用就是启动osgi的java进程,felix.jar相关的内容,osgid也是由cspd启动的。

ctsgw_proxyd这个是智能网关的管理程序,用户上报路由客户端,重启光猫,也就是手机app管理用的。


IDA载入的时候,需要设置一下处理器:


依然难以接受,这样一个设备,竟然没用启动crond服务,无法自行配置一些工具,太郁闷了。

最后于 2023-4-29 21:51 被XYUU编辑 ,原因:
2023-4-29 21:03
0
雪    币: 1237
活跃值: (1679)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
不要轻言放弃,哈哈,至少解包封包等你掌握很多了。
我的E1600已经找到开Telnet的方法了,解密配置文件,修改开Telnet相关参数,加密再上传恢复用户配置文件,自动重启搞定,难点在如何找到配置文件的解密key
2023-4-29 21:53
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
龙岱客 不要轻言放弃,哈哈,至少解包封包等你掌握很多了。 我的E1600已经找到开Telnet的方法了,解密配置文件,修改开Telnet相关参数,加密再上传恢复用户配置文件,自动重启搞定,难点在如何找到配置 ...

还没放弃噢,我测试了一下,大概率是因为我的交叉编译器不对导致的,因为我写了个c的helloworld,编译放上去运行都提示:
/mnt/usb1_1$ ./hello
Segmentation fault

所以卡在start kernel...大概率是我编译器不对导致的。

最后于 2023-4-30 14:23 被XYUU编辑 ,原因:
2023-4-30 14:22
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38

编译器试了好几个了:

gcc-arm-none-eabi-6_2-2016q4
换到
gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi
还是不行,问了一下必应,编译kernel和uboot必须用gcc-arm-linux-gnueabi,也就是gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi。
可我如何都是卡在start kernel...。

=> bootm 44000000
## Booting kernel from Legacy Image at 44000000 ...
   Image Name:   Linux Kernel Image
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    24983632 Bytes = 23.8 MiB
   Load Address: 40008000
   Entry Point:  40008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK
----------------------
|-->setup versioninfo tag...

Starting kernel ...

刚刚在IDA pro中看到了字符串:arm-buildroot-linux-gnueabi-gcc.br_real (Buildroot 2017.05-svn2186) 4.9.4一会试试这个交叉编译器。

最后于 2023-4-30 22:16 被XYUU编辑 ,原因:
2023-4-30 20:28
0
雪    币: 1237
活跃值: (1679)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
恭喜楼主又有了新进展,期待早日修成正果,恩山之前那人发的uboot、固件啥的,人家现在已经商业用途不再免费共享了,我联系过,都是谈钱,要批量合作的,个人想要个uboot,开口就是要1K rmb
2023-5-1 00:58
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
龙岱客 恭喜楼主又有了新进展,期待早日修成正果,恩山之前那人发的uboot、固件啥的,人家现在已经商业用途不再免费共享了,我联系过,都是谈钱,要批量合作的,个人想要个uboot,开口就是要1K rmb

那个uboot根本就没分享过,只是做做样子的啦。


要钱倒是正常,关键问题还是能不能解决问题,如果刷砖了可能还是个陷阱呢,也是我通常不建议动uboot的原因。我目前花在上面的时间和精力20多个工作日全职,总的工作时间大概率超过了两个月的工作时间,怎么也不止1K了。要不是兴趣根本坚持不了这么长时间。有一点可以肯定的,我学到的新知识,谁也拿不走,那才是真正属于我的,而1K块钱,则不一定是这样的。


原因找到了,实际上这个4.1.25版本的内核里定制了很多内容,编译完成了也有一堆问题待解决,主要的原因是内核编译的配置中有大量ZX自定义的配置,要实现修改的办法还是得从IDA上入手,通过反汇编实现rootfs的还原:

CONFIG_IRQ_DOMAIN_HIERARCHY=y
# CONFIG_CGROUP_PIDS is not set
CONFIG_CGROUP_WRITEBACK=y
# CONFIG_ARCH_HGU is not set
CONFIG_ZX_TDM=y
CONFIG_KERNEL_VOIP_SMP_AFFINITY=y
CONFIG_KERNEL_VOIP_SMP_AFFINITY_CPU=1
CONFIG_VOICEDEAL_USE_SOFTIRQ=y
CONFIG_ZX_MDIO=y
CONFIG_ZX_TM=y
CONFIG_ZX_PON=y
CONFIG_NETDEBUG_PKT=y
CONFIG_GN25L95_MCU_MODE=y
CONFIG_ZX_RESERVE_MEM=y
CONFIG_ZX_NET_ZERO_COPY=y
CONFIG_ZX_NET_MAX_MTU=2016
# CONFIG_ZX_EX_SHAREINFO is not set
CONFIG_PRINTK_SLICE_SUPPORT=y
CONFIG_PRINTK_CHUNK_SIZE=16
CONFIG_ZXICKERNEL_NET=y
# CONFIG_WIFI_SKB_RECYCLE is not set
# CONFIG_WIFI_ATH_OPT is not set
# CONFIG_ARCH_FARADAY is not set
# CONFIG_I2C_FTI2C010 is not set
# CONFIG_SPI_FTSSP010 is not set
# CONFIG_MTD_FTSPI020 is not set
# CONFIG_MTD_NAND_FTNANDC024V21 is not set
# CONFIG_FTWDT010_WATCHDOG is not set
# CONFIG_MACH_HGU is not set
# CONFIG_ARCH_ZX279127 is not set
# CONFIG_ARCH_ZX279128 is not set
CONFIG_ARCH_ZX279128S=y
CONFIG_PLAT_ZXYLZB_128S=y
CONFIG_MACH_ZX279128S=y
CONFIG_ACP_BUG_FIX=y
# CONFIG_PONMODE_AUTO_SWITCH is not set
CONFIG_ZX_GPON=y
# CONFIG_ZX_EPON is not set
CONFIG_ZX_RESERVE_MEM_SIZE_127S=21
CONFIG_ZX_RESERVE_MEM_SIZE_128S=48
CONFIG_ZX_RESERVE_MEM_SIZE_127=20
CONFIG_ZX_RESERVE_MEM_SIZE_128=38
CONFIG_ZX279128S_ASIC=y
CONFIG_IO_CACHE_COHERENCY=y
CONFIG_ARM_L1_CACHE_SHIFT=5
CONFIG_HAVE_ARM_SCU=y
CONFIG_VIRT_TO_BUS=y
CONFIG_IPV6_SLAAC=y
CONFIG_IP_NF_MATCH_PSD=y
CONFIG_ZXICKERNEL_PORT_PERMITS=y
CONFIG_ZXICKERNEL_PORT_FILTEER=y
CONFIG_ZXICKERNEL_PORT_INDEX=y
CONFIG_ZXICKERNEL_FORBID_SSID2=y
CONFIG_ZXICKERNEL_BRIDGE_PROHIBIT=y
CONFIG_ZXICKERNEL_NBIF_TYPE=y
CONFIG_NET_SCH_SPDWRR=y
CONFIG_NET_SCH_SP=y

#
# zxic
#
CONFIG_ZXICKERNEL_WBDEV=y
CONFIG_ZXICKERNEL_WB_ADDR_LEARNING=y
CONFIG_ZXICKERNEL_MULTIWANCD_E8=y
CONFIG_ZXICKERNEL_NETINFO=y
CONFIG_ZXICKERNEL_DATA_MIRROR=y
CONFIG_ZXICKERNEL_DATA_MIRROR_WANALL=y
CONFIG_ZXICKERNEL_IGMP_MODULE=y
CONFIG_ZXICKERNEL_IGMP_V3=y
CONFIG_ZXICKERNEL_IGMPV3_SRC_FILTER=y
CONFIG_ZXICKERNEL_IFSENDQUERY=y
CONFIG_ZXICKERNEL_MLD_MODULE=y
CONFIG_ZXICKERNEL_MVLAN=y
CONFIG_ZXICKERNEL_HARDWARE_SPEEDUP=y
CONFIG_ZXICKERNEL_IGMP_BRUP=y
CONFIG_ZXICKERNEL_MULTI_SYMMETRIC_E8=y
CONFIG_ZXICKERNEL_BRMULTI_E8=y
CONFIG_ZXICKERNEL_FAST_L2_FRAMEWORK=y
CONFIG_ZXICKERNEL_FAST_L3_FRAMEWORK=y
CONFIG_ZXICKERNEL_MC_FASTL2_FRAMEWORK=y
CONFIG_ZXICKERNEL_MC_FASTL3_FRAMEWORK=y
CONFIG_ZXICKERNEL_FASTFORWARD_ENGINE=y
CONFIG_ZXICKERNEL_LOCAL_FAST_ENGINE=y
CONFIG_ZXICKERNEL_QOS=y
CONFIG_ZXICKERNEL_QOS_CLASSIFY_TRANSFER=y
CONFIG_ZXICKERNEL_QOS_TCREMARK=y
CONFIG_ZXICKERNEL_QOS_CLASSIFY_LOCAL=y
CONFIG_ZXICKERNEL_QOS_QC_RTP=y
CONFIG_ZXICKERNEL_QOS_QC_OUTDEV=y
CONFIG_ZXICKERNEL_QOS_POLICER=y
CONFIG_ZXICKERNEL_QOS_POLICER_METER_STB=y
CONFIG_ZXICKERNEL_QOS_POLICER_METER_SRTC=y
CONFIG_ZXICKERNEL_QOS_POLICER_METER_TRTC=y
CONFIG_ZXICKERNEL_QOS_POLICER_ACTION_NULL=y
CONFIG_ZXICKERNEL_QOS_POLICER_ACTION_DROP=y
CONFIG_ZXICKERNEL_QOS_POLICER_ACTION_DSCP_MARK=y
CONFIG_ZXICKERNEL_QOS_POLICER_ACTION_VLANPRIO_MARK=y
CONFIG_ZXICKERNEL_QOS_POLICER_ACTION_DSCP_VLANPRIO_MARK=y
CONFIG_ZXICKERNEL_HFF_ADAPTER=y
CONFIG_ZXICKERNEL_HFF_RECORD=y
CONFIG_ZXICKERNEL_VLANBIND=y
CONFIG_ZXICKERNEL_LAN_MAC_MULVLAN=y
CONFIG_ZXICKERNEL_USERLMT_E8=y
CONFIG_ZXICKERNEL_ARPAGING_E8=y
CONFIG_ZXICKERNEL_ARP_STOLEN=y
CONFIG_ZXICKERNEL_BANDWIDTH_E8=y
CONFIG_ZXICKERNEL_LOOPBACK=y
CONFIG_ZXICKERNEL_SIMULATION=y
CONFIG_ZXICKERNEL_SIMULATION_PING=y
CONFIG_ZXICKERNEL_IP_WAN_WAN_FIBIDEDN=y
CONFIG_ZXICKERNEL_URL_REDIR=y
CONFIG_ZXICKERNEL_IPV4_RES=y
CONFIG_ZXICKERNEL_LOG=y
# CONFIG_ZXICKERNEL_SEND_LOG is not set
CONFIG_ZXICKERNEL_LOG_PRINT_DEBUG=y
CONFIG_ZXICKERNEL_ZXIC_LOGTAB=y
CONFIG_ZXICKERNEL_LOG_FILE=y
CONFIG_ZXICKERNEL_LOG_STDIO=y
CONFIG_ZXICKERNEL_LOG_TELNET=y
CONFIG_ZXICKERNEL_LOG_UDPWATCH=y
CONFIG_ZXICKERNEL_SENDCMD=y
CONFIG_NETFILTER_MAXNET_DPI=y
CONFIG_CMCC_SMART=y
# CONFIG_CMCC_ENTERPRISE is not set
# CONFIG_CMCC_FAMILY is not set
# CONFIG_CMCC_NO_SMART is not set
CONFIG_ZXICKERNEL_MIRROR=y
CONFIG_ZXICKERNEL_DETAIL_PROCESS=y
CONFIG_ZXICKERNEL_FLOW_CMCC=y
CONFIG_ZXICKERNEL_CMCC_VLANDROP=y
CONFIG_ZXICKERNEL_PORTLOCATE=y
CONFIG_ZXICKERNEL_FLOWRATELMT_E8=y
CONFIG_ZXICKERNEL_FAST_ICMP_ENABLE=y
CONFIG_WIRELESS_EXT=y
CONFIG_WEXT_CORE=y
CONFIG_WEXT_PROC=y
CONFIG_WEXT_PRIV=y
CONFIG_ARM_AMBA=y
# CONFIG_TEGRA_AHB is not set
CONFIG_MTD_NAND_ZTE_DENALI=y
CONFIG_MTD_NAND_ZTE_SPIFC=y
CONFIG_MTD_NAND_DENALI_DT=y
CONFIG_MTD_NAND_ZTE_SPIFC_DT=y
# CONFIG_SCSI_DPT_I2O is not set
# CONFIG_SERIO_AMBAKMI is not set
CONFIG_SERIAL_EARLYCON=y
# CONFIG_SERIAL_AMBA_PL010 is not set
CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_I2C_NOMADIK is not set
CONFIG_I2C_ZX=y
# CONFIG_SPI_PL022 is not set
CONFIG_SPI_ZX=y
CONFIG_PINCTRL=y

#
# Pin controllers
#
CONFIG_PINMUX=y
CONFIG_PINCONF=y
CONFIG_GENERIC_PINCONF=y
# CONFIG_DEBUG_PINCTRL is not set
# CONFIG_PINCTRL_AMD is not set
CONFIG_PINCTRL_SINGLE=y
CONFIG_GPIOLIB_IRQCHIP=y
# CONFIG_GPIO_PL061 is not set
CONFIG_GPIO_ZX=y
# CONFIG_ARM_SP805_WATCHDOG is not set
# CONFIG_MPCORE_WATCHDOG is not set
# CONFIG_ZXIC_WDT is not set
CONFIG_WDT_ZX=y
# CONFIG_FB_ARMCLCD is not set
CONFIG_ZXIC_USB_MSG=y
CONFIG_CSP_USB_SLEEP_RESUME=y
CONFIG_USB_DWC3_ZX279128S=y
CONFIG_ZXIC_SD_MSG=y
# CONFIG_MMC_ARMMMCI is not set
CONFIG_MMC_ZX288080=y
CONFIG_MMC_ZX288080_PLTFM=y
CONFIG_ARM_GLOBAL_TIMER=y
CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK=y
CONFIG_ARM_GIC=y
# ZXICPARAM
#
CONFIG_ZXICPARAM=y
# CONFIG_ZXIC_OUTER_BOARD_CONFIG is not set
CONFIG_ZXIC_SOFT_VID=y
# CONFIG_ZXIC_PARAM_TAGS is not set
# CONFIG_PLATRdyl is not set

#
CONFIG_HAVE_ARM_SMCCC=y
CONFIG_CRYPTO_SHA512_ARM=y
CONFIG_PERCPU_RWSEM=y
# CONFIG_GCC_PLUGINS is not set


最后于 2023-5-1 18:24 被XYUU编辑 ,原因:
2023-5-1 09:51
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41

新的进展和认识,通过对比了zImage的固件后,发现解包出来的zImage有16处偏移不同,几乎全与gzip压缩相关,也就是应该是能找到将Image生成zImage的方法的。而Image的生成则和kernel与rootfs的组合相关,这部分应该也是可以从kernel的源码里找到的,于是乎剩下的步骤就是:
1. 从kernel源码中找到Image生成zImage的方法;
2. 从kernel源码中找到rootfs+kernel生成Image的方法;
3. 将kernel与rootfs分离然后重新组合,然后生成zImage;
ttl上使用bootz调试zImage。

目前image无法使用uboot引导,bootk可加载tftp中的uImage调试,是比tftp读内存再bootz或bootm更方便的命令,如:

bootk uImage.bin

最后于 2023-5-3 10:12 被XYUU编辑 ,原因:
2023-5-2 12:33
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42

通过比对,已经找到了修改zImage中gzip的全部偏移,维独还剩一个偏移量没有找到:

seg000:400080C8 loc_400080C8                            ; DATA XREF: start+1E8↓o

seg000:400080C8                 ADR             R0, dword_40008304

seg000:400080CC                 LDM             R0, {R1-R3,R6,R10-R12}

seg000:400080D0                 LDR             SP, [R0,#(dword_40008320 - 0x40008304)]

seg000:400080D4                 SUB             R0, R0, R1

seg000:400080D8                 ADD             R6, R6, R0

seg000:400080DC                 ADD             R10, R10, R0

seg000:400080E0                 LDRB            R9, [R10]

seg000:400080E4                 LDRB            LR, [R10,#1]

seg000:400080E8                 ORR             R9, R9, LR,LSL#8

seg000:400080EC                 LDRB            LR, [R10,#2]

seg000:400080F0                 LDRB            R10, [R10,#3]

seg000:400080F4                 ORR             R9, R9, LR,LSL#16

seg000:400080F8                 ORR             R9, R9, R10,LSL#24

seg000:400080FC                 ADD             SP, SP, R0

seg000:40008100                 ADD             R10, SP, #arg_10000

seg000:40008104                 MOV             R5, #0

seg000:40008108                 LDR             LR, [R6]

seg000:4000810C                 LDR             R1, =0xEDFE0DD0

seg000:40008110                 CMP             LR, R1

seg000:40008114                 BNE             loc_400081C4

seg000:40008118                 LDR             R5, [R6,#4]

seg000:4000811C                 EOR             R1, R5, R5,ROR#16

seg000:40008120                 BIC             R1, R1, #0xFF0000

seg000:40008124                 MOV             R5, R5,ROR#8

seg000:40008128                 EOR             R5, R5, R1,LSR#8

seg000:4000812C                 ADD             R5, R5, R5,LSR#1

seg000:40008130                 ADD             R5, R5, #7

seg000:40008134                 BIC             R5, R5, #7

seg000:40008138                 CMP             R5, #0x8000

seg000:4000813C                 MOVCC           R5, #0x8000

seg000:40008140                 CMP             R5, #0x100000

seg000:40008144                 MOVHI           R5, #0x100000

seg000:40008148                 ADD             SP, SP, R5

seg000:4000814C                 PUSH            {R0-R3,R12,LR}

seg000:40008150                 MOV             R0, R8

seg000:40008154                 MOV             R1, R6

seg000:40008158                 MOV             R2, R5

seg000:4000815C                 BL              sub_4000D2D4

seg000:40008160                 CMP             R0, #1

seg000:40008164                 SUB             R0, R4, #0x8000

seg000:40008168                 BIC             R0, R0, #1

seg000:4000816C                 ADD             R0, R0, #0x100

seg000:40008170                 MOV             R1, R6

seg000:40008174                 MOV             R2, R5

seg000:40008178                 BLEQ            sub_4000D2D4

seg000:4000817C                 POP             {R0-R3,R12,LR}

seg000:40008180                 SUB             SP, SP, R5

seg000:40008184                 MOV             R8, R6

seg000:40008188                 LDR             R5, =0x2D290

seg000:4000818C                 ADR             R1, loc_4000824C

seg000:40008190                 SUB             R1, R6, R1

seg000:40008194                 SUBS            R1, R5, R1

seg000:40008198                 ADDHI           R9, R9, R1

seg000:4000819C                 LDR             R5, [R6,#4]

seg000:400081A0                 EOR             R1, R5, R5,ROR#16

seg000:400081A4                 BIC             R1, R1, #0xFF0000

seg000:400081A8                 MOV             R5, R5,ROR#8

seg000:400081AC                 EOR             R5, R5, R1,LSR#8

seg000:400081B0                 ADD             R5, R5, #7

seg000:400081B4                 BIC             R5, R5, #7

seg000:400081B8                 ADD             R6, R6, R5

seg000:400081BC                 ADD             R10, R10, R5

seg000:400081C0                 ADD             SP, SP, R5

seg000:400081C4

seg000:400081C4 loc_400081C4                            ; CODE XREF: start+114↑j

目前这段汇编没看明白,即:
seg000:40008188                 LDR             R5, =0x2D290
这个R5的寄存器,感觉也是一个偏移量的计算,但这个偏移量是如何算的,有什么作用没理明白。

如果这个偏移量找明白了,那么就能实现从Image->zImage的快速转换了,直接通过修改偏移量完成。

片段:

seg000:40008108                 LDR             LR, [R6]
seg000:4000810C                 LDR             R1, =0xEDFE0DD0
seg000:40008110                 CMP             LR, R1
seg000:40008114                 BNE             loc_400081C4

这地方看着是找dtb设备树文件,R1是设备树文件编译后的magic number,如果找到就跳走了。

最后于 2023-5-2 22:59 被XYUU编辑 ,原因:
2023-5-2 22:38
0
雪    币: 1237
活跃值: (1679)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
楼主厉害,离成功越来越近了
2023-5-3 06:57
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44

很幸运,这段我没搞明白的R5寄存器数值,我通过魔数的方式在kernel源码里找到了,除了push和pop反汇编略有偏差,基本内容一致,位于arch\arm\boot\compressed\head.S下的220-376行。

restart:        adr        r0, LC0
               ldmia        r0, {r1, r2, r3, r6, r10, r11, r12}
               ldr        sp, [r0, #28]

               /*
                * We might be running at a different address.  We need
                * to fix up various pointers.
                */
               sub        r0, r0, r1                @ calculate the delta offset
               add        r6, r6, r0                @ _edata
               add        r10, r10, r0                @ inflated kernel size location

               /*
                * The kernel build system appends the size of the
                * decompressed kernel at the end of the compressed data
                * in little-endian form.
                */
               ldrb        r9, [r10, #0]
               ldrb        lr, [r10, #1]
               orr        r9, r9, lr, lsl #8
               ldrb        lr, [r10, #2]
               ldrb        r10, [r10, #3]
               orr        r9, r9, lr, lsl #16
               orr        r9, r9, r10, lsl #24

#ifndef CONFIG_ZBOOT_ROM
               /* malloc space is above the relocated stack (64k max) */
               add        sp, sp, r0
               add        r10, sp, #0x10000
#else
               /*
                * With ZBOOT_ROM the bss/stack is non relocatable,
                * but someone could still run this code from RAM,
                * in which case our reference is _edata.
                */
               mov        r10, r6
#endif

               mov        r5, #0                        @ init dtb size to 0
#ifdef CONFIG_ARM_APPENDED_DTB
/*
 *   r0  = delta
 *   r2  = BSS start
 *   r3  = BSS end
 *   r4  = final kernel address (possibly with LSB set)
 *   r5  = appended dtb size (still unknown)
 *   r6  = _edata
 *   r7  = architecture ID
 *   r8  = atags/device tree pointer
 *   r9  = size of decompressed image
 *   r10 = end of this image, including  bss/stack/malloc space if non XIP
 *   r11 = GOT start
 *   r12 = GOT end
 *   sp  = stack pointer
 *
 * if there are device trees (dtb) appended to zImage, advance r10 so that the
 * dtb data will get relocated along with the kernel if necessary.
 */

               ldr        lr, [r6, #0]
#ifndef __ARMEB__
               ldr        r1, =0xedfe0dd0                @ sig is 0xd00dfeed big endian
#else
               ldr        r1, =0xd00dfeed
#endif
               cmp        lr, r1
               bne        dtb_check_done                @ not found

#ifdef CONFIG_ARM_ATAG_DTB_COMPAT
               /*
                * OK... Let's do some funky business here.
                * If we do have a DTB appended to zImage, and we do have
                * an ATAG list around, we want the later to be translated
                * and folded into the former here. No GOT fixup has occurred
                * yet, but none of the code we're about to call uses any
                * global variable.
               */

               /* Get the initial DTB size */
               ldr        r5, [r6, #4]
#ifndef __ARMEB__
               /* convert to little endian */
               eor        r1, r5, r5, ror #16
               bic        r1, r1, #0x00ff0000
               mov        r5, r5, ror #8
               eor        r5, r5, r1, lsr #8
#endif
               /* 50% DTB growth should be good enough */
               add        r5, r5, r5, lsr #1
               /* preserve 64-bit alignment */
               add        r5, r5, #7
               bic        r5, r5, #7
               /* clamp to 32KB min and 1MB max */
               cmp        r5, #(1 << 15)
               movlo        r5, #(1 << 15)
               cmp        r5, #(1 << 20)
               movhi        r5, #(1 << 20)
               /* temporarily relocate the stack past the DTB work space */
               add        sp, sp, r5

               stmfd        sp!, {r0-r3, ip, lr}
               mov        r0, r8
               mov        r1, r6
               mov        r2, r5
               bl        atags_to_fdt

               /*
                * If returned value is 1, there is no ATAG at the location
                * pointed by r8.  Try the typical 0x100 offset from start
                * of RAM and hope for the best.
                */
               cmp        r0, #1
               sub        r0, r4, #TEXT_OFFSET
               bic        r0, r0, #1
               add        r0, r0, #0x100
               mov        r1, r6
               mov        r2, r5
               bleq        atags_to_fdt

               ldmfd        sp!, {r0-r3, ip, lr}
               sub        sp, sp, r5
#endif

               mov        r8, r6                        @ use the appended device tree

               /*
                * Make sure that the DTB doesn't end up in the final
                * kernel's .bss area. To do so, we adjust the decompressed
                * kernel size to compensate if that .bss size is larger
                * than the relocated code.
                */
               ldr        r5, =_kernel_bss_size
               adr        r1, wont_overwrite
               sub        r1, r6, r1
               subs        r1, r5, r1
               addhi        r9, r9, r1

               /* Get the current DTB size */
               ldr        r5, [r6, #4]
#ifndef __ARMEB__
               /* convert r5 (dtb size) to little endian */
               eor        r1, r5, r5, ror #16
               bic        r1, r1, #0x00ff0000
               mov        r5, r5, ror #8
               eor        r5, r5, r1, lsr #8
#endif

               /* preserve 64-bit alignment */
               add        r5, r5, #7
               bic        r5, r5, #7

               /* relocate some pointers past the appended dtb */
               add        r6, r6, r5
               add        r10, r10, r5
               add        sp, sp, r5
dtb_check_done:
#endif

可见这个R5就是_kernel_bss_size,上面的注释也很清楚了:确保 DTB 不会出现在最终内核的 .bss 区域中。 为此,如果 .bss 大小大于重定位代码,我们会调整解压缩的内核大小以进行补偿。

也就是这个R5是内核的.bss区域大小。

这个大小从哪来的呢?从arch\arm\boot\compressed\Makefile中114-117行可以看到

# Supply kernel BSS size to the decompressor via a linker symbol.
KBSS_SZ = $(shell $(CROSS_COMPILE)size $(obj)/../../../../vmlinux | \
		awk 'END{print $$3}')
LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ)

很显然,我这次只是修改rootfs,没有修改vmlinux,所以这个值不需要改。

最后于 2023-5-3 10:21 被XYUU编辑 ,原因:
2023-5-3 09:07
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
45

接着是处理lzma的部分,我从IDA中能发现lzma的字符串“LZMA data is corrupt”,继续用这个去搜源码,找到了lib\decompress_unlzma.c中的631-651行:

       while (get_pos(&wr) < header.dst_size) {
               int pos_state =        get_pos(&wr) & pos_state_mask;
               uint16_t *prob = p + LZMA_IS_MATCH +
                       (cst.state << LZMA_NUM_POS_BITS_MAX) + pos_state;
               if (rc_is_bit_0(&rc, prob)) {
                       if (process_bit0(&wr, &rc, &cst, p, pos_state, prob,
                                       lc, literal_pos_mask)) {
                               error("LZMA data is corrupt");
                               goto exit_3;
                       }
               } else {
                       if (process_bit1(&wr, &rc, &cst, p, pos_state, prob)) {
                               error("LZMA data is corrupt");
                               goto exit_3;
                       }
                       if (cst.rep0 == 0)
                               break;
               }
               if (rc.buffer_size <= 0)
                       goto exit_3;
       }

也就是,在lzma的解压有依赖一个lzma尺寸的数据,即header.dst_size,这个数据的偏移我已经知道了,之前也改好了。但还差一个值没有改,即

dict_size,这个值是lzma的字典的大小,由于重新压缩了,所以必然会影响dict_size,本打算直接安排上的,然后粗略看了一下dict_size的引用内容,发现仅仅只是设置buff的尺寸,而且当值为0时,就设置buff大小为1:

    if (header.dict_size == 0)
        header.dict_size = 1;

    if (output)
        wr.buffer = output;
    else {
        wr.bufsize = MIN(header.dst_size, header.dict_size);
        wr.buffer = large_malloc(wr.bufsize);
    }

然后我去看了一下偏移处的邻位都是0的dword值,也就是这个值是0,也不需要处理。


真幸运,一会就要安排上机测试了。

最后于 2023-5-3 10:26 被XYUU编辑 ,原因:
2023-5-3 09:38
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
46
经过一天的工具编写,目前重写了一部分代码,现在成功实现了:
1. 从Image生成zImage的方法,并上机测试成功。
第二个步骤还没有调通,应该还是工具中单元测试不完整,或者有内容不正确。
2023-5-3 17:57
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47

虽然有些小插曲,但最终还是搞定了!这种成就感真是太爽了!这件事并没有有些人说的那么无法完成,也不需要刷uboot就能用自己改的固件,只是需要把中兴固件的数据结构搞明白,然后就是Image->zImage的路径,然后是lzma压缩后的链接重定位问题。

目前我写的工具可以修改全系列中兴固件,给光猫增加自启入口了,改天做一个付费的在线修改工具,放出来分享了。


虽然目前修改后的固件已经可以工作了,但还有一点点不完美的地方,目前修改后的lzma解压的offset(指针的指针)位置我还没找到,我是通过修改指针所指的值来完成的修改,接下来需要继续琢磨怎么通过反汇编找到这个指向偏移位置的偏移量了。因为原本lzma的size在固件中只有了一个位置,而我修改后需要再增加一个相同的值到另一个位置,虽然不影响使用,但我没找到最硬核的偏移量依然是心有不干。


也就是init\initramfs.c下的__initramfs_size的值,总共有两处引用,值本身是LD通过汇编usr\initramfs_data.S加进去的。


IDA中搜索字符串“

Trying to unpack rootfs image as initramfs...

”没有找到,说明宏#ifdef CONFIG_BLK_DEV_RAM没有生效,那么实际引用处只有一处,但汇编指令使用该位置有两次,而且两次的地址因为rootfs大小发生变化后有了变化。

最后于 2023-5-4 18:30 被XYUU编辑 ,原因:
2023-5-4 14:48
0
雪    币: 1237
活跃值: (1679)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48
厉害了,恭喜楼主。新一些的光猫估计不行吧,uboot对kernel有rsa签名检验的也能搞定吗?
2023-5-4 16:49
0
雪    币: 4134
活跃值: (5847)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
49
我知道你装clash想干嘛
2023-5-4 17:06
0
雪    币: 204
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
50
龙岱客 厉害了,恭喜楼主。新一些的光猫估计不行吧,uboot对kernel有rsa签名检验的也能搞定吗?

没有签名的,如果有签名刷我提供的这个uboot是不是就可以了?说有签名的都是谣言吧?搞不定就说是有rsa签名。真认为有rsa签名至少把uboot放到IDA里反汇编一下,然后再指出来,哪哪是rsa校验的指令才有说服力。据我所知,要对kernel签名至少得有很强的汇编能力,还对LD链接器很懂,还得改得动内核的makefile才有可能实现。大国企存在这样的员工吗?我表示有点怀疑。

真心不建议动uboot,非常容易砖的。我就没有动的情况下实现的。

最后于 2023-5-4 18:36 被XYUU编辑 ,原因:
2023-5-4 18:32
0
游客
登录 | 注册 方可回帖
返回
//