You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绕过isFromMockProvider?Smali修改方案求助(Python开发者)

绕过虚拟定位检测的Smali修改方案

代码逻辑分析

你贴的这个isMocked静态方法是应用判断虚拟定位的核心:

  • 先做参数非空校验,避免空指针崩溃;
  • 检查Android系统版本:如果SDK版本低于31(十六进制0x1f对应十进制31),调用系统API Location.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即可。

方案二:针对性修改各版本分支(保留原有框架)

如果你不想完全删除原有逻辑,只想篡改检测结果,可以分别修改两个版本分支的代码:

  1. 低版本分支(SDK<31):找到:cond_0标签后的代码,替换成直接返回false
:cond_0
// 注释掉原有的检测调用
// invoke-virtual {p0}, Landroid/location/Location;-&gt;isFromMockProvider()Z
// move-result p0
// 强制设置返回false
const/4 p0, 0x0
  1. 高版本分支(SDK≥31):找到.line 200后的代码,替换成直接返回false
.line 200
// 注释掉原有的检测调用
// invoke-static {p0}, Lcom/free/freeapp/ui/RouteStepView$$ExternalSyntheticApiModelOutline0;-&gt;m(Landroid/location/Location;)Z
// move-result p0
// 强制设置返回false
const/4 p0, 0x0

操作流程提示

因为你是Python开发者,可能对Android逆向工具不熟悉,简单步骤如下:

  1. 用Apktool反编译目标APK;
  2. 在反编译后的文件中,找到包含这个isMocked方法的Smali文件(根据方法所属类的路径查找);
  3. 按照上面的方案修改代码;
  4. 用Apktool重新编译APK;
  5. 用签名工具(比如apksigner)给编译后的APK签名,签名后才能安装到设备上。

内容的提问来源于stack exchange,提问作者Aliana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:55:35