车载IVI应用转码保护的研究

2021-04-06 00:39刘兴伟马宏亮
信息安全研究 2021年4期
关键词:转码字典应用程序

田 坤 刘兴伟 马宏亮

1(西华大学计算机与软件工程学院 成都 610039)

2(北京娜迦信息科技发展有限公司 北京 100094)

(1935896048@qq.com)

车联网在国外起步较早,在20世纪60年代,日本就开始研究车间通信.2000年前后,欧洲和美国也相继启动多个车联网项目,旨在推动车间网联系统的发展.与国外车联网产业发展相比,我国的车联网技术直至2009年才刚刚起步,最初只能实现基本的导航、救援等功能.此后至2017年底,国家颁布了多项方案,将发展车联网提到了国家创新战略层面.在此期间,人工智能和大数据分析等技术的发展使得车载互联网更加实用,如企业管理和智能物流.未来,依托于人工智能、语音识别和大数据等技术的发展,车联网将与移动互联网结合,为用户提供更具个性化的定制服务[1-3].

车联网业务系统的不断发展,与之带来的是安全问题日益突出,车企发布的车控APP实现的功能也越来越多,除了车辆辅助功能外,有些车企的车控APP已经可以开始控制车辆的启动、停止、车窗、车传感器等相关的车辆安全功能.现今车载IVI日益趋向于Android系统,那么在车载IVI之上的Android车控APP也即将变得越来越普及.Android系统的开放性使得它的推广性极强,同时也带来了日益突显的安全性问题.那么,车控APP安全性研究,对整体提高车联网的安全就变得非常迫切.

1 车载IVI应用转码保护设计与实现

车载IVI采用Android系统,而Dalvik虚拟机(Dalvik VM)是Google专门为Android系统设计的一套虚拟机[4-5].不同于标准Java虚拟机JVM的class文件格式,Dalvik VM拥有专属的 DEX可执行文件格式和指令集代码.Smali和baksmali则是针对DEX执行文件格式的汇编器和反汇编器,反汇编后DEX文件会产生.Smali后缀的代码文件,Smali代码拥有特定的格式与语法.Smali语言是对Dalvik VM字节码的一种解释,虽然不是官方标准语言,但所有语句都遵循一套语法规范[6-8].

本研究旨在通过“车联网+安全防御[9-10]”行动计划的建设思想,以网络安全法、等级保护、国家十三五规划等要求为基础,凭借在车联网应用安全的前瞻性研究,充分利用先进技术资源,对车控APP的汇编代码结构进行分析.

本研究主要从以下3个方面进行:

1) 车控APP的汇编代码结构;

2) 虚拟机引擎对车控APP的Smali汇编进行转码操作,把Smali汇编代码转码为Native C/C++代码,对车控APP核心逻辑进行保护;

3) 转码完成的数据,对Native C/C++进行编译组装,形成受保护后的车控APP.

1.1 应用转码保护总体设计

通过对车控APP进行细致到类函数的分析,把整个流程分为29个阶段,总体设计流程如图1所示.

1) 车控APK进行Smali反汇编处理,期望得到APK中详细的类函数分布;

2) 对Smali汇编后的文件进行BasicBlock(BB)切分,把汇编代码切分成独立的指令块;

3) 构建IrBuilder,针对的是要转码的Method,包含Method中所有的BasicBlock块迭代器、Method开始BasicBlock块、类名、方法名、输入参数列表、Graph初始化、方法的属性、输入参数的类型、Method的Exception列表;

4) 启动IrBuilder中的process,调用bfs(广度优先搜索),构建Method中块的图关系;

5) 构造Graph对象,初始化入口、结束出口、landing_pads、Method中node集合、rpo、edges字典、catch_edges字典、reverse_edges字典、reverse_catch_edges字典、offset_to_node字典、node_to_landing_pad字典;

6) 使用bfs算法计算Method中BasicBlock之间的相互关系,得出生成器集合,开始填充Graph;

7) 循环生成器(DVMBasicBlock)集合,把每一个DVMBasicBlack初始为IrBasicBlock,IrBasicBlock中包含dvm_basicblock、指令集合、变量列表、类(使用)列表、字段(使用)列表、方法(调用)列表、是否是异常块、异常块的类型、是否对该对象进行过填充、初始化PHI集合、初始化catch_successors集合、得到dvm_basicblock的start_offset;

