从跟踪设备中提取数据

2021-05-16 13:56:30

许多消费者个人跟踪设备似乎只有几年的保质期。所以,如果你'遗嘱有兴趣保持你的进步的长期历史,你必须弄清楚如何在他们的应用程序中努力从他们的服务器上获取自己的数据。否则,当天他们的应用程序或服务器停止工作,您的数据将简单地消失。

我使用了两个跟踪设备,其中数据不易出口,Microsoft Band(2019年5月)和Hello Sense(2017年6月关闭,而且从未发送他们所说的数据导出说明即将到来的数据,所以我记录了我通过的过程来检索我自己的数据,希望其他人试图为其他设备做同样的操作。

当宣布微软乐队时,我很激烈地发现第一个拧紧设备,以便拥有心率传感器和GPS,以及其他传感器。我的博士学位。学生Alexandra在很难找到时,我会陷入乐队,但我很失望的是,了解它遭受了相同的问题,困扰了这么多有前途的可穿戴设备:无法导出自己的分钟数据。

乐队同步到自己的智能手机应用程序,称为Microsoft Health,但在网上搜索后很清楚,没有人知道他们的数据。我问了在微软研究中致力于乐队的人,他是否知道一种创造性的方式来获取它的数据,并且他挑战,"你'我们没有曝光原始数据这一点,但期待着看到你想出的东西...... :)"

我请亚历山德拉从手机应用中转储数据,以了解如何存储数据。她设法出口一堆文件,但在挖掘之后,我们发现了每日摘要的缓存数据,但不是我知道的原始分钟值是在某处存储的,因为Microsoft Health App中的睡眠图表显示更精细 - 粒度数据(下面的左屏幕截图)。

我决定进一步挖掘并分解应用程序以了解数据通过阅读应用程序代码的位置。我在手机上使用了一个名为es文件资源管理器的应用程序将应用程序包(apk文件)从手机中获取到我的计算机(上面的右屏幕截图)。

APK只是一个zip文件,这里和#39; s microsoft health apk文件在解压缩时看起来像什么。

应用程序的主要代码是一个名为classes.dex的文件,它是dalvik可执行文件,基本上是一个被编译的java二进制文件。文件格式定义得很好,我很幸运能找到一个名为Jadx的开源工具来分解源代码。

在分解Classes.dex文件后,我浏览了几个文件夹,并在"微软/"文件夹,似乎像Microsoft Health应用程序的根目录。

$ ls -ltotal 0drwxr-xr-x 18杰夫工作人员612年12月9日17:14 Cargodrwxr-xr-x 3杰夫工作人员102 12月9日17:14 Expectionsdrwxr-xr-x 3杰夫工作人员102 dec 9 17:14 instrumentationdrwxr-xr- x 199杰夫工作人员6766 12月9日17:14 kappdrwxr-xr-x 5杰夫工作人员170年12月9日17:14 Krestsdk

这些文件夹中有数百个文件,所以我可以获得像&#34的关键字;睡眠",然后" leepevents"当我注意到这是一个经常发生的术语。

public void getslepevents(localdate localDate,localDate localDate1,Callback Callback){if(localDate.IsAfter(localDate1)){抛出新的IllegalArgumentException(" Startdayid不能在neydayid之后。"); } else {odatarequest odatarequest = new odatarequest(" / v1 / events"); odatarequest.addargumentquotes(" enventype",eventtype.sleeping.tostring());对象Aobj [] =新对象[2]; Aobj [0] = Krestserviceutils.Formatdate(局部); Aobj [1] = Krestserviceutils.Formatdate(LocalDate1); odatarequest.setfilter("白天ge datetime'%s'和白天Le DateTime'%s'",aobj); odatarequest.addparameter("展开""序列,信息"); NetworkProvider NetworkProvider = MnetworkProvider; CredentialStore CredentialStore = McredentialStore; cacheservice cacheservice = mcacheservice;字符串为[] =新字符串[3];作为[0] =" sync&#34 ;;作为[1] ="事件&#34 ;;作为[2] = cacheutils.geteventTypeag(EventType.sleeping.tostring()); (New Krestqueryodata(NetworkProvider,Credendstore,Cacheservice,Arrays.aslist(AS),Custom_gson_Deserializer,OdatareQuest,New TypeToken(){Final KrestServicev1这¥40; {此$ 0 = Krestservicev1.this; super();}},回调)。 ExecudeOnexecutor(Asynctask.thread_pool_executor,new String [0]);返回; }}

显然,要获取睡眠事件,该应用程序正在构建REST呼叫。因此,必须发生的是与手机上的应用程序的乐队同步,它与Microsoft拥有的一些服务器同步。这解释了为什么我们无法在文件转储中找到原始数据,因为只有在本地存储缓存的数据。

我的下一个直觉是在手机和Microsoft服务器上尝试拦截应用程序之间的数据,以查看正在传输的内容。这通常是通过在应用程序中使用代理完成的,因此我首先尝试在我的Android手机上启用代理(下面的左屏幕截图)。

经过一点测试,显然Android中的代理功能仅影响Web浏览器,而不是Microsoft Health应用程序。所以我尝试了一个不同的技巧:将网关(即路由器)设置为手机' s wifi是我的电脑而不是使用dhcp,以便将所有网络数据发送到我的计算机。我编辑了这个设置(上面的右屏幕截图)并启用了IP转发,因此网络数据包仍然可以到达Internet而不是击中我的计算机并丢失。

接下来我检查了浏览器仍在手机上工作,这是一个很好的标志。然后是棘手的部分;我设置了一个数据包过滤器,以将传入的数据包转发到计算机上的其他端口。在一个新的.conf文件中,

$ sudo pfctl -f pf.confpfctl:使用-f选项,可能会导致系统在startup.see /etc/pf.conf添加的主要规则集中刷新规则预分器,以获取更多详细信息。$ sudo pfctl -epf启用

然后我安装了一个流量检查员(一个名为mitmproxy的开源工具),并摆弄标志,直到我弄清楚如何激活透明代理模式。

因此,这基本上模拟了一个中间人攻击以拦截数据。请注意,这只是捕获我手机发送和接收的数据,所以它'不是通常意义上的攻击,但只是一种方法可以查看我的手机已经在处理的数据。

当我访问网站时,我被放心,以查看通过MITMPROXY控制台路由的流量。但是,当我启动我的Microsoft Health应用程序时,它会在所有(下面的截图截图)开始。

最终我认为它是使用HTTPS,它在不同的端口上运行。所以我做了一些改变。首先,我在手机上安装了一个SSL证书,以便我的手机相信我的电脑正在拦截邮件(右上屏幕截图)。然后我将一条线添加到我的数据包过滤器中,也将在HTTPS端口上转发数据包,通过将下面的额外行添加到.conf文件并重新运行PFCTL Commmands。

基本上,而不是通过HTTPS与Microsoft Server通信的Microsoft Health应用程序,所有通信都通过我的计算机进行路由。 MITMProxy工具拦截SSL键并注入自己的键,因此可以解密并重新加密通过它的消息。

最后,我能够看到来自Microsoft Health应用程序的流量。幸运的是,请求很容易弄清楚,数据很容易理解。

请注意,要申请数据,手机发出休息请求,以https://prodphseus.dns-cargo.com/v1/events(epentid=' 1234567890' ;)?:Lexpand=序列那

如果您对来自一个活动的数据感兴趣(如昨晚'睡眠),那么您就会满意,因此您可以保存来自Microsoft ProdPhseus.DNS-Cargo.com服务器的响应并快乐。要获得更多活动,您只需单击每一个睡眠(左屏幕截图),锻炼(右屏幕截图)或其他类型的事件,直到您的手机(以及您的计算机拦截消息)接收所有数据。然后您将它们保存到文件中,您可以在您喜欢的文本编辑器中查看并使用脚本进行处理。

但是如果你不想手动通过手机上的每一个条目来传播数据怎么办?基本上,在您拥有频段而不是单个事件时,在整个时间内获得数据。然后在本文开头召回包含的分解Java代码:

它提供了一个线索,用于检索全套数据而无需在手机上选择每个条目,可以编辑URL:

简单地将URL粘贴到浏览器中' t工作,因为您必须重用相同的身份验证令牌Microsoft Health应用程序使用,但编辑先前请求应允许您检索整个原始数据流,而无需将每个事件逐个检索每个事件。

为了总结乐队的工作原理,一些数据在手机应用程序上缓存,而其余的存储在&#34中的Microsoft服务器上;云"。通过拦截手机应用程序和#39; s对服务器的请求,您可以下载要发送的原始数据,如心率,GPS,步数等。快乐追踪!

我对Hello Sense感到兴奋,一个受欢迎的球员项目,其Mantra是"了解更多。睡得更好。"它'是一款精美设计的地球,与传感器包装,告诉您睡眠环境,以及枕头的运动跟踪夹。我正在与我的博士合作。学生NEDI自动生成睡眠建议,所以我们想要了解该设备的测量方式。

我们从他们的网站订购了两个Hello Sense设备即可使用几个月,但是唉,它再次令人失望,我们无法从传感器中访问数据。相反,我们只能查看它生成的图表,并且受到Hello Sense应用程序允许我们看到的限制。挑逗我们,kickstarter页面承诺,"我们正在构建工具,以允许您导出,使用或删除数据。按一个按钮,您的数据将被导出或删除。这完全取决于你。这些工具将在我们的网站上提供。 [..]您将能够下载数据的完整存档。" (扰流板:这从未发生过)。

您好感觉同步到自己的智能手机应用程序称为感觉,但很清楚没有导出此数据的方法。事实上,在寻找解决方案之后,我可以找到的所有用户都哀叹缺乏数据排出性。

我认为这是一个挑战,并希望尝试将消息拦截作为Microsoft乐队的相同过程。许多应用程序将使用REST调用来请求某个数据的数据,因此知道如何执行此操作,允许您与持有数据的服务器交谈。基本上,我会拦截感觉应用程序和其服务器之间的消息,以观看他们如何认证并将我的数据传输到应用程序以进行图表。然后我可以学习"语言"并模仿应用程序从服务器询问自己的数据。

如前所述,我首先在我的android手机上启用了代理(下面的左屏幕截图)到我的MacBook被设置为网关。并再次设置数据包过滤器以将传入数据包转发到计算机上的其他端口。在一个新的.conf文件中,

在EN4 INET PROTO TCP上RDR上的任何端口80 - > 127.0.0.1 EN4 INET PROTO TCP的端口2300RDR到任何端口443 - > 127.0.0.1端口2300.

然后以前地运行PFCTL,并在透明代理模式下启动MITMProxy以拦截数据。

最后,我从http://mitm.it安装了我的手机上的SSL证书,以便它可以拦截通过HTTPS发送的消息(端口443)。

访问网站时,通过我的Mitmproxy控制台正确地路由了流量(请参阅右侧上面的屏幕截图,其中我在电话上窃听' s chrome浏览器导航)。但是,当我启动了我的Hello Sense应用程序时,它就' t正确连接到服务器,"有问题安全连接到服务器。"

我想在应用程序上造成更好的应用程序,了解导致错误的内容。我使用这次Android Debug桥从手机中提取了APK文件。与Microsoft Ban应用一样,主代码位于一个名为classes.dex的文件中的APK内。

在播放代码之后,很明显,该应用程序使用了一个名为Okhttp的库,该库与某种证书固定。基本上,有的代码在那里检查了SSL证书是否是正确的代码,如果它是NANN' t的例外。此时,有几个选项:我可以拆卸应用程序(请注意,不编译的Java可以' t简单地被重新编译到应用程序中,因此它需要被拆卸到Smali并编辑)并删除证书固定检查。

但是,虽然我正在研究源代码,但我遇到了一个名为apiservice.java的文件,该文件显示了应用程序正在从服务器检索数据的REST API查询。因此,理论上,我们所要做的就是发出与我们是应用程序相同的查询,服务器会向我们发送原始数据!

请注意,要申请数据,手机使用类似/ v2 / timeline / {date} / {type} / {timestamp}的链接。事实上,时间线确实是我们想要在特定日期睡眠期间发生的所有事件。

但在我们可以发送自己的REST查询之前,服务器要求使用OAuth协议进行身份验证。使用客户端ID和秘密完成OAuth身份验证。所以我搜索了这个源树,幸运的是在一个简单的配置文件中找到它。

我突出显示指定客户ID和秘密的两行。此文件还告诉我们RET服务器的基本URL,即https://api.hello.is,因此我们现在拥有我们需要的所有作品:REST服务的主机名,请求的格式和客户端id和秘密。注意,还有几条线解冻了,我认为可能不会公开的秘密密钥。

只需在正确的URL中键入,使用任何Web浏览器即可发送Get请求。但是,制作一个邮政请求,这是我们需要使用卷曲等命令行工具所需的要求,或者找到应用程序以照顾令人讨厌的比特。我使用邮递员是免费的,简单地设计(我喜欢作为双关语的应用程序名称)。

因此,我使用漂亮的标准OAuth格式将相应的字段输入到POST请求中。基于我们在源代码中找到的,URL是https://api.hello.is/v1/oauth2/token。

一件事绊倒了一下,请求的内容类型标题需要设置为"应用程序/ X-www-form-ullencoded"或者请求将被拒绝。一旦设置了,POST请求的结果是Access_Token,它提供了我们访问我们可以使用其他查询的其余数据的访问。在下面的屏幕截图中,我涵盖了我访问令牌的一部分,以防止人们在睡眠数据上窥探。

现在是有趣的部分。我使用标题中的访问令牌作为授权字段(Word"持票人"需要预先准备它,以表明它'持票牌类型)。现在我可以将URL更改为我想要的内容,在这种情况下到http://api.hello.is/v1/room/current从任何地方查看我当前的房间条件。

如果您真的想用数据做点什么,可以写自己的脚本来自动验证,然后抓住几天的数据,也许可以创建在线仪表板或发送自己的睡眠建议。

可能是你好感觉商店最详细的数据是它如何在夜间分类我的时间,如清醒,中睡眠,声音睡眠等。这是作为应用程序中的条形图所示的时间表,但现在我们可以访问生成自己的可视化或进行比较和分析的实际数据。在一晚,但这里有很多事件,但它看起来像什么。

所以好消息是,你好的感觉已经有一个已经用于数据导出的API。弄清楚如何获得数据访问数据,但我想象他们从来没有公开发布这个,因为他们想要为API提供更好的接口。

无论如何,我希望这个文档对于尝试从现在可以使用的可穿戴或跟踪应用程序出口数据来有用。如果您想知道我们对数据所做的内容,我的学生Jina Yoon写了一篇关于10种不同睡眠跟踪设备和应用程序的文章。但是,暂时,我将坚持使用更开放的跟踪应用程序。