V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gam2046
V2EX  ›  Android

求教非 Hook 方式实现的位置修改的原理以及检测方式

  •  
  •   gam2046 · 2020-02-18 10:47:06 +08:00 · 9420 次点击
    这是一个创建于 1740 天前的主题,其中的信息可能已经有所发展或是发生改变。

    已知

    • 目前绝大多数修改设备位置的方案,大多是基于各类 hook 方案实现,通常埋点在 LocationManager
    • Xposed、Magisk + TaiChi/EdXposed ( SandHook )等等,实现的 Hook 方案

    疑问

    通过搜索发现,目前有部分软件

    • 不需要开启“开发者选项”中“模拟位置”;
    • 不需要 Hook 框架
    • 需要 Root

    即可实现修改位置。如“神行者”等。

    此类软件实现的方法是什么?以及可以如何检测出来?


    盲猜的实现方式

    • 直接写入 /dev

    应对方案

    • 增加辅助位置信息获取,如基站、蓝牙、WiFi 等等信息
    • 拒绝 Root 环境下运行

    显然第二点并不是比较好的方案。对于 Hook 类的修改位置,目前已经有比较成熟的检测方法,但是对于这类无需 Hook 的模拟位置,由于我不清楚其原理,是否有大佬能给我科普一下,其实现方式?

    5 条回复    2020-02-19 14:14:04 +08:00
    wjdimba
        1
    wjdimba  
       2020-02-18 11:02:16 +08:00
    自己集成 hook 代码不就好了,不一定要装 xposed 框架
    gam2046
        2
    gam2046  
    OP
       2020-02-18 11:18:52 +08:00
    @wjdimba 自己集成应该如何实现呢。首先 Zygote 启动是先于目标程序的,因此这段代码无法注入 Zygote 以达到注入所有程序。同时也没有重启 Zygote,重启 Zygote 会导致软重启,实际使用这类软件的时候,并未出现这种情况。

    那么看起来,启动目标应用的入口,即使 Root,也无法魔改。所以,我没有猜测到实现方式,也没有搜到类似的开源方案。
    wjdimba
        3
    wjdimba  
       2020-02-18 15:29:00 +08:00
    android root 之后拦截 binder 调用,就可以修改 imei imsi 通讯录 地理位置等信息的返回
    gam2046
        4
    gam2046  
    OP
       2020-02-18 16:24:40 +08:00
    @wjdimba 有相关资料科普嘛?

    目标应用是由 Zygote fork 出来后 setuid/setgid,然后交由目标程序运行。这个中间是哪里拦截,我没想通。

    如果是 ServiceManager 做拦截的话,这部分是 framework 的代码,因此在 Zygote 已经被加载,无法让其返回自己的 Binder 对象。

    如果是在目标进程获取到 Binder 对象时,进行替换,那么问题又回去了。目标进程是由 Zygote fork 出来的,中间似乎没有能够插入的机会?(或者是我不知道的途径?
    weishu
        5
    weishu  
       2020-02-19 14:14:04 +08:00   ❤️ 1
    ptrace zygote
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1370 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 17:35 · PVG 01:35 · LAX 09:35 · JFK 12:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.