动态修改Android参数信息的方法绕过改机检测

部署运行你感兴趣的模型镜像

有很多朋友咨询过我如果修改Android的系统参数 比如 ro.build.id ro.product.name ro.product.device ro.product.model等参数。对应在APP端的java代码就是Build.ID Build.PRODUCT Build.MODEL等参数。
不同于Xposed VirtualApp 双开助手
DualSpace
Go双开
双开精灵 这些软件是通过hook方式,让app 运行在一个虚拟的环境中。世面上有很多成熟的技术可以检测到app 是真实运行在Android中还是虚拟空间中。如果彻底的修改只能通过修改Android源码的方式。一劳永逸的解决
Android 的参数信息主要保存在build.prop中,

# begin build properties
# autogenerated by buildinfo.sh
ro.build.id=KOT49H
ro.build.display.id=V1.01
ro.build.version.incremental=eng.dyna.1477556289
ro.custom.build.version=1477556289
ro.build.version.sdk=19
ro.build.version.codename=REL
ro.build.version.release=4.4.2
ro.build.date=Thu Oct 27 16:21:53 CST 2016
ro.build.date.utc=1477556513
ro.build.type=user
ro.build.user=dyna
ro.build.host=dyna-PowerEdge-R720
ro.build.tags=test-keys
ro.product.model=P92
ro.product.brand=alps
ro.product.name=sanstar82_cwet_kk
ro.product.device=sanstar82_cwet_kk
ro.product.board=sanstar82_cwet_kk
ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
ro.product.manufacturer=alps
ro.product.locale.language=zh
ro.product.locale.region=CN

一个标准的build.prop文件如上图所示,Android系统在启动的阶段,会在解析init的时候加载这些属性文件
\system\core\init\Init.c

int main(int argc, char **argv)
{    
    //加入到action queue队列
    queue_builtin_action(property_service_init_action, "property_service_init");
    for(;;)
        //执行action queue队列
        //接收通过socket向property service 发送的数据;
        nr = poll(ufds, fd_count, timeout);
        ……
        handle_property_set_fd();
}

property_service_init_action是初始化属性的入口

static int property_service_init_action(int nargs, char **args)
{
    start_property_service();

}

\system\core\init\property_service.c:

void start_property_service(void)
{
    //加载属性配置文件
    load_properties_from_file(PROP_PATH_SYSTEM_BUILD);
    load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT);
    load_properties_from_file(PROP_PATH_LOCAL_OVERRIDE);
    load_persistent_properties();
    
    //创建socket资源 并绑定
    fd = create_socket(PROP_SERVICE_NAME, SOCK_STREAM, 0666, 0, 0);
    //监听
    listen(fd, 8);
}

Property Service 是运行在init守护进程中。

这里会加载 /system/build.prop /default.prop 这两个属性文件
之后保存这些属性到共享内存空间。供所有进程访问
这里有三种方式访问系统属性。
第一种是adb shell 方式

PS C:\Users\xxx> adb shell getprop  ro.product.cpu.abilist32
armeabi-v7a,armeabi
PS C:\Users\xxx>

第二种 通过SystemProperties 类访问,这个需要导入Android 源码的framework.jar ,否则编译通过不了

String test = SystemProperties.get("o.build.id");

没有framework.jar ,也可以通过反射的方式

     public String getProperty(String key, String defaultValue) {
        String value = defaultValue;
        try {
            Class<?> c = Class.forName("android.os.SystemProperties");
            Method get = c.getMethod("get", String.class, String.class);
            value = (String)(get.invoke(c, key, "unknown" ));
        } catch (Exception e) {
            e.printStackTrace();
        }
         return value;
    }

第三种是

android.os.Build.PRODUCT
android.os.Build.ID

通过源码可以明显看到这种方法只是第二种做了一层封装

 public static  final String PRODUCT = getString("ro.product.name");

    /** The name of the industrial design. */
    public static  final String DEVICE = getString("ro.product.device");
private static String getString(String property) {
        return SystemProperties.get(property, UNKNOWN);
    }

最后还是调用 SystemProperties.get 获取系统参数
现在如果想修改Android系统参数,可以通过上面三种方式。但是在实际测试中。大家在获取参数的时候只会用到第二种和第三种。
有人首先想到修改\frameworks\base\core\java\android\build.java文件。

public class Build {
    private static final String TAG = "Build";

    /** Value used for when a build property is unknown. */
    public static final String UNKNOWN = "unknown";

    /** Either a changelist number, or a label like "M4-rc20". */
    public static final String ID = "PPTVID";

    /** A build ID string meant for displaying to the user */
    public static final String DISPLAY = "PPTVDISPLAY";

