如何防止检测到假 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)它才会跳转到一个特殊的代码部分。否则它会继续处理模拟位置的代码部分,这很可能是您不想要的。
因此您必须调整该检查,为此您有两种可能性:
- 检查前用0覆盖
v1
,例如通过命令 const/4 v1, 0x0
- 将条件分支
if-eqz v1, :cond_1e
替换为非条件分支 goto :cond_1e
,因此 v1
的值无关紧要。
我找到了一个可以检测位置欺骗和 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)它才会跳转到一个特殊的代码部分。否则它会继续处理模拟位置的代码部分,这很可能是您不想要的。
因此您必须调整该检查,为此您有两种可能性:
- 检查前用0覆盖
v1
,例如通过命令const/4 v1, 0x0
- 将条件分支
if-eqz v1, :cond_1e
替换为非条件分支goto :cond_1e
,因此v1
的值无关紧要。