Root隐藏-西米露模块残留

Hrlni 发布于 2025-09-25 357 次阅读


西米露模块残留清理与环境异常问题分析

在刷了 西米露模块(HyperCeiler) 之后,我的设备在安全检测中出现了两个问题:

  • 牛头人 32 报告 found root
  • 春秋检测 提示 Abnormal Environment(2)

起初我以为是模块本身的问题,于是卸载掉,但异常依旧存在。接下来我尝试了几种办法,但都未能解决,直到我发现了“西米露模块残留”的关键。


问题起因

刷入 西米露模块 后,部分应用的安全检测开始异常:

  • 牛头人 32 直接检测到 root
  • 春秋检测判定运行环境异常

尽管平时对西米露的使用频率并不高,我还是选择了 卸载模块,但问题依旧存在。


尝试的解决办法

  1. 在酷安搜索到一些“清理环境”的 sh 脚本,执行后无效。
  2. 找到土豆大佬的“一键过牛头环境清理”,依然无效。
  3. 多次重复执行,查看清理日志,才发现了 西米露模块的残留属性

找到关键原因

日志提示:发现西米露模块残留

原来问题并不是脚本无效,而是 清理脚本未正确清理 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 "清理脚本执行完毕。建议重启设备并再次运行检测程序。"
此作者没有提供个人介绍。
最后更新于 2025-09-25