【技术实现步骤摘要】
基于模拟执行的Native动态链接库分析方法及系统
[0001]本专利技术属于软件安全程序分析
,涉及一种Native动态链接库分析方法及系统,具体涉及一种基于模拟执行的通过获取Java与Native注册函数映射进而获得Native动态链接库分析方法及系统。
技术介绍
[0002]随着Android操作系统的广泛应用,越来越多的应用程序使用Native库来实现更高效的代码执行和底层硬件访问。开发人员常常使用Native库来实现一些性能要求较高的功能,如图形处理、音频处理、加密等。Native库是使用C/C++语言编写的动态链接库,可以被Java层代码使用。由于Native库中的函数由C/C++编写,而Java层代码则由Java编写,因此二者的交互存在一定的限制。在Android中,Java层代码通过JNI(Java Native Interface)技术调用Native库中的函数,实现与底层系统的交互。在Java代码中,可以通过native关键字声明一个方法,并在Native代码中实现这个方法。在Native代码中,需 ...
【技术保护点】
【技术特征摘要】
1.一种基于模拟执行的Native动态链接库分析方法,其特征在于,包括以下步骤:步骤1:以符号执行框架angr为基础,以angr的扩展模块为补充,利用python语言作为符号执行分析框架与其扩展模块以及其他Android程序分析工具、工具与Native动态链接库环境间的连接脚本,构建模拟执行工具;步骤2:对JNI进行建模,抓取Native底层系统调用、线程API函数调用;根据JNI的原理与实现机制,在Native层构建JNI的模型,包括Java环境变量的结构体定义与传递、Java对象的模拟、JNI中API函数的声明以及其调用流程的模拟,接入步骤1中构建的模拟执行平台框架;利用模拟执行工具中的JNISimProcedure功能,实现JNI中API函数相应的调用流程模拟,拦截模拟执行过程中JNI的API调用,使其运行工具中编写的模拟流程,以实现对Native库中JNI操作的跟踪和分析;利用模拟执行工具中的JNISimProcedure功能,对Native库调用的底层API进行抓取,包括系统调用、文件读写操作、线程处理API;使用模拟执行工具中的Record模块记录Native动态链接库与Java层交互的JNI API调用行为,包括函数调用栈、参数传递、返回值信息;步骤3:根据Android应用使用Native库的方法以及JNI机制,模拟Native动态链接库加载过程,通过模拟执行去除二进制文件内控制流混淆与数据混淆,满足关键JNI调用的控制流依赖与数据依赖,同时在模拟执行过程中记录JNI交互行为;步骤4:使用模拟执行工具对Android应用中Native动态链接库进行分析,生成Native动态链接库的分析结果报告,获取Java与Native注册函数映射结果、JNI交互行为记录,及Native动态链接库是否存在.init_array的初始化过程以及程序保护手段。2.根据权利要求1所述的于模拟执行的Native动态链接库分析方法,其特征在于:步骤1中,符号执行工具基于现有工具angr,符号执行引擎使用angr内置的Unicorn引擎支持;解析Android应用的apk文件,利用angr中的Loader模块,加载解析apk文件得到的Native动态链接库文件,分析其对应架构以及指令集;利用angr提供的SimProcedure功能,扩展为JNISimProcedure用于JNI API调用模拟;通过python使用androguard逆向工具补充Java层的native方法信息,使其具备分析Java与Native注册函数映射、JNI行为记录的功能,并在模拟执行分析时记录相应结果。3.根据权利要求1所述的于模拟执行的Native动态链接库分析方法,其特征在于:步骤2中所述模拟执行工具中的JNISimProcedure功能,实现JNI中API函数相应的调用流程模拟,拦截模拟执行过程中JNI的API调用;为满足模拟执行过程中的依赖关系,需JNI API调用返回恰当的返回值,若返回值为基本数据类型,则使用angr符号执行构造满足即可;若返回值为Java String类对象,特别处理用angr构造字符串返回值,其他Java对象则构造对应Java Object满足;处理JNI中用于绑定Native动态注册函数的API调用RegisterNatives,根据其函数定义在模拟执行时解析其函数参数信息,获取动态注册的Native函数的Java方法与Native函数映射关系,具体为:(1)Android APK逆向分析工具androguard解析Java层中的Native方法信息,包括方法名与签名,通过签名匹配Native层的静态注册函数;
(2)模拟执行Native动态链接库的初始化部分代码,去除控制流混淆与数据混淆,模拟执行构造后续关键JNI调用依赖;(3)模拟执行过程中调用RegisterNatives的JNISimProcedure时,根据API定义解析运行时函数参数,获取Native动态注册函数信息,包括注册方法名、方法签名以及对应Native注册函数地址。4.根据权利要求1所述的于模拟执行的Native动态链接库分析方法,其特征在于:步骤3的具体实现包括以下子步骤:步骤3.1:从Native层出发,模拟Native库的加载过程,使用angr的Loader模块加载Native库二进制文件,并识别二进制文件架构及其指令集;步骤3.2:根据Native库加载机制,得到模拟执行的初始状态init state:(1)初始化起始地址,对于ARMEL架构下的thumb
‑
2指令集需要处理其起始地址+1;(2)在初始状态中加入unicorn支持标识选项;(3)在步骤2的基础上,在初始状态存储jvm和jenv结构体指针,使其对应偏移指向步骤2中JNISimProcedure的模拟实现;步骤3.3:通过angr反汇编分析动态链接库获取其初始化过程中.init、.init_array调用以及JNI_OnLoad调用的地址信息,依次模拟执行,并记录调用各函数的信息:(1)根据Native动态链接库的加载机制,首先获取动态链接库的.init、.init_array以及JNI_OnLoad函数的地址信息,解析.init_array中的初始化函数列表;(2)抓取初始状态init state起始地址处理初始化过程,模拟执行依次调用.init函数以及.init_array初始化函数列表;(3)模拟执行.init_array初始化调用函数列表结束后,跳转至JNI_OnLoad函数执行调用,JNI_OnLoad中可能包含大量的JNI操作,JNI操作的依赖已经由步骤2中的JNI SimProcedure实现,执行同时记录JNI行为;(4)对比JNISimProcedure中模拟执行时调用的运行时数据与初始状态init state中的初始数据,识别数据混淆的存在。5.根据权利要求1
‑
4任意一项所述的于模拟执行的Native动态链接库分析方法,其特征在于:步骤4的具体实现包括以下子步骤:步骤4.1:使用构建的模拟执行工具,模拟Native动态链接库的加载过程,分析并记录模拟执行信息;步骤4.2:在RegisterNatives的JNISimProcedure中分析函数参数并记录Java与Native注册函数之间的映射关系;步骤4.3:对于其他JNI交互操作,记录关键JNI API的调用情况及其参数;步骤4.4:生成Native动态链接库的分析结果报告,记录Native注册函数信息以及对应Java方法的映射关系,及Native动态链接库是否存在.init_array的初始化过程以及程序保护手段、JNI交互操作API调用及其参数信息。6.一种基于模拟执行的Native动...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。