西米露模块残留清理与环境异常问题分析
在刷了 西米露模块(HyperCeiler) 之后,我的设备在安全检测中出现了两个问题:
- 牛头人 32 报告
found root - 春秋检测 提示
Abnormal Environment(2)
起初我以为是模块本身的问题,于是卸载掉,但异常依旧存在。接下来我尝试了几种办法,但都未能解决,直到我发现了“西米露模块残留”的关键。
问题起因
刷入 西米露模块 后,部分应用的安全检测开始异常:
- 牛头人 32 直接检测到 root
- 春秋检测判定运行环境异常
尽管平时对西米露的使用频率并不高,我还是选择了 卸载模块,但问题依旧存在。
尝试的解决办法
- 在酷安搜索到一些“清理环境”的
sh脚本,执行后无效。 - 找到土豆大佬的“一键过牛头环境清理”,依然无效。
- 多次重复执行,查看清理日志,才发现了 西米露模块的残留属性。
找到关键原因
日志提示:发现西米露模块残留
原来问题并不是脚本无效,而是 清理脚本未正确清理 persist.hyperceiler.log.level 属性。
这就导致系统环境中始终存在残留,进而被安全检测识别。
Android 属性残留原理
在 Android 中,属性(Property)分为两类:
- 临时属性:仅存在于运行时内存中,系统重启后消失。
- 持久化属性(persist. 前缀):会被写入磁盘文件,重启也会保留。
持久化属性的存储路径一般是:
/data/property/
例如:
/data/property/persist.hyperceiler.log.level
这就是为什么即使卸载了西米露模块,persist.hyperceiler.log.level 依然存在,导致检测报错。
清理脚本
下面是我最终编写的清理脚本,可以自动检测并删除残留属性:
#!/system/bin/sh
# clear_hyperceiler.sh
# 兼容性清理脚本:清理 persist.hyperceiler.* 残留
#
# 使用方法(推荐):
# adb push clear_hyperceiler.sh /data/local/tmp/
# adb shell
# su
# sh /data/local/tmp/clear_hyperceiler.sh
#
# 脚本说明:优先使用 resetprop(如果存在),并在老系统里删除 /data/property/ 下对应文件(需要 root)。
RESETPROP_BIN=$(command -v resetprop 2>/dev/null || true)
GETPROP_BIN=$(command -v getprop 2>/dev/null || true)
echo "=== 清理 HyperCeiler 持久化属性(persist.hyperceiler.*) ==="
# 检查 getprop 是否可用
if [ -z "$GETPROP_BIN" ]; then
echo "错误:系统缺少 getprop,无法继续。"
exit 1
fi
# 提取所有 persist.hyperceiler.* 的属性名(兼容 getprop 输出格式 "[prop]: [value]")
PROPS=$(getprop | sed -n 's/^\[\(persist\.hyperceiler\.[^]]*\)\].*$/\1/p')
if [ -z "$PROPS" ]; then
echo "未发现任何 persist.hyperceiler.* 属性,退出。"
exit 0
fi
# 如果不是 root,提醒(某些操作可能失败)
if [ "$(id -u 2>/dev/null || echo 1)" != "0" ]; then
echo "警告:当前未以 root 运行,某些操作(删除 /data/property 文件、resetprop)可能失败。"
echo "建议以 root 权限执行脚本(su 或 adb shell -> su)。"
fi
for PROP_NAME in $PROPS; do
OLD_VALUE=$(getprop "$PROP_NAME")
echo "----------------------------------------"
echo "发现属性: $PROP_NAME = $OLD_VALUE"
# 优先使用 resetprop(Magisk),因为它可以修改持久化属性
if [ -n "$RESETPROP_BIN" ]; then
echo "使用 resetprop 清空 $PROP_NAME"
"$RESETPROP_BIN" "$PROP_NAME" ""
# resetprop 在某些实现中返回非 0 但仍有效,不强行检查返回码
else
echo "resetprop 未找到,尝试使用 setprop"
setprop "$PROP_NAME" ""
fi
# 兼容旧版本:如果 /data/property 下有对应文件,尝试删除
if [ -d /data/property ]; then
PROP_FILE="/data/property/${PROP_NAME}"
if [ -f "$PROP_FILE" ]; then
echo "检测到旧版属性文件:$PROP_FILE,尝试删除(需要 root)"
rm -f "$PROP_FILE" 2>/dev/null && echo "已删除 $PROP_FILE" || echo "删除 $PROP_FILE 失败(权限?)"
fi
fi
# 额外:有些设备可能把持久化属性放在其他位置,提示用户手动检查
# (这里不盲目删除其他路径,避免误删)
NEW_VALUE=$(getprop "$PROP_NAME")
if [ -z "$NEW_VALUE" ]; then
echo "✅ $PROP_NAME 已清理"
else
echo "❌ $PROP_NAME 清理失败,当前值: $NEW_VALUE"
echo " 建议:以 root 运行并检查是否存在其它同名文件,或检查是否有别的进程/模块在启动时又写回该属性。"
fi
done
echo "----------------------------------------"
echo "清理脚本执行完毕。建议重启设备并再次运行检测程序。"

Comments NOTHING