如何从安卓设备获取FirmwareVersionPreferenceController.java文件?
解决小众国产安卓设备开发者选项密码锁定问题
一、定位FirmwareVersionPreferenceController类的实际位置
由于是国产定制ROM,该类大概率不在默认的com.android.settings APK中,可能存在于以下位置:
- 系统框架Jar包:检查
/system/framework/目录下的厂商定制Jar(如framework-xxx.jar这类厂商命名的文件),使用jadx或jd-gui工具打开这些Jar包搜索目标类名。 - 厂商定制Settings组件:部分厂商会将定制逻辑拆分到独立APK中,比如
com.xxx.settings、com.xxx.systemui,可以通过以下命令列出系统所有APK并排查:find /system /product /oem -name "*.apk" | grep -i settings - 动态加载的Dex文件:有些ROM会把定制逻辑放在APK的
assets或lib目录下的Dex/ODEX文件中,反编译Settings APK时注意查看这些目录,用jadx加载整个APK目录(包含子文件)进行搜索。
二、解决反射找不到类的问题
反射失败通常是因为类加载器隔离或类不在当前进程的类路径中,可以尝试以下方法:
- 使用目标进程的类加载器:Settings应用可能使用自定义类加载器,先获取Settings进程的类加载器再加载类:
// 获取Settings应用的Context Context settingsContext = createPackageContext("com.android.settings", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); ClassLoader loader = settingsContext.getClassLoader(); Class<?> c = loader.loadClass("com.android.settings.deviceinfo.FirmwareVersionPreferenceController"); - 检查类的完整签名:异常信息中的类名可能存在内部类或拼写误差,确认是否是
com.android.settings.deviceinfo.FirmwareVersionPreferenceController$PasswordDialog这类内部类形式。
三、获取密码对话框实例的方案
不需要直接找到类文件,可通过Hook框架拦截对话框的创建和验证逻辑:
- 使用Xposed/LSPosed Hook:
- Hook
Dialog.show()方法,筛选标题为Please enter password的对话框,获取实例后可直接关闭或修改其验证逻辑:XposedHelpers.findAndHookMethod(Dialog.class, "show", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { Dialog dialog = (Dialog) param.thisObject; if ("Please enter password".equals(dialog.getTitle())) { // 直接关闭对话框 dialog.dismiss(); } } }); - 直接Hook
FirmwareVersionPreferenceController的PasswordDialog方法,拦截对话框的创建:XposedHelpers.findAndHookMethod("com.android.settings.deviceinfo.FirmwareVersionPreferenceController", lpparam.classLoader, "PasswordDialog", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { // 阻止对话框弹出 param.setResult(null); } });
- Hook
- 通过日志追踪验证逻辑:
- 输入错误密码时,使用
logcat过滤相关日志:logcat -v time *:V | grep -i "password\|verify\|FirmwareVersion" - 查看日志中是否有密码验证的关键方法或存储位置(如SharedPreferences、系统属性),直接修改对应值绕过验证。
- 输入错误密码时,使用
四、其他可行思路
- 提取系统镜像:如果设备已Root,可通过
dd命令提取/system分区镜像,然后在镜像中全局搜索目标类的字节码文件,找到后反编译查看。 - 使用Frida动态分析:Attach到Settings进程,动态查找并Hook目标类的方法:
Java.perform(function() { var cls = Java.use("com.android.settings.deviceinfo.FirmwareVersionPreferenceController"); cls.PasswordDialog.implementation = function() { // 不执行原方法,直接返回 return null; }; });
内容的提问来源于stack exchange,提问作者Athwale
相关产品推荐
相关产品推荐

