首页 > 解决方案 > 如何防止检测到假GPS?

问题描述

我找到了一个检测位置欺骗并返回警告屏幕的应用程序。[1]:https ://i.stack.imgur.com/qbhuU.jpg 然后我尝试对应用程序进行逆向工程并删除isFromMockProvider()检查位置数据是否来自模拟位置提供程序的功能。我从一个 smali 文件中找到了这些代码行

method public onLocationChanged(Landroid/location/Location;)V
.registers 10
.annotation build Landroidx/annotation/RequiresApi;
    api = 0x12
.end annotation

const-string v0, "0"

.line 1
invoke-virtual {p1}, Landroid/location/Location;->isFromMockProvider()Z

move-result v1

const-string v2, "IS_MOCK"

const-string v3, "LIVE_TRACKING_MOCK_LOCATION"

if-eqz v1, :cond_1e

.line 2
new-instance p1, Landroid/content/Intent;

invoke-direct {p1, v3}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

const-string v0, "false"

.line 3
invoke-virtual {p1, v2, v0}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

.line 4
invoke-static {p0}, Landroidx/localbroadcastmanager/content/LocalBroadcastManager;->getInstance(Landroid/content/Context;)Landroidx/localbroadcastmanager/content/LocalBroadcastManager;

move-result-object v0

invoke-virtual {v0, p1}, Landroidx/localbroadcastmanager/content/LocalBroadcastManager;->sendBroadcast(Landroid/content/Intent;)Z

return-void

.line 5
:cond_1e
new-instance v1, Landroid/content/Intent;

invoke-direct {v1, v3}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

const-string v3, "false" 

此处必须进行哪些更改以防止检测到模拟位置?

标签: smalimock-location

解决方案


来电

invoke-virtual {p1}, Landroid/location/Location;->isFromMockProvider()Z
move-result v1

1如果使用模拟提供程序,则返回(true),0否则返回 (true)。结果存储在v1.

稍后该值用于条件分支

if-eqz v1, :cond_1e   // if v1==0 GOTO cond_1e

因此,只有在没有使用模拟提供程序 (v1=0) 时,它才会跳转到特殊的代码部分。否则,它将继续处理模拟位置的代码部分,这很可能是您不想要的。

因此,您必须调整该检查,为此您有两种可能性:

  1. 在检查之前用 0覆盖v1,例如通过命令const/4 v1, 0x0
  2. 将条件分支替换if-eqz v1, :cond_1e为非条件分支,goto :cond_1e因此无论值是什么都无关紧要v1

推荐阅读