成功替换移动版F7607P闪存分区为电信版F4607P

感谢大佬分享的方法https://akbwe.com/posts/an-attempt-to-replace-zte-f7607p-nand-mtdblocks/

仅作为个人博客存档!!!!!刷机有风险,请勿轻易尝试

前言

以免自己忘记,所有的操作全部记录一遍

精简了网友博客中的内容,精简记录全过程

仅限江苏电信,其他地区仅限参考

开启Telnet

在线自助开启中兴Telnet

zte_factroymode.py实力网友@douniwan逆向固件后的开源python工具。十分感谢!

  • 将光猫lan口接到电脑网口,网页进入192.168.1.1 后台修改LAN口地址为192.168.2.2使光猫与家里路由在同一个网段局域网(我家路由地址192.168.2.1,同理如果家里IP是192.168.1.1 可以修改为192.168.1.2等相同网段的IP地址,只需要和家中设备不冲突即可)默认账号:CMCCAdmin 默认密码:aDm8H%MdA

  • 改完ip后把光猫LAN口接入路由LAN口

  • 下载FRPC软件, github官网下载 或者直接下载这个 frp_0.42.0_windows_client.zip

  • 解压后编辑frpc.ini,配置如下

[common]
server_addr = frp服务器地址
server_port = frp服务器端口
token = frp服务器token

[onu]
type = tcp
local_ip = 光猫的局域网IP,如192.168.1.1
local_port = 80(电信版为8080)
remote_port = frp服务器允许的任意端口
  • 打开cmd,进入frp的目录,运行frpc.exe -c frpc.ini

  • 浏览器尝试访问http://server_address:remote_port(用上方填的信息修改这个地址再访问!!最好用手机浏览器通过移动数据网访问)

  • 可以访问的话回到 大佬的网站 提交信息,IP为frp服务器的IP地址,不要使用域名,端口为上面配置文件中的remote_port 默认账号:CMCCAdmin 默认密码:aDm8H%MdA

  • 提交后取得telnet临时账号密码--请立即关闭FRP转发,立即telnet登陆,立即设置永久telnet,此密码5分钟超时失效

sendcmd 1 DB p TelnetCfg
sendcmd 1 DB set TelnetCfg 0 Lan_Enable 1
sendcmd 1 DB set TelnetCfg 0 TS_UName root
sendcmd 1 DB set TelnetCfg 0 TSLan_UName root
sendcmd 1 DB set TelnetCfg 0 TS_UPwd Zte521
sendcmd 1 DB set TelnetCfg 0 TSLan_UPwd Zte521
sendcmd 1 DB set TelnetCfg 0 Max_Con_Num 99
sendcmd 1 DB set TelnetCfg 0 ExitTime 999999
sendcmd 1 DB set TelnetCfg 0 InitSecLvl 3
sendcmd 1 DB set TelnetCfg 0 CloseServerTime 9999999
sendcmd 1 DB set TelnetCfg 0 Lan_EnableAfterOlt 1
sendcmd 1 DB save

killall telnetd
#此处为备注---------------------------
sendcmd 1 DB p TelnetCfg                             
sendcmd 1 DB set TelnetCfg 0 Lan_Enable 1
sendcmd 1 DB set TelnetCfg 0 TS_UName root
sendcmd 1 DB set TelnetCfg 0 TSLan_UName root
sendcmd 1 DB set TelnetCfg 0 TS_UPwd Zte521
sendcmd 1 DB set TelnetCfg 0 TSLan_UPwd Zte521
sendcmd 1 DB set TelnetCfg 0 Max_Con_Num 99
sendcmd 1 DB set TelnetCfg 0 ExitTime 999999
sendcmd 1 DB set TelnetCfg 0 InitSecLvl 3
sendcmd 1 DB set TelnetCfg 0 CloseServerTime 9999999
sendcmd 1 DB set TelnetCfg 0 Lan_EnableAfterOlt 1
sendcmd 1 DB save
  • 设置完成后获得永久telnet账号密码 账号:root 密码:Zte521

  • 测试telnet登录成功

  • 开通后及时关闭frpc软件,避免被小人端口扫描到

备份原机闪存

插入NTFS或FAT32格式的优盘,Telnet登陆后可以使用如下命令备份完整闪存:

