首页
社区
课程
招聘
[翻译]对宝马车载apps协议的逆向分析研究
发表于: 2020-2-5 21:50 20557

[翻译]对宝马车载apps协议的逆向分析研究

2020-2-5 21:50
20557

2016年,我开始研究宝马,对IDrive和BMW Connected Apps有了基本认识,通过一些蓝牙协议,我手机上的Spotify会被添加到桌面上的音乐列表中。单击条目会显示一个丰富的用户界面,提供了很多浏览选项以选择播放列表并根据当前歌曲启动广播电台,这比蓝牙音乐控件更具交互性。

这激发了我对宝马app分析的好奇心,制造商添加应用程序可以自动升级汽车,不必局限于制造商在车上加载了哪些应用程序。也不需要从口袋里拿出手机并看着手机屏幕来切换音乐,可以使用带有信息娱乐屏幕的触觉控制器旋钮来安全地控制任何应用程序!

但是,与蓝牙一样,这种体验并不十分流畅。有时其他蓝牙应用程序协议无法连接,有时个别应用程序本身也不会响应。在Spotify论坛上寻求帮助的呼声也被忽略了,BMW Connected应用程序的评论糟透了,没有任何修复的迹象。

此外,与iPhone上可用的应用程序相比,适用于Android的BMW Connected仅共享了非常有限的应用程序选择:仅Spotify和iHeartRadio,以及基本的日历应用程序。由于我喜欢其他音乐应用程序,因此我致电BMW支持,询问是否可以访问BMW Ready SDK,以便可以构建自己的应用程序,他们拒绝了这种做法。

因此,我决定找出这个BMW Apps协议,并在没有他们帮助的情况下将自己的音乐应用程序添加到系统中。

蓝牙是一种标准协议,我只需要学习对汽车说些什么,Android内置了Bluetooth Capture日志记录!我只记录电话应用程序对汽车说的内容,然后看看发现了什么:

这个SPP协议似乎有很多有用的信息:我看到了一些X509证书,一些XML数据,一些看起来像歌曲元数据的字符串,还有很多东西!

我开始注意到大多数数据包的前一个字节中的模式:第0个字节为0,第一个字节为1或6,第二个字节为0,第3个字节通常很低,接下来的字节几乎总是0x0FA4。我发现接下来的2个字节是剩余数据的长度,接下来的4个字节的数据几乎总是0xDEADBEEF

编写 Wireshark Lua插件来帮助我理解数据,将第一个字节解析为名为Val1,Val2,Val3和Length的4个16位值,然后输出剩余的数据字节。

似乎该协议用于将连接多路复用到单个蓝牙串行套接字,而Val2是不同的连接ID。在Wireshark中解析了该字段之后,我可以使用显示过滤器来遵循单个的通信流程。

经过一番研究,我发现了一篇文章,解释了宝马将Apache Etch用作“用于BMW Apps的基本通信协议”。速浏览Apache Etch文档可确认这0xDEADBEEF是每个Etch RPC调用开始时的魔术标识符。因此,这意味着我只需要将每个BCL流解码为Apache Etch数据包,Wireshark的内置Etch解析就会解析数据!

除了Apache Etch,每个函数名称和任何其他符号名称都编译为32位哈希值。Wireshark可以使用Etch调试组件将哈希值替换为适合的名称,但是我首先需要弄清楚这些名称并自己对它们进行哈希处理。该散列算法是公开的,所以我写了如下代码,以帮助手动生成此调试名。

但是,在哪里获得名称?事实证明,JVM字节码很容易反编译。变量名称有些模糊,但是Etch生成的类包含所有可用Etch符号的确切列表:

因此,只是通过自定义哈希运行此名称列表,然后将结果文件提供给Wireshark,就会获得协议转储文件!

在对代码进行反编译的同时,我对协议连接方法进行了一些研究,发现BMW Connected应用程序会运行TCP localhost服务器,该服务器通过此BCL复用连接代理所有连接。这意味着任何root call都可以运行tcpdump并记录每个应用程序与汽车的通信,而无需运行蓝牙嗅探。

