百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

如何逆向苹果定位服务协议?(ios定位原理)

bigegpt 2024-08-02 11:06 12 浏览

翻译:360代码卫士

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

概述


本文作者表示自己在Whereami工作时对苹果公司的位置服务如何运作很感兴趣。以下是作者对如何逆向位置服务协议的描述。

由于Little Snitch一直拦截locationd,因此我了解到该协议是通过locationd处理的。由于macOS目前具有系统完整性保护 (SIP) 功能,因此通过proxychains检查流量的普通方式不起作用了。另外一种方法就是将Charles设置为iOS设备的中间人代理。看到多数是由设备背景连线通信产生的流量,于是我得到了想要的东西即一个位置服务请求。

位置服务请求


这个请求本身只是application/x-www-form-urlencode以及一些二进制数据。

不起作用,可能是因为请求里面存在多余的东西。按逻辑来说这些mac地址应该是数据的一部分。我们试着来解码一下这些地址,如下十六进制转储中的蓝色部分所示:

还是不行。顶部看起来就像是一个头部。我们试着删除头部看看。

还是不行。

多次尝试未果之后,我决定通过从开头把字节一个一个地删除的暴力方法来看看能否解码。稍微改进的脚本版本如下。

protomower.sh

运行之后发现三个匹配似乎是误报。虽然有输出但有些数据时乱码。第四个看似是合法的。

看似我原来的想法非常接近真相了。黄色部分是被删掉的字节。蓝色部分是成功被解码的PB信息。

也就是说请求信息由四种不同类型的数据组成。在PB术语中,每种数据类型都被称作一个标签。那么这条信息就有四个标签。

1是包含一个mac地址的字符串,基本上跟一个无线路由器mac地址差不多。

2是包含1作为值的内嵌信息,将其看做一个结构或对象即可。

3 和 4都是整数。我不知道它们的含义是什么,可能是说路由器最近一次出现的年份或者是信号噪音比。

为了验证这些假设,我们试着通过不同的mac地址提出一个请求。我通过一个十六进制编辑器来编辑二进制请求文件并通过curl命令提出一个POST请求。

还是不行。为什么会出现问题呢?

从转储中我们可看出信息现在是1个字节的长度,那么某个地方可能是一个校验和。这一点显而易见。0x2d的小数有效位数是45,而原始信息是45字节长。新的信息是46字节长,那么转换成十六进制应该是0x2e。我猜变量是一个32位的整数即0x002e。

成功了。现在我们就可以知道请求的格式了。

头部本身可进一步进行分割。

地址服务响应

响应本身非常大。

这次,我们还是用暴力笨办法,事实证明有效果。解码的输出大概是1400行长。

第一行有点让人困惑。18446744073709551615 等于 0xfffffffffffffff也就是最大的无符号64位值。这可能意味着mac地址并未发现。我不知道18446744055709551616即0xfffffffbcf1dcc00的情况如何。

余下的结果更清楚。

2-1 是mac地址

2-2-1 是纬度 135582881 * pow(10, -8) = 1.35544532

2-2-2是经度10399172128 * pow(10, -8) = 103.99172128

2-2-3 貌似是位置精确度,

2-21 很可能是无线信道。

我刚开始不解的是为什么会得到101个结果。后来想明白了,这说明成功的结果是100个。刚开始的两个是我发送的mac地址,其余的是跟我提交的地址临近的mac地址。

但为啥有100个结果呢?


我猜可能是苹果公司去掉了对客户的三边测量计算,它并没有为每个人做出昂贵的计算,而是提供了一些访问点和坐标。

如果其中至少有三个地址是客户可见的,那么核心位置就能够使用信号水平作为距离。当你拥有三个坐标以及它们离目标位置的距离后,你就能合理地计算出目标位置在哪里。

如下是请求位于新加坡樟宜的位置时返回的访问点位置服务。

拥有了周边数百个访问点的信息还省去了再次联系位置服务服务器的必要。只要核心位置拥有三个可见访问点的坐标,那么就能够准确地计算出目标位置在哪里。即使是在离线的情况下只要开启了wifi,一样可以找到准确位置。

如何为我所用?


你可以为不带用户空间核心位置支持的编程语言写支持,不过其实可以用更简单的办法实现这个诉求。其实可以写一下你自己的位置服务服务器,帮助定位app做出一些有创意的调试,这个会更有意思。

延伸阅读


Application à l’analyse des données de géolocalisation envoyées par un smartphone 这是一篇法语论文,来了没有一些.proto文件实例和Python代码,我就是从这里开始的。不过论文发表之时协议似乎已经发生变化了

Vulnerability Analysis and Countermeasures for WiFi-based Location Services and Application (《基于WiFi地理服务和应用程序的漏洞分析和应对方法》)可大体了解基于WiFi的定位是如何运作的。

相关推荐

Go语言泛型-泛型约束与实践(go1.7泛型)

来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...

golang总结(golang实战教程)

基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...

Go 官宣:新版 Protobuf API(go pro版本)

原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...

Golang开发的一些注意事项(一)(golang入门项目)

1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

golang 托盘菜单应用及打开系统默认浏览器

之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...

golang标准库每日一库之 io/ioutil

一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...

文件类型更改器——GoLang 中的 CLI 工具

我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...

Go (Golang) 中的 Channels 简介(golang channel长度和容量)

这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...

Golang引入泛型:Go将Interface「」替换为“Any”

现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...

一文带你看懂Golang最新特性(golang2.0特性)

作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...

Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移

以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...

Golang使用grpc详解(golang gcc)

gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...

Etcd服务注册与发现封装实现--golang

服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...

Golang:将日志以Json格式输出到Kafka

在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...

如何从 PHP 过渡到 Golang?(php转golang)

我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...