著录项信息
专利名称 | 基于APK的系统API和运行时字符串的提取方法及系统 |
申请号 | CN201210559627.1 | 申请日期 | 2012-12-21 |
法律状态 | 暂无 | 申报国家 | 中国 |
公开/公告日 | 2013-10-23 | 公开/公告号 | CN103365699A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F9/45 | IPC分类号 | G;0;6;F;9;/;4;5;;;G;0;6;F;2;1;/;5;6查看分类表>
|
申请人 | 北京安天电子设备有限公司 | 申请人地址 | 北京市海淀区闵庄路3号清华科技园玉泉慧谷一期1号楼
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 北京安天网络安全技术有限公司 | 当前权利人 | 北京安天网络安全技术有限公司 |
发明人 | 仇学龙;李柏松 |
代理机构 | 暂无 | 代理人 | 暂无 |
摘要
本发明提供的基于APK的系统API和运行时字符串提取方法及系统,通过对APK文件进行解包及对其中classes文件的反编译,分析classes文件中的smali文件,通过增加输出代码,实现自动提取调用系统API和运行时字符串信息的代码。本方法可以细粒度自动化的对APK文件进行处理,从而获取在程序当中调用的系统API方法,及运行时字符串等信息,为检测APK文件中是否存有恶意代码提供了有力并且更加深度的检测方式。同时减少人工分析的工作量,减少重复性工作,且提供的数据更加高效准确。
1.一种基于APK的系统API和运行时字符串的提取方法,其特征在于,包括:
a.对APK文件进行解压缩,获取classes.dex文件;
b.对classes.dex文件进行反汇编,得到至少一个扩展名为.smali的文件;
c.将每个smali文件映射到内存,并解析smali文件中的每个函数;
d.顺序读取函数中的代码指令,并判断当前代码指令是否为最后一条代码指令,如果是,则执行步骤h,否则执行步骤e;
e.判断当前代码指令是否为API调用入口点,如果是,则执行步骤g,否则执行步骤f;
f.判断当前代码指令是否为产生运行时字符串入口点,如果是,则确定产生运行时字符串的最终指令,并执行步骤g,否则返回步骤d;
g.在当前代码指令后添加输出代码,返回步骤d;
h.将全部smali文件生成带有输出指令的smali文件,并将所有带有输出指令的smali文件重新打包为classes.dex文件,并将新生成的classes.dex文件替代原classes.dex文件,重新签名打包生成新APK文件。
2.如权利要求1所述的方法,其特征在于,所述的确定产生运行时字符串的最终指令为:
建立寄存器池,将可产生运行时字符串的寄存器存入寄存器池中,并监控全部寄存器池中寄存器所在函数体内的后续代码指令,如果代码指令改变寄存器的值,则所述条代码指令为产生运行时字符串的最终指令。
3.如权利要求2所述的方法,其特征在于,在产生运行时字符串的最终指令并添加了输出代码之后,删除寄存器池中对应的寄存器,若到达函数体结束指令后,寄存器池中有未删除的寄存器,则直接在该寄存器后添加输出代码。
4.如权利要求1所述的方法,其特征在于,所述smali文件中的代码指令为:以.method关键字开始,以.end method关键字结束的区间内的代码段。
5.一种基于APK的系统API和运行时字符串的提取系统,其特征在于,包括:
解压缩单元,对APK文件进行解压缩,获取classes.dex文件;
反汇编单元,用于对解压缩单元获取的classes.dex文件进行反汇编,得到至少一个扩展名为.smali的文件;
映射单元,用于将每个smali文件映射到内存,并逐条解析各smali文件中的代码指令;
判断单元,用于顺序读取代码指令,并判断当前代码指令是否为最后一条代码指令,如果是,则执行新文件生成,否则执行系统API调用入口点判断;
系统API调用入口点判断单元,用于判断当前代码指令是否为系统API调用入口点,如果是,则执行添加代码,否则执行产生运行时字符串入口点判断;
产生运行时字符串入口点判断单元,用于判断当前代码指令是否为运行时字符串入口点,如果是,则确定产生运行时字符串的最终指令,并执行添加代码,否则返回判断单元;
添加代码单元,在当前代码指令后添加输出代码;
新文件生成单元,用于生成带有输出指令的smali文件,并将所有带有输出指令的smali文件重新打包为classes.dex文件,并将新生成的classes.dex文件替代原classes.dex文件,重新签名打包生成新APK文件。
6.如权利要求5所述的系统,其特征在于,所述的确定产生运行时字符串的最终指令为:
建立寄存器池,将可产生运行时字符串的寄存器存入寄存器池中,并监控全部寄存器池中寄存器所在函数体内的后续代码指令,如果代码指令改变寄存器的值,则所述条代码指令为产生运行时字符串的最终指令。
7.如权利要求6所述的系统,其特征在于,在产生运行时字符串的最终指令并添加了输出代码之后,删除寄存器池中对应的寄存器,若到达函数体结束指令后,寄存器池中有未删除的寄存器,则直接在该寄存器后添加输出代码。
8.如权利要求5所述的系统,其特征在于,所述smali文件中的代码指令为:以.method关键字开始,以.end method关键字结束的区间内的代码段。
基于APK的系统API和运行时字符串的提取方法及系统\n技术领域\n[0001] 本发明涉及Android平台下的恶意代码自动化提取敏感信息技术,特别涉及一种基于APK的系统API和运行时字符串的提取方法及系统。\n背景技术\n[0002] 伴随着Android系统的快速普及化,无论是社会关注度还是Android系统的用户量,都逐年增加起来,甚至呈现激增的态势。然而,Android系统增加的背后却存在巨大的隐患,基于Android系统的恶意代码也随之大量增加。为了应对日益增长的恶意软件,很多的安全分析人员,依旧是通过计算机端对APK(Android系统上的可执行文件压缩包)进行人工分析、校验,恶意代码的检测。目前现有工具对样本进行逆向操作,大都采用静态分析,即程序逻辑完全依靠分析人员的经验和精力来进行分析判断,这样的方法笨重,而且重复性工作过多,在时间和效率上都大打折扣。在不断分析的过程中也难免会出现遗漏和疏忽的地方。\n发明内容\n[0003] 本发明提供一种基于APK的系统API和运行时字符串的提取方法及系统,实现了对Android平台下的APK文件中调用系统API和运行时产生字符串这两方面的重要信息进行自动化提取,极大加速分析的效率和准确率。\n[0004] 一种基于APK的系统API和运行时字符串的提取方法,包括:\n[0005] a.对APK文件进行解压缩,获取classes.dex文件;\n[0006] b.对classes.dex文件进行反汇编,得到至少一个扩展名为.smali的文件;\n[0007] c.将每个smali文件映射到内存,并解析smali文件中的每个函数;\n[0008] d.顺序读取函数中的代码指令,并判断当前代码指令是否为最后一条代码指令,如果是,则执行步骤h,否则执行步骤e;\n[0009] e.判断当前代码指令是否为API调用入口点,如果是,则执行步骤g,否则执行步骤f;\n[0010] f.判断当前代码指令是否为产生运行时字符串入口点,如果是,则确定产生运行时字符串的最终代码,并执行步骤g,否则返回步骤d;\n[0011] g.在当前代码指令后添加输出代码,返回步骤d;\n[0012] h.将全部smali文件生成带有输出指令的smali文件,并将所有带有输出指令的smali文件重新打包为classes.dex文件,并将新生成的classes.dex文件替代原classes.dex文件,重新签名打包生成新APK文件。\n[0013] 所述的方法中,所述的确定产生运行时字符串的最终指令为:\n[0014] 建立寄存器池,将可产生运行时字符串的寄存器存入寄存器池中,并监控全部寄存器池中寄存器所在函数体内的后续代码指令,如果代码指令改变寄存器的值,则所述条代码指令为产生运行时字符串的最终指令。\n[0015] 所述的方法中,在产生运行时字符串的最终指令并添加了输出代码之后,删除寄存器池中对应的寄存器,若到达函数体结束指令后,寄存器池中有未删除的寄存器,则直接在该寄存器后添加输出代码。\n[0016] 所述的方法中,所述smali文件中的代码指令为:以.method关键字开始,以.end method关键字结束的区间内的代码段。\n[0017] 一种基于APK的系统API和运行时字符串的提取系统,包括:\n[0018] 解压缩单元,对APK文件进行解压缩,获取classes.dex文件;\n[0019] 反汇编单元,用于对解压缩单元获取的classes.dex文件进行反汇编,得到至少一个扩展名为.smali的文件;\n[0020] 映射单元,用于将每个smali文件映射到内存,并逐条解析各smali文件中的代码指令;\n[0021] 判断单元,用于顺序读取代码指令,并判断当前代码指令是否为最后一条代码指令,如果是,则执行新文件生成,否则执行系统API调用入口点判断;\n[0022] 系统API调用入口点判断单元,用于判断当前代码指令是否为系统API调用入口点,如果是,则执行添加代码,否则执行产生运行时字符串入口点判断;\n[0023] 产生运行时字符串入口点判断单元,用于判断当前代码指令是否为运行时字符串入口点,如果是,则确定产生运行时字符串的最终代码,并执行添加代码,否则返回判断单元;\n[0024] 添加代码单元,在当前代码指令后添加输出代码;\n[0025] 新文件生成单元,用于生成带有输出指令的smali文件,并将所有带有输出指令的smali文件重新打包为classes.dex文件,并将新生成的classes.dex文件替代原classes.dex文件,重新签名打包生成新APK文件。\n[0026] 所述的系统中,所述的确定产生运行时字符串的最终指令为:\n[0027] 建立寄存器池,将可产生运行时字符串的寄存器存入寄存器池中,并监控全部寄存器池中寄存器所在函数体内的后续代码指令,如果代码指令改变寄存器的值,则所述条代码指令为产生运行时字符串的最终指令。\n[0028] 所述的系统中,在产生运行时字符串的最终指令并添加了输出代码之后,删除寄存器池中对应的寄存器,若到达函数体结束指令后,寄存器池中有未删除的寄存器,则直接在该寄存器后添加输出代码。\n[0029] 所述的系统中,所述smali文件中的代码指令为:以.method关键字开始,以.end method关键字结束的区间内的代码段。\n[0030] 通过本发明的方法,能够实现在计算机端自动化对APK文件进行处理,通过对APK当中的classes.dex进行修改,从而获取在程序当中调用系统API及产生运行时字符串等信息。\n[0031] 本发明提供的基于APK的系统API和运行时字符串的提取方法及系统,通过对APK文件进行解包及对其中classes文件的反编译,分析classes文件中的smali文件,通过增加输出代码,实现自动提取调用系统API和运行时字符串信息的代码。本方法可以细粒度自动化的对APK文件进行处理,从而获取在程序当中调用的系统API方法,及运行时字符串等信息,为检测APK文件中是否存有恶意代码提供了有力并且更加深度的检测方式。同时减少人工分析的工作量,减少重复性工作,且提供的数据更加高效准确。\n附图说明\n[0032] 为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。\n[0033] 图1为本发明基于APK的系统API和运行时字符串的提取方法流程图;\n[0034] 图2为本发明基于APK的系统API和运行时字符串的提取系统结构图。\n具体实施方式\n[0035] 为了使本技术领域的人员更好地理解本发明实施例中的技术方案,并使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图对本发明中技术方案作进一步详细的说明。\n[0036] 本发明提供一种基于APK的系统API和运行时字符串的提取方法及系统,实现了对Android平台下的APK文件中调用系统API和运行时产生字符串这两方面的重要信息进行自动化提取,极大加速分析的效率和准确率。\n[0037] 一种基于APK的系统API和运行时字符串的提取方法,如图1所示,包括:\n[0038] S101:对APK文件进行解压缩,获取classes.dex文件;APK文件为标准的zip文件格式,因此,常用的解压缩方法既可以对APK文件进行拆包,获取后续所需要的classes.dex可执行代码文件;\n[0039] S102:对classes.dex文件进行反汇编,得到至少一个扩展名为.smali的文件;\n[0040] classes.dex文件是一个或者多个扩展名为.class文件进行整合、优化后形成的,但通过对classes.dex文件的逆向反汇编操做并不能得到对应的.class文件,而是汇编指令文件,即.smali文件,因此后续对smali文件进行分析;\n[0041] S103:将每个smali文件映射到内存,并解析smali文件中的每个函数;\n[0042] S104:顺序读取函数中的代码指令,并判断当前代码指令是否为最后一条代码指令,如果是,则执行S109,否则执行S105;\n[0043] S105:判断当前代码指令是否为API调用入口点,如果是,则执行S108,否则执行S106;\n[0044] 判断是否是系统API调用入口点,主要是判断该指令是否可能是系统API的调用入口点。如果该指令是invoke-kind指令或invoke-kind/range指令,且methodname是系统API函数,则该指令为系统API调用的入口点;\n[0045] S106:判断当前代码指令是否为产生运行时字符串入口点,如果是,则执行S107,否则返回S104;\n[0046] S107:确定产生运行时字符串的最终代码;\n[0047] S108:在当前代码指令后添加输出代码,返回S104;\n[0048] S109:将全部smali文件生成带有输出指令的smali文件,并将所有带有输出指令的smali文件重新打包为classes.dex文件,并将新生成的classes.dex文件替代原classes.dex文件,重新签名打包生成新APK文件。\n[0049] 输出新的smali文件后会生成一个或多个smali文件,将这些新产生的smali文件重新生成classes.dex文件。利用新生成的classes.dex文件替代原classes.dex文件,其他文件不做增加和删除,在运行新的APK文件时输出需要的信息。为了在新APK运行时能够获取这些信息,可以在指定目录下生成一个log.txt文件,当运行新的APK文件时,需要输出的信息则都输出到leg.txt文件中。\n[0050] 所述的方法中,所述的确定产生运行时字符串的最终指令为:\n[0051] 建立寄存器池,将可产生运行时字符串的寄存器存入寄存器池中,并监控全部寄存器池中寄存器所在函数体内的后续代码指令,如果代码指令改变寄存器的值,则所述条代码指令为产生运行时字符串的最终指令。\n[0052] 产生运行时字符串入口点的判断,经分析发现监控在smali文件中创建string或stringbuilder的代码即可。\n[0053] 经过分析,在smali文件当中,能够产生运行时字符串的情况有很多种,但大多都会利用srting或stringbuilder作为媒介,因此仅监控创建上述代码的指令即可得到运行时字符串入口点。对于能够产生运行时字符串的指令列举如下:\n[0054] Const-string指令,是创建一个静态字符串,形式如下:const-string v,“string:。但是该静态串也存在可能产生动态串的可能性,例如,该对象调用string.equals()时,可实现静态串本身的解密行为。\n[0055] new-instance指令,包括new-instance v,String和new-instance v,StringBuilder。其中,new-instance v,String指令不仅包含const-string指令情况,而且还支持多个串动态生成一个串的情况。对于new-instance v,StringBuilder,则是可以实现不断扩展,拼接字符串。\n[0056] local指令,local Vx,name:Ljava/lang/String或者local Vx,name:Ljava/lang/StringBuilder。对于这两种情况,经过分析,最终可以归纳到new-instance上的两种情况。\n[0057] 其他指令包括new-array、filled-new-array、aget-object、sget-wide、sget-object等。\n[0058] 改变寄存器的值,例如move Vx,Vy指令即改变了Vx寄存器的值,那么在该条指令位置处就算是确定了最终产生的运行时字符串了。\n[0059] 所述的方法中,在产生运行时字符串的最终指令并添加了输出代码之后,删除寄存器池中对应的寄存器,若到达函数体结束指令后,寄存器池中有未删除的寄存器,则直接在该寄存器后添加输出代码。即当到达函数体结束位置时(“.end method”关键字处),如果在“寄存器池”当中还有未删除的寄存器,那么直接输出该寄存器的值即可。\n[0060] 所述的方法中,所述smali文件中的代码指令为:以.method关键字开始,以.end method关键字结束的区间内的代码段。\n[0061] smali文件时一种文本文件,由于在smali文件当中并不全部都是指令代码,因此,定位到以.method关键字开头,以.end method关键字结尾之间,该区域为smali文件中的代码段。\n[0062] 一种基于APK的系统API和运行时字符串的提取系统,如图2所示,包括:\n[0063] 解压缩单元201,对APK文件进行解压缩,获取classes.dex文件;\n[0064] 反汇编单元202,用于对解压缩单元获取的classes.dex文件进行反汇编,得到至少一个扩展名为.smali的文件;\n[0065] 映射单元203,用于将每个smali文件映射到内存,并逐条解析各smali文件中的代码指令;\n[0066] 判断单元204,用于顺序读取代码指令,并判断当前代码指令是否为最后一条代码指令,如果是,则执行新文件生成,否则执行系统API调用入口点判断;\n[0067] 系统API调用入口点判断单元205,用于判断当前代码指令是否为系统API调用入口点,如果是,则执行添加代码,否则执行产生运行时字符串入口点判断;\n[0068] 产生运行时字符串入口点判断单元206,用于判断当前代码指令是否为运行时字符串入口点,如果是,则确定产生运行时字符串的最终代码,并执行添加代码;\n[0069] 添加代码单元207,在当前代码指令后添加输出代码;\n[0070] 新文件生成单元208,用于生成带有输出指令的smali文件,并将所有带有输出指令的smali文件重新打包为classes.dex文件,并将新生成的classes.dex文件替代原classes.dex文件,重新签名打包生成新APK文件。\n[0071] 所述的系统中,所述的确定产生运行时字符串的最终指令为:\n[0072] 建立寄存器池,将可产生运行时字符串的寄存器存入寄存器池中,并监控全部寄存器池中寄存器所在函数体内的后续代码指令,如果代码指令改变寄存器的值,则所述条代码指令为产生运行时字符串的最终指令。\n[0073] 所述的系统中,在产生运行时字符串的最终指令并添加了输出代码之后,删除寄存器池中对应的寄存器,若到达函数体结束指令后,寄存器池中有未删除的寄存器,则直接在该寄存器后添加输出代码。\n[0074] 所述的系统中,所述smali文件中的代码指令为:以.method关键字开始,以.end method关键字结束的区间内的代码段。\n[0075] 通过本发明的方法,能够实现在计算机端自动化对APK文件进行处理,通过对APK当中的classes.dex进行修改,从而获取在程序当中调用系统API及产生运行时字符串等信息。\n[0076] 本发明提供的基于APK的系统API和运行时字符串的自动化提取方法及系统,通过对APK文件进行解包及对其中classes文件的反编译,分析classes文件中的smali文件,通过增加输出代码,实现自动提取调用系统API和运行时字符串信息的代码。本方法可以细粒度自动化的对APK文件进行处理,从而获取在程序当中调用的系统API方法,及运行时字符串等信息,为检测APK文件中是否存有恶意代码提供了有力并且更加深度的检测方式。同时减少人工分析的工作量,减少重复性工作,且提供的数据更加高效准确。\n[0077] 本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。\n[0078] 虽然通过实施例描绘了本发明,本领域普通技术人员知道,本发明有许多变形和变化而不脱离本发明的精神,希望所附的权利要求包括这些变形和变化而不脱离本发明的精神。
法律信息
- 2018-09-14
专利权质押合同登记的生效
IPC(主分类): G06F 9/45
专利号: ZL 201210559627.1
申请日: 2012.12.21
授权公告日: 2016.08.03
登记号: 2018990000700
登记生效日: 2018.08.17
出质人: 北京安天网络安全技术有限公司
质权人: 中信银行股份有限公司哈尔滨分行
发明名称: 基于APK的系统API和运行时字符串的提取方法及系统
- 2018-09-11
专利权质押合同登记的注销
IPC(主分类): G06F 9/45
专利号: ZL 201210559627.1
申请日: 2012.12.21
授权公告日: 2016.08.03
登记号: 2017990000776
解除日: 2018.08.17
出质人: 北京安天网络安全技术有限公司
质权人: 中信银行股份有限公司哈尔滨分行
- 2017-09-15
专利权质押合同登记的生效
IPC(主分类): G06F 9/45
专利号: ZL 201210559627.1
申请日: 2012.12.21
授权公告日: 2016.08.03
登记号: 2017990000776
登记生效日: 2017.08.21
出质人: 北京安天网络安全技术有限公司
质权人: 中信银行股份有限公司哈尔滨分行
发明名称: 基于APK的系统API和运行时字符串的提取方法及系统
- 2017-05-10
专利权人的姓名或者名称、地址的变更
专利权人由北京安天电子设备有限公司变更为北京安天网络安全技术有限公司
地址由100080 北京市海淀区中关村大街1号海龙大厦14层1415室变更为100080 北京市海淀区闵庄路3号清华科技园玉泉慧谷一期1号楼
- 2016-08-03
- 2013-11-20
实质审查的生效
IPC(主分类): G06F 9/45
专利申请号: 201210559627.1
申请日: 2012.12.21
- 2013-10-23
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2007-07-25
|
2006-11-27
| | |
2
| |
2012-09-12
|
2012-03-16
| | |
3
| |
2012-10-31
|
2011-12-20
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |