如何防止检测到假 GPS?

How to prevent the detection of fake GPS?

我找到了一个可以检测位置欺骗和 returns 警告屏幕的应用程序。 [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" 

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

来电

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

returns 1 (true) 如果使用模拟提供者,否则 0。结果存储在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 的值无关紧要。