8) 建立dvm_basicblock与IrBasciBlock关系字典;

9) 如果遇到Method中的dvm_basicblock会触发异常块,则进行LandingPad对象转化;

10) 建立ExceptionAnalysis(dvm_basicblock块的exception_analysis属性)与LandingPad关系字典;

11) 根据dvm_basicblock.exception_analysis.exceptions,得到catch块的异常类型、异常块offset、异常块(dvm_basicblock)对象;

12) 建立try(IrBasicBlock)/catch(IrBasicBlock)关系;

13) 建立Graph中catch_edges关系、reverse_catch_edges关系;

14) 建立node(try-IrBasicBlock)与landing_pad(catch块转换为LandingPad对象)关系;

15) 查找此dvm_basicblock正常跳转的字块,建立相互关系;

16) 填充Graph存放以下关键信息,包括:各个dvm_basicblock转换为IrBasicBlock的信息(包括dvm_basicblock、类定义、方法定义、是否包含try/catch块、字段定义、PHI节点集合、dvm_basicblock起始偏移)、IrBasicBlock的路径关系采用图的广度优先搜索算法进行定义、BasicBlock中try/catch路径关系(包含嵌套try/catch)、方法入口块、块转换为node的节点集合、landing_pads集合、edges字典、reverse_edges字典;

17) 从Method中的start dvm_basicblaock开始通过edges和catch_edges这2个字典,递归找到此Method最后一个dvm_basicblock块,并进行编号,形成从调用的子node到父node的调用路径序号;

18) 通过所有node的len减去17)中的编号,得出从父node到子node的最终调用路径;

19) 建立offset与node(IrBasicBlock)的字典关系;

20) 完善Graph中node与LandingPad的字典关系;

21) 完善Graph中offset与node(IrBasicBlock)的字典关系;

22) 通过reverse_catch_edges{catch:try}进行搜索,如果父节点中in_catch属性为true,那么子节点中in_catch属性也应修订为true;

23) 初始化构建IRmethod结构体,用于Smali汇编指令翻译为C/C++语言;

24) 对Smali函数参数进行解析,用于翻译后C/C++语言函数的输入参数;

25) 通过生成好的Graph解析BasicBlock块中指令,用于填充IRMethod结构体;

26) 对IRMethod结构体进行指令转码;

27) 形成Native C/C++语言的源代码;

28) 调用NDK编译工具链对27)中的源码进行编译;

29) 形成转码编译完成后的可执行文件.

图1 应用转码保护总体设计流程

1.2 应用转码保护的实现

车载IVI应用转码保护的实现[11-13]主要包含以下5个方面:

1) BasicBlock(BB)切分方式.BasicBlock中包含相关code指令,是组成程序结构的基本单元,BB块切分的原则是:①判断指令切分;②返回指令切分;③try/catch指令切分;④goto指令切分.

对整个应用程序的Smali汇编逐行进行读取,遇到上述的指令就把此指令之前的代码进行提取,并对提取的代码进行BB块编号,同时对编号后的BB块中的指令计算offset,指出每个BB块对应的跳转关系,最后每个BB块初始化为BasicBlock对象,放入Method的有序列表中.

2) 构建Graph并解析指令填充.Graph中包含了用于Smali汇编转码C/C++语言代码的重要信息,通过迭代器BB块的方式,分析每一个BB块中的指令、获取第1个BB块的offset、本地变量、输入参数、异常发生器、异常捕获的目标,同时分析出每个BB块的相互调用关系.

Graph首先会对Method列表中的BB块集合进行轮训分析,主要分析每个BB块中的指令是否含有异常指令,找出异常指令的catch捕获模块,建立1对1或1对多的处理关系,比如try{}catch{},try{}catch{}finally{};第二,会根据对Method列表中的BB块集合,按后置顺序返回图的节点,即我们访问所有访问节点本身之前的子节点,然后按前置的顺序对其排序,用于后续Native代码的转换,因为代码的转换是从入口点开始,逐步按照节点的逻辑关系进行;第三,根据Method方法的输入参数形成Native变量的标号,根据本地寄存器个数减去输入参数个数后自增的方式,得出Method方法的输入参数的寄存器编号;第四,根据Method方法的Smali返回类型,确定Native方法的返回类型.Graph中各BB块的关系如图2所示:

图2 Graph中各BB块关系

3) 构建IRMethod结构体.IRMethod结构体中存放的是Smali汇编语言转码为IR中间语言的载体,包含了EncodeMethod、IR对象、方法的开始BB块、方法的类名、方法名、方法输入参数、本地变量寄存器下标序号、方法BB块的offset表、Graph对象、方法的签名.

通过对Graph对象的填充以及对BB块的分析,接下来完成IR指令的转码,对各个BB块中的指令逐条分析,根据各指令opcode封装不同指令的转换方法,opcode包括:空指令、数据操作指令、返回指令、数据定义指令、锁指令、实例操作指令、数组操作指令、异常指令、跳转指令、比较指令、字段操作指令、方法调用指令、数据转换指令、数据运算指令.具体的指令转换列表如图3所示:

# 0x00nop, # nopmove, # movemovefrom16, # move∕from16move16, # move∕16movewide, # move-wide︙returnvoid, # return-voidreturn_reg, # return# 0x10returnwide, # return-widereturnobject, # return-objectconst4, # const∕4const16, # const∕16const, # const︙monitorexit, # monitor-exitcheckcast, # check-cast# 0x20instanceof, # instance-ofarraylength, # array-lengthnewinstance, # new-instancenewarray, # new-arrayfillednewarray, # filled-new-array︙cmpgfloat, # cmpg-floatcmpldouble, # cmpl-double︙# 0xd0addintlit16, # add-int∕lit16︙# 0xe0shlintlit8, #shl-int∕lit8︙

图3 指令转换

4) 形成Native代码.获取到IRMethod结构体后,逐一取出IRMethod中的数据,通过变量类型构建规则、运算构建规则以及内部函数调用规则,构建C/C++语言代码,构建规则如表1和表2所示.

函数转换构建规则:①将原有的方法改成Native属性的方法;②删除原有方法中的方法实现.

5) 编译Native形成受保护可执行文件.通过以上步骤形成C/C++源代码文件,调用编译器编译生成本地二进制文件.

表1 运算构建规则

表2 内部函数调用规则

图4 二进制源程序

2 效果测试

使用对比工具,对受保护前后车控APP中classes.dex文件进行对比,说明其保护效果.

1) 二进制工具对比:通过Beyond Compare工具,对车控APP中受保护前后DEX文件进行对比.其中图4为二进制源程序,图5为经过转码保护的二进制程序.

通过两者的对比可以确定进行转码保护后,原始文件和转码保护后的文件相似度为零,达到了保护的效果.

2) 反汇编后对比:采用JEB工具:对车控APP受保护前后的DEX进行反汇编后对比.其中图6是保护前程序代码,图7是保护后程序代码.

图5 保护后二进制程序

通过两者的对比可以得出结论,经过反汇编转码后保护了前后代码,应用程序的核心逻辑进行了转码,在应用程序原始文件中已经无法获取,有效地解决了车载IVI应用程序容易被篡改以及2次打包的问题,达到了保护效果.

图6 保护前程序代码

图7 保护后程序代码

3 结束语

本文针对车联网在车载IVI程序保护方面存在的问题,设计并实现了车载IVI应用程序进行转码保护,通过对车载IVI应用程序的特点进行研究,对应用程序的Smali汇编进行Native转码,有效地把相关业务逻辑的实现转移到了Native层,增加了破解分析的难度,使车载IVI应用程序具备了防逆向、防篡改的安全功能.最后通过安全测试验证了本文提出的车载IVI应用程序进行转码保护的有效性.

猜你喜欢
转码字典应用程序
天津台新闻云系统外来视频文件转码方案
视频转码技术在广播电视中的应用研究
删除Win10中自带的应用程序
字典的由来
谷歌禁止加密货币应用程序
基于IPTV点播业务的视频分段式转码方案的研究与应用
大头熊的字典
正版字典
基于GMM 的AMR-NB 与G.729A 之间的LSP 参数转码方法
三星电子将开设应用程序下载商店