另外,这意味着我不需要重写主要的BMW Connected应用程序,只需要打开与手机上的TCP端口的TCP连接即可直接与汽车建立连接,并可以扮演任何其他BMW角色启用的应用。

如何找出代理运行在哪个端口?BMW Connected应用程序广播系统范围内的Android Intent,其中包含连接细节,以便在汽车连接时使用。此外,它已硬编码到特定端口,因此我可以尝试手动连接到该端口。

这完全改变了我的方法:我要做的就是学会这种高级RPC协议!

使用从应用程序生成的Etch RPC类,可以使用所需的位来重构Etch IDL文件。Etch编译器返回了一些代理对象,我有了自己的一套Etch RPC类!

我刚开始实现一个Etch RPC的服务器端,然后将自己的连接通知发送到官方应用程序。Android Intent是应用程序组件之间通过松散耦合彼此通信的标准方式,并且完全未经身份验证。这欺骗了官方应用程序模块,使其无法在我的控制下连接到我自己的Etch服务器,而不是连接到汽车的BCL代理。

Etch对象带有NotImplementedExceptions,因此很容易看到官方应用程序发出了哪些调用。在填写完我需要使官方应用程序满意的Fake Car资料后,该应用程序(在模拟器中运行)使用提供的VIN号下载了从未与之实际连接的汽车的图像:

从应用程序到汽车建立新的连接时,它所做的第一件事就是向汽车发送PKCS7证书。汽车以随机数作为响应,应用程序应以一些身份验证数据作为响应。

该证书由BMW CA签署,因此没有真正的解决方法。但是,仅从应用APK中提取文件即可轻松获得这些证书,而主要的联网应用大约包含10个。

接下来,如何找出正确的随机数响应?它看起来足够长,可以成为RSA4096签名,因此尝试破解。

事实证明,JVM字节码很容易反编译:将整个应用程序反编译为混淆的Java文件后,可以将整个程序加载到Android Studio中,并使用其强大的代码搜索和重构工具来帮助导航代码。可以找到线索com.bmwgroup.connected.internal.security.CarSecurityManager

实际上,代码说明了它如何使用Android Binder RPC连接到CarSecurityService对象,以及如何将质询随机数交换为质询响应。此外,该服务已导出,可供手机上的任何应用使用。

一些快速测试代码验证了此服务所返回的答案与Wireshark捕获的答案相同。服务实现是围绕本机库的一个小的JNI包装,该库包含一些OpenSSL符号。

掌握了这些知识后,我迅速构建了一个测试应用程序,试图使我第一次与汽车建立联系!官方应用程序从查找数据包捕获中所做的第一件事之一就是调用rhmi_getCapabilities以获取汽车支持的功能标志列表。

这涉及实现一个BroadcastReceiver来侦听汽车的连接通知,充当SecurityService的客户端以准备好挑战随机数,并实际使用适当的连接详细信息实例化Etch代理对象。

在台式机和车库之间经过数次尝试之后,我成功建立了连接!

这个项目的主要目标是向汽车添加更多音乐应用程序,因此我自然而然地将注意力集中到RHMI调用命名空间,并使用诸如rhmi_setData和名称rhmi_onActionEvent。应用程序最先调用的一个是rhmi_setResource,用于发送XML小部件布局和一些zip文件。这些资源可在任何BMW应用程序的APK中轻松获得,从而便于检查。

第一个也是最重要的是XML的layout。它包含组织成窗口的组件列表,组件中显示的模型列表以及链接到小部件的动作列表。这些模型中的某些模型可以保存来自电话应用程序的任意数据,而另一些模型可以包含指向zip文件中资源的数字ID。

压缩后的资源很简单:一个图形包,其中的每个文件都用数字ID命名,或者是一个翻译文本包,其中的字符串由ID键入。在应用程序中环顾四周,有适用于BMW或Mini品牌的不同资源包。

因此,在我第一次尝试在汽车中创建应用程序时,我复制了初始化调用以发送远程UI资源,然后测试了该rhmi_setData调用以尝试将图像加载到汽车中:

弄清楚动作事件系统非常容易:在调用rhmi_addActionEventHandler信号通知汽车发送输入事件后,汽车将开始调用rhmi_onActionEvent有关触发了哪个动作的详细信息,并将该动作链接回原始组件。

我的下一个实验是尝试编辑发送到汽车的Layout。但是失败了,汽车拒绝了上传。但是,上传原始工件仍然非常有效。

我在身份验证证书中找到了SHA256校验的列表,原始资源与这些校验和匹配。这意味着我无法更改任何窗口小部件布局或图形包。这主要是<entryButton>组件的问题,该组件被硬编码到图形包中的特定图标,因此,基本上任何创建RHMI应用程序的应用程序都将显示属于原始身份验证证书的应用程序图标。

最初,我很失望:如果我被锁定在原始的小部件布局中,那么我将无法构建一个自定义的应用程序。但是,有时rhmi_setProperty在Wireshark捕获中看到了正确的调用,并且小部件布局中的某些组件<properties>定义了一个集合,但是属性是由数字ID定义的。

事实证明,Java字节码确实很容易反编译,我发现此RhmiPropertyType枚举包含整个列表。

因此,即使无法更改窗口小部件配置,也可以设置窗口小部件属性,包括可见性,位置和大小,这仍然具有很大的灵活性。

有了这些基本构建块,我便开始为汽车构建自己的音乐应用程序!除了我的手机上已经有几个出色的音乐应用程序外,我将这些应用程序添加到汽车中,而不是编写自己的应用程序。有什么方法可以代替我控制现有的音乐应用程序吗?


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

最后于 2020-2-18 18:38 被kanxue编辑 ,原因:
收藏
免费 5
支持
分享
打赏 + 5.00雪花
打赏次数 1 雪花 + 5.00
 
赞赏  orz1ruo   +5.00 2020/02/06 精品文章~
最新回复 (22)
雪    币: 42935
活跃值: (65742)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
666
2020-2-5 22:03
0
雪    币: 6802
活跃值: (4480)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
3
2020-2-6 10:12
0
雪    币: 6
活跃值: (1488)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
老外就6啊,国人玩车,人家搞破坏,还上来就是宝马
2020-2-6 10:21
0
雪    币: 886
活跃值: (4929)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
很赞
2020-2-6 10:39
0
雪    币: 15695
活跃值: (18993)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
6
mark,贫穷限制了我进入这个行业的脚步
2020-2-6 10:59
0
雪    币: 2510
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2020-2-6 11:34
1
雪    币: 9202
活跃值: (2632)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
Mark
2020-2-6 23:30
0
雪    币: 433
活跃值: (2130)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
你看看 你得有宝马
2020-2-6 23:32
0
雪    币: 222
活跃值: (185)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
10
买不起宝马
2020-2-7 17:56
0
雪    币: 1047
活跃值: (655)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
首先要有宝马
2020-2-7 22:17
0
雪    币: 87
活跃值: (215)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
2020-2-10 11:24
0
雪    币: 8034
活跃值: (3615)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好高的成本
2020-3-12 21:03
1
雪    币: 711
活跃值: (273)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
成本太高玩不起
2020-3-12 21:17
0
雪    币: 681
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
首先得有一台宝马
2020-3-23 11:19
0
雪    币: 1
活跃值: (158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
技术学到了  宝马呢?
2020-3-27 14:18
0
雪    币: 4688
活跃值: (4187)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
逆向的成本真高 
2020-3-27 14:44
0
雪    币: 11113
活跃值: (5240)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
学到了,就差一辆宝马了
2020-4-21 17:16
0
雪    币: 29
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
太厉害了,去bmw上班
2020-5-19 13:58
0
雪    币: 0
活跃值: (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
别看了,需要宝马的
2020-10-10 17:43
0
雪    币: 223
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
牛皮!!!
2020-10-16 10:42
0
雪    币: 1885
活跃值: (3429)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22
太秀了 真强!
2020-10-16 11:21
0
雪    币: 364
活跃值: (10653)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
23
怪不得逆向技术没法提升,原因是我没有宝马.
2020-10-16 11:37
0
游客
登录 | 注册 方可回帖
返回