    /** The name of the overall product. */
    public static final String PRODUCT = "PPTVTV";

    /** The name of the industrial design. */
    public static final String DEVICE = "PPTV_OS";

这种方式完全可以,但是没法做到动态。
后面我又想到一种方法。加入B 是检测改机的APP,我让B 在调用时候 执行下面的语句

public static final String PRODUCT = SystemProperties.get(ro.product.name, UNKNOWN);

然后我专门做一个A app 用于修改

 SystemProperties.set(ro.product.name,"PPTV")
 .......

每次B 启动前,我先让A执行 SystemProperties.set 修改系统参数。
测试后发现A的修改只对 A这个app 起作用。后来查看源码得知
1、首先public static final String PRODUCT 是final 类型
只会在初始化执行一次。
2、build.java 是static类型。每个进程单独有一份。不是共享的。
所以修改A只会对A进程起作用
我又想到动态修改 SystemProperties 里面的属性。在系统启动的时候加载我自己预置/sdcard/build.prop

private  String FindProp(String key) {
        String fileName = "build.prop";
        String retValue = null;
        try {
            String sdPath = Environment.getExternalStorageDirectory().getPath();
            File file = new File(sdPath,fileName);
            if (file.isFile() && file.exists()) {
                InputStreamReader isr = new InputStreamReader(new FileInputStream(file));
                BufferedReader br = new BufferedReader(isr);
                String lineTxt = null;
                while ((lineTxt = br.readLine()) != null) {
                    if (!"".equals(lineTxt)) {
                        if(lineTxt.contains("#")){
                            continue;
                        }
                        String props[] = lineTxt.split("\\=");
                        if(props.length == 2){
                            String propKey = lineTxt.split("\\=")[0];
                            String propValue = lineTxt.split("\\=")[1];
                            if(propKey.equals(key)){
                                retValue = propValue;
                                break;
                            }else{
                                continue;
                            }
                        }
                    }
                }
                isr.close();
                br.close();
            }else {
                //		  Toast.makeText(getApplicationContext(),"can not find file",0).show();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  retValue;
    }

测试之后跟上面一样,无法正常修改。
最后经过多次测试终于找到一个合适的方法,原理是
在这里插入图片描述
原理是开发一个app 用于检测管理
1、读取要修改的系统参数文件,可以是/sdcard/build.prop 或者
从网络获取
2、设置当前的属性到SystemProperties 和build中。
3、开启标志,开启后改机检测工具就读我们设置的属性
经过测试完全满足要求。有希望交流的朋友可以加我qq:875646589

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>我们正在讨论的是如何让应用程序绕过LSPosed框架的识别功能。LSPosed是一个基于Riru或Zygisk的Xposed框架,允许用户在不修改APK的情况下修改系统和应用程序的行为。一些应用程序会检测设备是否被修改(如是否使用了Xposed框架、Magisk等)以增强安全性或防止作弊。因此,用户可能需要绕过这些检测。 关键点: 1. 应用程序可能通过多种方式检测环境,包括检查Xposed框架的存在、Magisk的存在、特定文件或属性、运行进程等。 2. LSPosed本身可能被检测到,因此需要隐藏LSPosed的痕迹。 常见绕过方法: - 使用隐藏Root或隐藏Xposed模块:例如,Magisk的“Magisk Hide”功能(现在在Magisk Delta或Magisk Alpha中可能有不同的名称,如“Zygisk”)可以隐藏Root。对于LSPosed,可以使用一些模块来隐藏自身。 - 使用特定的模块:例如,可以使用“Hide My Applist”(隐藏应用列表)模块来阻止目标应用程序检测到Xposed模块或特定应用的存在。 - 修改设备指纹:使用工具(如“设备模拟器”类模块)变设备上报的硬件信息,但注意LSPosed环境本身可能被检测,所以需要同时隐藏框架。 步骤建议: 1. 确保Magisk(或类似工具)已正确安装并隐藏Root:使用Magisk Hide(或Zygisk Hide)将目标应用添加到隐藏列表中,并确保Magisk本身已重命名(随包名)。 2. 安装LSPosed(建议使用Zygisk版本,即通过Magisk的Zygisk启用)并保持更新。 3. 安装隐藏Xposed框架的模块,例如: - 对于LSPosed,可以使用“Shamiko”模块(配合Zygisk使用)来隐藏Root和Xposed框架。Shamiko是一个黑名单模式的隐藏模块,需要在Magisk设置中关闭“遵守排除列表”而使用Shamiko。 - 也可以使用“Hide My Applist”(隐藏应用列表)模块,它可以创建一个空的应用列表给目标应用,从而隐藏其他模块应用。 4. 使用“设备模拟器”类模块(如“Xposed Edge”或特定模块)来修改设备信息,但注意这些模块本身需要被隐藏,否则会被检测。 操作流程: 1. 在Magisk中启用Zygisk,并在设置中配置“排除列表”(即原来的Magisk Hide),将目标应用选入排除列表(但注意:如果使用Shamiko,则需要关闭排除列表的开关,而由Shamiko接管)。 2. 在Magisk中安装LSPosed(Zygisk版本)。 3. 在LSPosed中安装Shamiko模块并启用。然后重启设备。 4. 在LSPosed中安装“隐藏应用列表”模块(如Hide My Applist),并配置目标应用,使其无法检测到LSPosed和其他相关模块。 注意:不同应用程序的检测点不同,可能需要多种方法结合使用。 引用说明: 关于隐藏应用列表的使用,该模块可以创建模板,将需要隐藏的应用(如Magisk、LSPosed管理器等)从目标应用的应用列表中移除。具体配置步骤: - 安装Hide My Applist模块并启用。 - 打开Hide My Applist应用,创建一个模板(比如命名为“隐藏”),勾选需要隐藏的应用(如Magisk、LSPosed等)。 - 然后进入“应用管理”,选择目标应用,应用这个模板,并启用对该应用的隐藏。 此外,有些应用还会检测模拟器、调试模式、多开环境等,因此需要根据具体应用的检测点来调整。 由于绕过检测是一个持续对抗的过程,可能随着应用程序的更新而失效,因此需要关注相关模块的更新。 引用来源: [^1]: Magisk官方文档 [^2]: LSPosed GitHub仓库 [^3]: Shamiko模块发布页面 [^4]: Hide My Applist模块文档 最后,请注意,绕过应用程序的安全检测可能违反应用的服务条款,请确保在合法合规的范围内使用。 生成相关问题: 1. 如何检查应用程序使用了哪些检测方法? 2. Shamiko模块和Magisk Hide有什么区别? 3. 使用Hide My Applist模块时,如何配置模板? 4. 除了上述方法,还有哪些常用的绕过检测的技术? </think> ### 绕过LSPosed识别的方法绕过APP对LSPosed环境的检测,需从**框架隐藏**、**设备指纹伪造**和**行为模拟**三个层面入手。以下是具体方案: --- #### **1. 隐藏LSPosed框架痕迹** - **使用Shamiko模块** 在LSPosed中激活Shamiko模块(需配合Magisk的Zygisk),通过黑名单模式隐藏框架进程。配置步骤: ```bash 1. Magisk → 设置 → 启用Zygisk 2. 安装Shamiko模块 → 在LSPosed中激活 3. 关闭Magisk的“遵守排除列表” → 由Shamiko接管隐藏[^1] ``` - **应用列表隔离** 使用 **Hide My Applist** 模块,创建空白应用列表模板,阻止目标APP读取Xposed模块信息: ```bash 1. LSPosed中启用Hide My Applist 2. 添加目标APP → 屏蔽其读取com.android.settings、LSPosed等包名 3. 启用“增强模式”防止反射检测[^2] ``` --- #### **2. 伪造设备指纹** - **修改设备参数** 使用 **Device Simulator** 或 **XPrivacyLua** 模块,动态覆盖以下敏感信息: - `Build` 类参数(如`BRAND`, `MODEL`, `IMEI`) - `SystemProperties`(如`ro.debuggable`) - 文件系统特征(如`/system/bin/su`) - **随化指纹** 通过 **Randomize Device ID** 模块,每次启动时生成随的`ANDROID_ID`、`MAC地址`和`SIM序列号`,避免静态特征匹配[^3]。 --- #### **3. 规避行为检测** - **禁用调试接口** 在`build.prop`中关闭调试功能: ```properties ro.debuggable=0 persist.sys.usb.config=none ``` - **拦截内核日志** 使用 **KernelSU** 或 **SELinux规则** 限制APP读取`/proc/kmsg`和`dmesg`日志。 - **模拟真实硬件交互** 通过 **Sensor Spoofer** 模块生成模拟的加速度计/陀螺仪数据,防止传感器指纹异常。 --- ### **操作验证** 1. **检测工具校验** 使用 **RootBeer Sample** 或 **Xposed Checker** 测试隐藏效果。 2. **日志监控** 用`logcat | grep -i "xposed\|root"`检查框架泄漏痕迹。 > ⚠️ 注意:部分高安全应用(如金融类APP)可能采用**多维度交叉验证**,需结合具体APP的检测策略调整方案。频繁更新模块版本可对抗新增检测点[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九霄的爸爸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值