Mikotwa / FuckLocation

A simple xposed module that helps you fully control your location.
https://github.com/Xposed-Modules-Repo/fuck.location
GNU Affero General Public License v3.0
342 stars 72 forks source link

请教问题 #7

Closed GeekTR closed 2 years ago

GeekTR commented 2 years ago

拜读了大佬的源码,有个问题困扰了我一天了,为什么hook LocationManagerService::getLastLocation()这个方法能无视SELiux的权限规则直接读取到/data/system/fuck_location_test目录下的文件呢?我试了hook很多其他的系统函数似乎都做不到。。。

Mikotwa commented 2 years ago

我目前的解决方案是:

  1. 在应用里生成好对应的 json 配置文件
  2. 使用 root 将配置文拷贝到 android 框架有权读取的地方(例如 /data/system)
  3. Xposed 层代码读取配置文件的副本
GeekTR commented 2 years ago

感谢大佬解答,但是我还是不是很理解以下两个问题:

  1. 为什么LocationManagerService::getLastLocation()这个方法可以访问/data/system的数据,而其他的一些地方比如(ActivityThread::handleResumeActivity())就无法访问/data/system的数据?
  2. 为什么可以hook到LocationManagerService,同样是com.android.server包下面的ActivityManagerService就无法hook,提示ClassNotFound?

不过根据大佬的思路,我发现把配置文件放在modulePath的同级目录(也就是插件app的apk文件的同级目录),其他app的任何一个方法都可以访问到。

Mikotwa commented 2 years ago

感谢大佬解答,但是我还是不是很理解以下两个问题:

  1. 为什么 LocationManagerService::getLastLocation () 这个方法可以访问 /data/system 的数据,而其他的一些地方比如(ActivityThread::handleResumeActivity ())就无法访问 /data/system 的数据?
  2. 为什么可以 hook 到 LocationManagerService,同样是 com.android.server 包下面的 ActivityManagerService 就无法 hook,提示 ClassNotFound?

不过根据大佬的思路,我发现把配置文件放在 modulePath 的同级目录(也就是插件 app 的 apk 文件的同级目录),其他 app 的任何一个方法都可以访问到。

  1. 没有仔细研究过,不过应该和 SELinux 上下文有关...
  2. 我自己的研究结论是,从 Android 10 开始,部分系统组件可以以 APEX 模块的方式放在其它位置,此时它们的源代码是不位于原本位置的。我自己的解决方案是 Hook 进 SystemService,在服务加载时拿到目标服务的 classLoader,从而 hook 指定类。
GeekTR commented 2 years ago

好的,我大概明白了,多谢大佬。