dd if=/dev/mtd0 of=/mnt/usb1_1/f7607p_dd.bin
或
cat /dev/mtd0 > /mnt/usb1_1/f7607p_cat.bin
或
nand kread /dev/mtd0 0x0 0x10000000 /mnt/usb1_1/f7607p_nand.bin

保险起见可以三种方式都备份一次。优盘目录名测试移动版默认为usb1_1,联通版默认为USB1_disc1,电信版默认为USB_disc1。可以使用df命令查看挂载的目录名。另知联通和电信版busybox阉割了dd命令

我顺便使用以下命令备份了其他几个分区(我觉得更保险)

cat /dev/mtd0 > /mnt/usb1_1/f7607p_cat.bin
cat /dev/mtd1 > /mnt/usb1_1/f7607p_u-boot_cat.bin
cat /dev/mtd2 > /mnt/usb1_1/f7607p_others_cat.bin
cat /dev/mtd3 > /mnt/usb1_1/f7607p_parameter_tags_cat.bin
cat /dev/mtd4 > /mnt/usb1_1/f7607p_wlan_cat.bin
cat /dev/mtd5 > /mnt/usb1_1/f7607p_usercfg_cat.bin
cat /dev/mtd6 > /mnt/usb1_1/f7607p_middle_cat.bin
cat /dev/mtd7 > /mnt/usb1_1/f7607p_kernel1_cat.bin
cat /dev/mtd9 > /mnt/usb1_1/f7607p_osgi1_cat.bin
cat /dev/mtd11 > /mnt/usb1_1/f7607p_plugin_data_cat.bin

我备份的移动版分区:

mtd0

f7607p_cat.bin

mtd1

f7607p_uboot_cat.bin

mtd2

f7607p_other_cat.bin

mtd3

f7607p_parameter_cat.bin

mtd4

f7607p_wlan_cat.bin

mtd5

f7607p_usercfg_cat.bin

mtd6

f7607p_middle_cat.bin

mtd7

f7607p_kernel1_cat.bin

mtd9

f7607p_osgi1_cat.bin

mtd11

f7607p_plugmandata_cat.bin

电信版闪存结构分析

看一下电信版固件的分区结构

/ # cat /proc/mtd
dev:    size   erasesize  name
mtd0: 10000000 00020000 "whole flash"
mtd1: 00200000 00020000 "u-boot"
mtd2: 00200000 00020000 "others"
mtd3: 00200000 00020000 "parameter tags"
mtd4: 00200000 00020000 "wlan"
mtd5: 00800000 00020000 "usercfg"
mtd6: 01000000 00020000 "framework"
mtd7: 01000000 00020000 "framework1"
mtd8: 00600000 00020000 "dbus"
mtd9: 02800000 00020000 "kernel1"
mtd10: 02800000 00020000 "kernel2"
mtd11: 07900000 00020000 "plugin_data"
mtd12: 024c0000 00020000 "rootfs"

其中kernel1和kernel2完全一样,uboot启动时会读取mtd2中的BootImageNum值,其为0的话就从kernel1启动,1的话从kernel2启动,如果被选择的分区无法通过crc和rsa等校验,则会从另一个kernel分区启动。rootfs分区是kernel分区内的一部分。framework和framework1是插件分区,也完全相同,互为备份。

开始替换

感谢不记名网友分享的电信版F4607P的闪存分区: TELECOM_V2.0.0P1N6.7z.001TELECOM_V2.0.0P1N6.7z.002,解压后放入NTFS或FAT32格式的优盘,对比下hash值:

kernel_CT.bin sha-256: d6b98566985a7e812d7d7fa50a6e442592050dcc5923794bcdd506993f8868f8
framework_CT.bin sha-256: 28afbbb861102763ac0c84f16c38958abbd1c8448946aa692b5d5430dcb2dd54

放入NTFS或FAT32格式的优盘,插入光猫USB接口,进入Telnet,运行fw_flashing,会报错并给出当前启动的内核分区,如:

g_zte_current_version_base_address=1600000
<b000000005>11931:19:34 [U_fw_flashing][Error] [fw_flashing.c(2246)main] baseaddr:1600000, curpdev=/dev/mtd7, offset=0
<b000000005>11931:19:34 [U_fw_flashing][Error] [fw_flashing.c(2251)main] open  failed!
<b000000005>11931:19:34 [U_fw_flashing][Error] [fw_flashing.c(2371)main] fw_flashing error

