[车联网攻防入门]常见控车app加固措施及绕过方式
引言
车联网安全的攻防,一定会涉及移动端控车app的分析。当前,几乎所有发行版的控车app都会或多或少有一些加固措施,但是相比于某些app工厂来说,控车app的防护手段还是薄弱了一些,有不少加固措施可以被常规方法绕过,本文就尝试对这些绕过方法做一些简单的总结。
环境准备
考虑成本和便利性,我们使用安卓模拟器来进行测试,本文内容基于64bit Android7系统的夜神模拟器,部分操作在雷电9模拟器中也能正常执行。
PC端
frida-tools + frida + objection
注意以上三者是有版本匹配要求的,目前我们在使用的版本是
frida-tools 11.0.0 + frida 15.2.2 + objection 1.11.0
上述工具直接使用pip install即可安装,如果碰到pip安装frida时卡在setup.py执行阶段的情况,大概率是因为setup.py从墙外网站下载工具包,可以手动下载egg安装包后重新执行pip install。
安装完成后,在命令行中使用frida --version应该能看到如下结果。
模拟器端
模拟器端可以使用frida-server或hluda-server,后者是前者的魔改版,替换掉了一些特征以规避检测。
注意:
(1)模拟器端server需要与PC端frida版本匹配
(2)模拟器中的server需要选择android-x86或android-x86_64版本(分别针对32bit和64bit Android系统),如果是用在真实手机上,则需要根据手机处理器架构选择对应版本,通常是android-arm或android-arm64server
下载完成后,使用adb命令将文件推送到手机并赋予执行权限,并以root权限运行即可。此时使用frida-ps -U应该就能看到模拟器中正在运行的进程信息了。
加固措施及其绕过方式
root检测
安卓模拟器一般会有是否开启root的选项,在开启root和不开启root的情况下,分别启动app,观察运行状态是否有异常,即可确认app是否有root检测。
要绕过root检测,简单一点的方法是使用objection的命令android root disable。其原理就是通过hook机制,隐藏部分root环境下的特征,不过实测下来并不好用,目前我们在测试的某款app就无法绕过。
复杂一点的方法,是使用模拟器能够开关root的功能,在root权限下修改系统文件,然后在非root环境下运行app。为了能够利用frida hook绕过app中的检测,需要以root权限运行frida-server,满足了这个前提,Android系统有没有root环境其实并不重要。基于这个想法,我们可以在root权限下,修改/system/etc/init/keystore.rc文件,添加如下内容,修改完后记得使用chmod 644恢复rc文件原本的权限,否则可能导致模拟器无法启动。
添加以上命令后,关闭模拟器的root权限,我们可以通过“setprop self.test.hluda start/stop“命令来控制hluda-server的开启和关闭,同时规避掉root检测措施。
真实手机无法自由开关root,所以大多数情况还是要通过刷机的方式实现这种绕过方法。
frida检测
如果使用frida hook后,app运行状态出现了异常,那么就需要考虑app检测了frida。
目前我们遇到的frida检测方式主要有两类:检测frida本身的特征、检测/proc/[pid]/maps是否有/data/local/tmp目录,因为不管是frida-server还是hluda-server,都会向这个目录下释放文件。
针对frida本身特征的检测,可以使用魔改了frida特征的hluda-server来绕过。
而对于maps文件的检测,则需要自己编写脚本来绕过,hook libc中的open和fopen函数,当app打开maps文件检测时,给他返回一个伪造的、没有tmp目录的maps文件即可,以下代码可以作为参考。
加壳
加壳可以隐藏app原本的逻辑代码,提高逆向分析的门槛。
除了少部分app需要手动脱壳外,大部分app的脱壳可以直接使用DEXDump(https://github.com/hluwa/frida-dexdump)或者objection+DEXDump (https://github.com/hluwa/objection-plugins)脱壳,objection+DEXDump脱壳如下图所示
将上述脱壳得到的dex文件重命名为classes.dex、classes02.dex、classes03.dex……,直接填到原本的apk中,就可以放到jadx中进行静态分析了,不过这个apk无法安装运行,动态调试仍然需要依靠objection或frida。
忽略代理
对于控车app,我们最感兴趣的自然是控车功能,这就需要对app与云端的通信进行抓包。
通常我们抓包的方式,是在手机WiFi的高级设置中配置代理。
但是某些app会设置为忽略系统代理的模式,对此可以使用proxifier,强制模拟器的流量都经过抓包工具,在proxifier的profile->Proxy Servers和profile->Proxification Rules中分别做如下设置即可。
证书校验
在app与服务端通信的过程中,可能存在两部分证书校验:客户端对服务端的校验、以及服务端对客户端的校验,二者组合起来就是我们常说的双向校验。
针对客户端对服务端的校验, objection同样也提供了绕过的工具,用如下图所示的命令即可。
这种绕过方式原理就是通过hook的方式修改了证书校验相关方法的实现,对于使用原生TrustManager 、OkHttp和Retrofit的app使用objection提供的功能就已经足够了,更详细的介绍可以参考objection官方的说明
服务端对客户端的校验,一种典型的报错如下图所示,服务端返回的数据显示需要特定的证书。
此时需要将客户端的证书导入抓包工具。获取客户端证书也可以利用hook来实现,部分app可能在启动时就加载了证书,因此需要用objection在app启动时就开始hook相关的类,可以使用如下命令实现。
hook的结果如下图
上图中Keystore.load方法,第一个参数是证书的内容,第二个参数是打开证书所需要的密码,在反编译后的app代码中,搜索这两个密码,就可以找到对应的证书文件。
根据上图的内容,在app的assets目录下找到对应的证书文件导入抓包工具即可,我们使用的charles可以在Proxy->SSL Proxying Settings->Client Certificates中加载客户端证书。
结语
当然,模拟器会受到诸多限制,有条件用真机自然是更好的选择,本文仅做抛砖引玉,文中提到的大部分做法都是可以迁移到真机的。
- 下一篇:国家数据局成立对汽车数据安全的影响
- 上一篇:某控车app的测试记录
-
汽车测试网V课堂
-
微信公众号
-
汽车测试网手机站
编辑推荐
最新资讯
-
NVIDIA 发布 2025 财年第三季度财务报告
2024-11-21 13:30
-
Mack卡车为买家推出创新的虚拟现场探索体验
2024-11-21 13:29
-
氢燃料电池卡车从1到100要多长时间?戴姆勒
2024-11-21 13:28
-
聚焦消费者用车极限环境,2024中国汽研汽车
2024-11-21 13:21
-
新能源汽车高寒环境可靠性行驶试验研究
2024-11-21 13:19