如何绕过isFromMockProvider?Smali修改方案求助(Python开发者)
绕过虚拟定位检测的Smali修改方案
代码逻辑分析
你贴的这个isMocked静态方法是应用判断虚拟定位的核心:
- 先做参数非空校验,避免空指针崩溃;
- 检查Android系统版本:如果SDK版本低于31(十六进制
0x1f对应十进制31),调用系统APILocation.isFromMockProvider()获取检测结果; - 若SDK版本≥31,则调用应用内部的
RouteStepView$$ExternalSyntheticApiModelOutline0.m()方法做检测; - 最终返回检测结果,返回
true就会判定你用了虚拟定位。
修改方案(两种可选)
方案一:直接让方法返回false(最简单通用)
直接跳过所有检测逻辑,让这个方法永远返回false,这样应用就永远不会认为你在用虚拟定位。修改后的完整Smali代码如下:
.method public static final isMocked(Landroid/location/Location;)Z .locals 2 const-string v0, "<this>" invoke-static {p0, v0}, Lkotlin/jvm/internal/Intrinsics;->checkNotNullParameter(Ljava/lang/Object;Ljava/lang/String;)V // 强制返回false(0x0对应boolean类型的false) const/4 p0, 0x0 return p0 .end method
只保留参数非空校验(避免应用崩溃),其余检测代码全部删除,直接返回false即可。
方案二:针对性修改各版本分支(保留原有框架)
如果你不想完全删除原有逻辑,只想篡改检测结果,可以分别修改两个版本分支的代码:
- 低版本分支(SDK<31):找到
:cond_0标签后的代码,替换成直接返回false
:cond_0 // 注释掉原有的检测调用 // invoke-virtual {p0}, Landroid/location/Location;->isFromMockProvider()Z // move-result p0 // 强制设置返回false const/4 p0, 0x0
- 高版本分支(SDK≥31):找到
.line 200后的代码,替换成直接返回false
.line 200 // 注释掉原有的检测调用 // invoke-static {p0}, Lcom/free/freeapp/ui/RouteStepView$$ExternalSyntheticApiModelOutline0;->m(Landroid/location/Location;)Z // move-result p0 // 强制设置返回false const/4 p0, 0x0
操作流程提示
因为你是Python开发者,可能对Android逆向工具不熟悉,简单步骤如下:
- 用Apktool反编译目标APK;
- 在反编译后的文件中,找到包含这个
isMocked方法的Smali文件(根据方法所属类的路径查找); - 按照上面的方案修改代码;
- 用Apktool重新编译APK;
- 用签名工具(比如apksigner)给编译后的APK签名,签名后才能安装到设备上。
内容的提问来源于stack exchange,提问作者Aliana
相关产品推荐
相关产品推荐