如果上面curpdev显示的是/dev/mtd7的话,执行命令upgradetest switchver 1

如果上面curpdev显示的是/dev/mtd8的话,执行命令upgradetest switchver 0。作用是下一次启动时切换到另一个分区

我这边是mtd7 所以我输入upgradetest switchver 1

根据上面fw_flashing的结果更改{待定1}的值: 如果 (fw_flashing == mtd7) 那么 { {待定1} == mtd8}; 如果 (fw_flashing == mtd8) 那么 { {待定1} == mtd7}

这里插播一条重要提醒:上面和后面相似的判断逻辑,目的是为了判断系统当前启动的kernel分区,然后把固件写入另一个当前没有被使用的分区,避免直接对正在运行中的Kernel分区做覆盖,很可能会写入失败并且产生大量坏块,这是血的教训,一定判断仔细

修改以下代码后严格按顺序执行以下命令,一次一行

cd /mnt/usb1_1
echo 2 > /proc/zteinfo/factory/factorymode
touch /userconfig/nanddebug
nand kerase /dev/{待定1} 0x0 0x2800000
nand kwrite /dev/{待定1} 0x0 0x2800000 ./kernel_CT.bin

完成后reboot重启,开机后已经进入电信系统了,但电信版中兴系统的登陆入口不是80端口,而是8080。80端口为插件内的系统,直接访问8080端口会自动跳转到80端口登陆,由于到这一步还未刷入插件分区所以无法进入网页后台

继续登录Telnet,再次运行fw_flashing,并根据结果更改{待定2}的值: 如果 (fw_flashing == mtd9) 那么 { {待定2} == mtd10}; 如果 (fw_flashing == mtd10) 那么 { {待定2} == mtd9}

修改以下代码后严格按顺序执行以下命令,一次一行

cd /mnt/USB_disc1
echo 2 > /proc/zteinfo/factory/factorymode
nand kerase /dev/{待定2} 0x0 0x2800000
nand kwrite /dev/{待定2} 0x0 0x2800000 ./kernel_CT.bin
umount /opt/upt/apps/mnt1(移动版刷电信固件不用这一步)
umount /opt/upt/apps/mnt2(移动版刷电信固件不用这一步)
nand kerase /dev/mtd6 0x0 0x1000000
nand kwrite /dev/mtd6 0x0 0x1000000 ./framework_CT.bin
nand kerase /dev/mtd7 0x0 0x1000000
nand kwrite /dev/mtd7 0x0 0x1000000 ./framework_CT.bin
nand kerase /dev/mtd8 0x0 0x600000
nand kerase /dev/mtd11 0x0 0x7900000
rm  /userconfig/nanddebug

然后根据需要选择一个区域码配置,使用cat /etc/init.d/regioncode查看区域码对照表,找到想要的区域代码,例如上海为205,然后用命令upgradetest sdefconf 205切换区域为上海,切换后猫会自动重启,加载上海地区的默认配置,当然telnet又被关闭了。

/ # cat regioncode
200:Jiangsu
201:Xinjiang
202:Hainan
203:Tianjin
204:Anhui
205:Shanghai
206:Chongqing
207:Beijing
208:Sichuan
209:Shandong
210:Guangdong
211:Hubei
212:Fujian
214:Zhejiang
215:Shanxi
216:Hunan
217:Yunnan
218:Xizang
219:Heilongjiang
220:Guizhou
221:Shanxi2
222:Hebei
223:Ningxia
224:Guangxi
225:Jiangxi
226:Gansu
227:Qinghai
229:Liaoning
230:Jilin
231:Neimeng
232:Henan
234:TelecomInstitute

改完后重启,然后重新按照上方方法重开telnet

电信原版F4607P出厂时已配置好了ponmac,值为MAC8的值加1,也就是MAC1即机身标签上的MAC值加8(16进制)。其他原厂为XGPON的版本改为10G EPON后都需要手动使用setmac 1 32769 MAC地址设置ponmac。如果提示setmac failed的话,使用如下命令设置。此处仅表明中兴原厂的ponmac设置规则,不代表必须如此设置。ponmac可以是任意合法的MAC值,只要同一个OLT下没有重复就行。如果运营商有绑定光猫ponmac,则需将其设置为老猫的ponmac值,或直接Call小哥解除绑定

