找回密码
 注册

QQ登录

只需一步,快速开始

查看: 67|回复: 4

[教程] 中兴光猫开机启动脚本

[复制链接]
发表于 昨天 19:57 | 显示全部楼层 |阅读模式
本帖最后由 asfsagsdfdsfsfd 于 2025-7-1 20:01 编辑

在光猫等嵌入式设备上,系统的 rootfs(根文件系统)通常位于只读分区。如果直接修改该分区内容,极有可能导致 U-Boot 启动失败,或触发 CRC 校验错误,造成设备无法正常启动。
那么,如果我们希望在设备开机后自动执行自定义脚本或程序,应该如何实现呢?
主要有两种思路:

  • 修改固件镜像
    这是最底层的方法,通过解包、修改、重新打包固件,可以从启动流程根本上植入脚本。然而,这种方式难度较大,需要深入理解固件的文件结构、校验机制和启动逻辑。
  • 利用已有可写分区进行 Hook
    在系统中查找可写分区上的可执行程序,通过替换或包装(Hook)该程序,实现自定义脚本注入。这种方式相对简单,不必修改固件本身,也能保持较高的兼容性和安全性。

本文主要介绍第二种方式。具体的分析过程此处略去,我们直接看实现步骤。

1. 确定目标进程
首先,查看系统中正在运行的 Java 进程:
  1. ~ # ps | grep java
  2. 1757 java     13:21 java -noverify -Dfile.encoding=UTF-8 -Xcompactalways -Djava.net.preferIPv4Stack=false -Dsun.zip.disableMemoryMapping=true -Duser.timezone=GMT+8 -XX:ErrorFile=/usr/data/java_excp_log/java_error_2078.log -Djava.security.policy=/usr/local/osgi/local/j2re/lib/security/private.policy -Dorg.osgi.framework.security=osgi -Xms48M -Xmx128M -Xss256K -jar /usr/local/osgi/local/osgi/felix/bin/felix.jar
  3. 3251 root      0:52 cpulimit -l 80 -e java
  4. 11465 root      0:00 grep java
复制代码

可以看到,系统的主 Java 服务由以下 JAR 包启动:
  1. /usr/local/osgi/local/osgi/felix/bin/felix.jar
复制代码

2. 确认分区是否可写
接下来,进入该目录并检查分区挂载属性:
  1. ~ # cd /usr/local/osgi/local/osgi/felix/bin
  2. /usr/local/osgi/local/osgi/felix/bin # df -h .
  3. Filesystem                Size      Used Available Use% Mounted on
  4. /dev/mtdblock10          30.0M     28.0M      2.0M  93% /usr/local/osgi
复制代码

确认分区是否可写:
  1. /usr/local/osgi/local/osgi/felix/bin # mount | grep /usr/local/osgi
  2. /dev/mtdblock10 on /usr/local/osgi type jffs2 (rw,relatime)
复制代码

由此可得:
  • 分区设备:/dev/mtdblock10
  • 文件系统:jffs2
  • 挂载方式:读写(rw)

说明此分区允许写入,可供我们进行Hook操作。

3. Hook 实现原理
有了可写分区,我们可以通过封装启动逻辑的方式来 Hook:
  • 编写一个新的 Java 程序,先执行自定义 Shell 脚本(即我们需要在开机时运行的逻辑)。
  • 脚本执行完毕后,再调用原始的 felix.jar 启动系统服务。
  • 如果没有找到java进程,那么可以寻找一个二进制进程(在可写分区),流程一致。

这样一来:
  • 启动流程对原系统无任何功能影响。
  • 无需修改只读分区。
  • 脚本具备开机自动运行能力。


4. 具体操作
我自己写了一个jar包,还有两个二进制Hook程序(arm/arm64)。
程序运行逻辑:
  • 备份Hook程序到 devpai 目录下(为了防止系统更新把我们Hook程序覆盖了)。
  • 启动一个线程/进程,一直判断Hook程序是否被覆盖,如果被覆盖,则我们再覆盖回去。
  • 执行 devpai 目录下的 hook.sh ,这个就是我们的启动脚本了。
  • 执行原始程序,不破坏原始流程。

部署Hook程序:
1.下载Hook程序到临时目录并解压,可以看到3个Hook程序。
  1. cd /tmp

  2. # 下载Hook程序
  3. curl -k -L -o hookd.tgz https://github.com/zooyer/devpai/archive/refs/tags/v1.0.0.tar.gz

  4. # 解压Hook程序
  5. tar -zvxf hookd.tgz

  6. # 查看Hook程序
  7. cd devpai-1.0.0/
  8. ls
  9. #hookd.jar    hookd_arm    hookd_arm64
复制代码
2.通过上述方式找到Hook点,如:/usr/local/osgi/local/osgi/felix/bin/felix.jar
3.切换到Hook目录,复制对应Hook程序到该目录。
  1. # 切换到Hook目录
  2. cd /usr/local/osgi/local/osgi/felix/bin

  3. # 拷贝Hook程序,添加执行权限
  4. cp /var/tmp/devpai-1.0.0/hookd.jar .
  5. chmod a+x hookd.jar
  6. ls
  7. #felix.jar  hookd.jar

  8. # 创建Hook程序运行时目录
  9. mkdir devpai

  10. # 把原始程序,放入运行时目录
  11. mv felix.jar devpai
  12. # 把Hook程序,替换成原始程序
  13. mv hookd.jar felix.jar

  14. /usr/local/osgi/local/osgi/felix/bin #ls
  15. devpai     felix.jar
复制代码

4.创建Hook脚本:vi devpai/hook.sh
  1. #!/bin/sh

  2. user="$(/usr/bin/whoami)"

  3. init="/usr/data/devpai/init.sh"

  4. # 以root用户运行
  5. if [ "$user" != "root" -a "$user" != "" ]; then
  6.         echo "aDm8H%MdA" | su -c "$init"
  7.         exit
  8. fi

  9. $init
复制代码


这里我有调用了另一个目录中的初始化脚本,因为一般Hook目录的存储空间很小,不适合存放数据。
后续启动脚本就都在/usr/data/devpai/init.sh这个里面了。
5.杀掉java进程,让守护进程自动重新拉起。
  1. ps | grep java

  2. 1757 java      2h26 java -noverify -Dfile.encoding=UTF-8 -Xcompactalways -Djava.net.preferIPv4Stack=false -Dsun.zip.disableMemoryMapping=true -Duser.timezone=GMT+8 -XX:ErrorFile=/usr/data/java_excp_log/java_error_2078.log -Djava.security.policy=/usr/local/osgi/local/j2re/lib/security/private.policy -Dorg.osgi.framework.security=osgi -Xms48M -Xmx128M -Xss256K -jar /usr/local/osgi/local/osgi/felix/bin/felix.jar
  3. 3251 root     14:13 cpulimit -l 80 -e java
  4. 7982 root      0:00 grep java

  5. # 这一步很重要,很多情况下如果没有这个步骤的话,那么下次重启则不会执行Hook程序
  6. kill -9 1757
复制代码



发表于 昨天 22:06 | 显示全部楼层
感谢大佬分享666
 楼主| 发表于 8 小时前 | 显示全部楼层
uin 发表于 2025-7-1 22:06
感谢大佬分享666

感谢支持!感谢支持!
发表于 5 小时前 | 显示全部楼层
感谢大师分享!
发表于 1 小时前 | 显示全部楼层
感谢大师分享
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|宽带技术网 |网站地图 粤公网安备44152102000001号

GMT+8, 2025-7-2 09:24 , Processed in 0.023867 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表