echo 2 > /proc/zteinfo/factory/factorymode
setmac 1 32769 MAC地址
echo 0 > /proc/zteinfo/factory/factorymode

电信固件和联通固件部分省份没注册ITMS服务器的话会劫持所有DNS请求的结果到192.168.1.1,使用如下命令手动欺骗ITMS注册结果

sendcmd 1 DB set PDTCTUSERINFO 0 Status 0
sendcmd 1 DB set PDTCTUSERINFO 0 Result 1
sendcmd 1 DB save

上面两步我没执行,不知道具体有什么影响(江苏这边只绑定loid)

补充:

telnet下执行以下命令给默认user用户提权!!!!非常重要,不要问我为什么

sendcmd 1 DB set DevAuthInfo 1 Level 1
sendcmd 1 DB save
reboot

重启后确认user用户成功获取超管权限。到此处全部结束了,使用旧光猫loid就可以直接注册使用

如果没有user提权,插上光纤后超密被改,telnet被关。以下是解决办法

1.拔掉光纤,长按reset 20s重置光猫,重置两次,如果恢复了默认超密,直接重开telnet

2.如果默认超密还是登录不了,使用factorymode+默认超密 来获取临时telnet,接下去就是重开永久telnet

一些折腾中发现的其他东西,记录一下

  • 电信版固件在网页后台可以自由切换XGPON和XEPON模式

/ # cat /proc/csp/versionstates
baseaddress    : 0x1600000
current        : 0
version1states : 0x8f
version2states : 0x0
____________________________________________________
Index   Running Latest  CRC     Integrality     Type
----------------------------------------------------
0        Y       Y       Y       Y              Upg
1        N       N       N       N              Upg
----------------------------------------------------

查看两个kernel分区的情况,baseaddress是当前运行的分区在闪存中的起始位置,current为当前运行的分区代号,下面还有CRC和完整性校验的结果,但这里的CRC校验结果并代表实际情况,好的也会显示N


upgradetest getver 获取两个kernel分区中固件的版本号


hexdump -C -s 0x180 -n 128 /dev/mtd7 输出kernel分区的固件版本号和编译日期部分,移动联通为mtd7和mtd8,电信为mtd9和mtd10

00000180  5a 58 48 4e 20 46 37 36  30 37 50 20 55 4e 49 20  |ZXHN F7607P UNI |
00000190  56 32 2e 30 2e 36 50 31  4e 32 00 00 00 00 00 00  |V2.0.6P1N2......|
000001a0  01 00 00 00 00 48 08 00  40 00 54 04 7e f2 f6 49  |.....H..@.T.~..I|
000001b0  00 00 7e 02 00 00 d6 01  17 07 c4 96 00 00 00 00  |..~.............|
000001c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001d0  00 00 00 00 00 00 00 00  00 00 00 00 01 00 00 00  |................|
000001e0  8d a4 a1 c0 32 30 32 32  30 35 31 36 32 32 35 32  |....202205162252|
000001f0  34 33 00 00 00 00 00 00  ff ff ff ff ff ff ff ff  |43..............|
00000200

/ # cat /proc/capability/boardinfo
system:LINUX
cpufac:ZXIC
cpumod:ZX279132
2gwlmod:INTEL
5gwlmod:INTEL
cpufre:1100MHZ
cpunum:4
flshcap:256MB
ddrcap:512MB

查看硬件配置信息,可以看到WiFi芯片是英特尔的,有传言新版会用MTK的


删除定制版WiFi名字的强制CMCC_和ChinaNet_前缀

sendcmd 1 DB set WLANCfg 0 ESSIDPrefix
sendcmd 1 DB set WLANCfg 4 ESSIDPrefix
sendcmd 1 DB save

ip link set mini-olt down
rmmod optical
rmmod mtlk
rmmod mtlkroot

关闭下行GPON光口和WiFi,功率从12.5W降低到9.7W,一年能省25度电,10元钱。再次开启:重启或者

insmod /kmodule/optical.ko
insmod /kmodule/mtlkroot.ko
insmod /kmodule/mtlk.ko

加密配置文件的密钥每台机器都不一样,根据出厂时内置在tagparam文件中的INDIVKEY值生成,一段32位的随机值,每台机器都不一样,独立生成,和MAC/SN值都无关。所以想要导出配置文件再解密是不可能的

再次重要提示:此文仅为个人折腾之记录,刷机有风险,勿轻易模仿