反混淆安卓应用源码的方法、设备和计算机可读存储介质与流程

文档序号:31310432发布日期:2022-08-30 23:16阅读:78来源:国知局
反混淆安卓应用源码的方法、设备和计算机可读存储介质与流程

1.本公开总体上涉及网络技术与安全领域,更具体地涉及反混淆安卓应用源码的方法、设备和计算机可读存储介质。


背景技术:

2.源码混淆是安卓应用中最为普遍的源代码保护手段,它作为一种基础、有效并且对源程序影响相对较小的方式而被开发者广泛采用。但是,很多恶意应用也会通过混淆的方式保护自己,通过使用简短且无意义的名字来重命名类、接口、字段和方法来加大安全人员的逆向难度,通过增加无用类、字段、方法、属性和流程等无效代码的方式增加程序的复杂度使部分逆向工具报错。所以,针对上述混淆方式,就需要相应的反混淆手段来降低逆向工程的复杂度。
3.例如,在现有技术中存在一种技术方案,其通过javap转换指令并分析指令然后按类型转换,最后根据堆栈指令删除无用指令,主要不足是转换后的命名可读性较差,存在较多意义不明的转换,而且删去无用代码部分放在最后效率较低。
4.例如,在现有技术中存在另一种技术方案,其使用污点分析进行控制流裁剪,主要局限在仅处理控制流混淆的应用。


技术实现要素:

5.在下文中给出了关于本公开的简要概述,以便提供关于本公开的一些方面的基本理解。但是,应当理解,这个概述并不是关于本公开的穷举性概述。它并不是意图用来确定本公开的关键性部分或重要部分,也不是意图用来限定本公开的范围。其目的仅仅是以简化的形式给出关于本公开的某些概念,以此作为稍后给出的更详细描述的前序。
6.根据本公开的一个方面,提供一种反混淆安卓应用源码的方法,包括:对安卓应用源码进行反混淆以获得混淆后的smali源码和java源码;基于混淆后的smali源码中的.source字段中的内容替换混淆后的java源码中的相应名称,所述相应名称包括文件名、最外层类名、接口名以及构造方法名中的一个或多个;基于安卓系统中的string.xml中的内容替换混淆后的java源码中的无意义词汇;以及利用词频-逆文本频率(tf-idf)技术找出与安卓应用的方法和类中的特有高频词汇并用特有高频词汇替换混淆后的java源码中相应的方法名和类名。
7.根据本公开的另一个方面,提供一种反混淆安卓应用源码的装置,包括:存储器,其上存储有指令;以及处理器,被配置为执行存储在所述存储器上的指令,以执行如上所述的方法。
8.根据本公开的又一个方面,提供一种计算机可读存储介质,其包括计算机可执行指令,所述计算机可执行指令在由一个或多个处理器执行时,使得所述一个或多个处理器执行根据本公开的上述方面所述的方法。
附图说明
9.构成说明书的一部分的附图描述了本公开的实施例,并且连同说明书一起用于解释本公开的原理。参照附图,根据下面的详细描述,可以更清楚地理解本公开,其中:
10.图1示出了根据本发明一个实施例的反混淆安卓应用源码的示例过程100的流程图;
11.图2示出了根据本发明一个实施例的反混淆安卓应用源码的另一示例过程的流程图;
12.图3示出了可以实现根据本公开的实施例的计算设备的示例性配置。
具体实施方式
13.参考附图进行以下详细描述,并且提供以下详细描述以帮助全面理解本公开的各种示例实施例。以下描述包括各种细节以帮助理解,但是这些细节仅被认为是示例,而不是为了限制本公开,本公开是由随附权利要求及其等同内容限定的。在以下描述中使用的词语和短语仅用于能够清楚一致地理解本公开。另外,为了清楚和简洁起见,可能省略了对公知的结构、功能和配置的描述。本领域普通技术人员将认识到,在不脱离本公开的精神和范围的情况下,可以对本文描述的示例进行各种改变和修改。
14.本发明人注意到一般的反混淆方法所做的是将混乱的命名整理到相对规整的形式,但本身仍旧意义不明晰,同时很多反混淆工具仅做到当前类中命名唯一,并未考虑全局唯一。为了解决现有技术中存在的问题,本发明人提出一种反混淆安卓应用源码的方法,通过引入自然语言处理并结合统计学的方法对安卓应用的源码进行反混淆,对混淆部分进行分析预测,还原出安卓应用的源码,并唯一标识命名,可以降低逆向工作的难度,提高逆向效率和成功率。
15.图1示出了根据本发明一个实施例的反混淆安卓应用源码的示例过程100的流程图。
16.在方框101,对安卓应用源码进行反混淆以获得混淆后的smali源码和java源码。
17.在方框102,基于混淆后的smali源码中的.source字段中的内容替换混淆后的java源码中的相应名称,所述相应名称包括文件名、最外层类名、接口名以及构造方法名中的一个或多个。
18.在方框103,基于安卓系统中的string.xml中的内容替换混淆后的java源码中的无意义词汇。
19.在方框104,利用词频-逆文本频率(tf-idf)技术找出与安卓应用的方法和类中的特有高频词汇并用特有高频词汇替换混淆后的java源码中相应的方法名和类名。
20.以下结合图2对过程100的各个步骤进行详细描述。图2示出了根据本发明一个实施例的反混淆安卓应用源码的另一示例过程的流程图。值得注意的是,以下描述包括了大量的不必要的细节,本领域技术人员可以根据需要对这些细节进行取舍。
21.在s1,通过反编译获得安卓应用混淆后的smali源码。例如,可以使用apktool反编译获得安卓应用混淆后的smali源码。
22.在s2,通过反编译获得安卓应用混淆后的java源码。例如,可以使用jadx反编译获得安卓应用混淆后的java源码。
23.在s3,通过分析androidmanifest.xml清单文件找到安卓应用入口,并通过污点分析获得控制流图,依据控制流将不被执行的代码删去。例如,可以通过flowdroid进行污点分析获得控制流图。由于会有冗余未删除的代码、注释的代码、暂时写下来还未使用的代码等一系列不会被实际执行的代码,所以删除会减小后续工作量。
24.androidmainfest.xml清单文件是每个android项目所必需的,它是整个android应用的全局描述文件。例如,androidmainfest.xml可以包括如下所示的内容:
25.《!
‑‑
指定该activity是程序的入口
‑‑

26.《action android:name="android.intent.action.main"/》
27.《!
‑‑
指定加载该应用时运行该activity
‑‑

28.《category android:name="android.intent.category.launcher"/》
29.《/intent-filter》
30.《/activity》
31.《/application》
32.在s4,从s1中提取得到的smali源码中获得.source字段,依据java语法将此字段替换s2中得到的java源码的文件名、最外层类名或接口名以及构造方法名等。
33.在安卓应用中用string.xml存储应用中定义和出现的文字,例如在屏幕上显示的文字。这样可以实现国际化,减少应用的体积并降低数据的冗余。
34.例如,.source字段中包括了主函数“authoption.java”。
35.a.smali文件的内容
[0036][0037]
b.java文件的内容
[0038][0039]
将b中红色方框内的主函数名a都替换为authoption即可。这是由于java语言的特性,java代码文件的名称必须和类名一致,且构造方法名就是类名,而且同一个文件里的其他同名方法属于构造方法的重载方法,所以可以同步替换。
[0040]
在s5,根据遍历的资源文件中的string.xml,将s2中得到的java源码中的无意义词汇替换。通过遍历资源文件中string.xml,利用相关字符串尽可能替换一遍java源码,可以为后续处理提高准确率。
[0041]
以下示出了可以进行字符串替换的示例:
[0042][0043]
文件string.xml本身的作用就是可以将一些常用或者需要经常改变的字符串统一进行管理,然后在应用的代码里通过name属性进行引用。比如,通常在代码里会这样引用string.xml文件里的字符串:
[0044]
string str=(string)this.getresources().gettext(r.string.ao1);
[0045]
这样在后面处理的时候这段代码里可用的信息会比较少,但是如果根据string.xml里的《string name=”ao1”》verify your name and phone《/string》
[0046]
进行替换后,源代码里就有更多的有意义的信息供后面使用:
[0047]
string str=(string)this.getresources().gettext(“verify your name and phone”);
[0048]
这时就容易判断出这段代码所属的方法很有可能是为了验证用户名和手机号。
[0049]
在s6,利用tf-idf找到各方法中的特有高频词汇,然后根据高频词找到预先学习形成的模型中与高频词最接近的词,组合并补全包名和方法名作为该方法的方法名;并且利用tf-idf找到各类中的特有高频词汇,然后根据高频词找到预先学习形成的模型中与高频词最接近的词,组合并补全包名作为该类的类名。
[0050]
例如,预先使用大量未混淆的代码组成的语料库采用wordrank进行建模得到词汇相关性模型,并对语料库做词性分析。然后,利用tf-idf找到混淆源码中各方法的特有高频词汇,若高频词为动词,则选取模型中概率最高的名词,反之则选择动词,组合成动名词短语作为方法名,同时为了确保此方法全局唯一,需要在前补充包名、类名。利用tf-idf找到混淆源码中各类的特有高频词汇,若高频词为动词,则选取模型中概率最高的名词,反之则选择动词,组合成动名词短语作为类名,同时为了确保此类全局唯一,需要在类名前补充包名。
[0051]
tf-idf(term frequency

inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术,其中tf是词频,而idf是逆文本频率。例如,本文中使用以下公式
来对tf和idf进行计算:
[0052][0053]
在本文中,tf公式中的分子表示字词ni在文件dj中出现的次数,而分母则是在文件dj中所有字词的出现次数之和;idf公式中的分子表示语料库中的文件总数,分母则是包含词语ti的文件数目。
[0054]
例如,可以通过以下公式来计算词频:
[0055]
tfidf
i,j
=tf
i,j
×
idfi[0056]
以下给出了使用上述模型,确定代码中的特有高频词为phone、dial。
[0057][0058]
此外,确定词性分别为名词、动词和名词,如下所示:
[0059][0060]
根据特有高频词phone为名词,取模型中概率最高的动词,预测此方法名a实际应为callphone,同时为确保唯一,需要补上包名和类名,所以最后为:
[0061]
public void package_a.class_a.callphone(c b){

}
[0062]
这个步骤基于如下逻辑:由于通常比较正式的类名和方法名的命名方式都是采用动词加名词的方式,且采用驼峰命名规则(例如:getage()表示获取年龄的方法,setyear(int year)表示设置年份的方法),在方法名和类名前补充包名可以确保该方法是全局唯一的,因为混淆之后的代码可能会出现很多不同java文件里面都有不同的方法被混淆成a,这就不方便研究人员唯一搜索并定位到某一个具体的方法。
[0063]
在s8,对于无法预测的类名、方法名以及变量名,采用添加class_和method_以及param_前缀的方式重命名,并补全包名、类名等,完成源代码反混淆。
[0064]
例如,在利用s8中的处理之前,代码为:
[0065][0066]
在利用s8的处理之后,代码为:
[0067][0068]
这个步骤是为了在无法预测类名方法名的时候,至少能将包名、类名和方法名区分开,因为混淆之后,不同文件里的不通类、方法和变量都可以变成a,这样在搜索a的时候也会是结果里混着名称相同的包、类、方法和变量,不方便研究人员分类处理。
[0069]
与现有技术相比,本发明具有以下优点和效果中的一个或多个:
[0070]
1、针对安卓应用源码的文件名、类名、接口名、方法名等做有意义的转换,确保全局唯一性,以及
[0071]
2、提高逆向效率,提升源码可读性。
[0072]
图3示出了能够实现根据本公开的实施例的计算设备1200的示例性配置。
[0073]
计算设备1200是能够应用本公开的上述方面的硬件设备的实例。计算设备1200可以是被配置为执行处理和/或计算的任何机器。计算设备1200可以是但不限制于工作站、服务器、台式计算机、膝上型计算机、平板计算机、个人数据助手(pda)、智能电话、车载计算机
或以上组合。
[0074]
如图3所示,计算设备1200可以包括可以经由一个或多个接口与总线1202连接或通信的一个或多个元件。总线1202可以包括但不限于,工业标准架构(industry standard architecture,isa)总线、微通道架构(micro channel architecture,mca)总线、增强isa(eisa)总线、视频电子标准协会(vesa)局部总线、以及外设组件互连(pci)总线等。计算设备1200可以包括例如一个或多个处理器1204、一个或多个输入设备1206以及一个或多个输出设备1208。一个或多个处理器1204可以是任何种类的处理器,并且可以包括但不限于一个或多个通用处理器或专用处理器(诸如专用处理芯片)。处理器1204例如可以被配置为实现如图1所示的方法。输入设备1206可以是能够向计算设备输入信息的任何类型的输入设备,并且可以包括但不限于鼠标、键盘、触摸屏、麦克风和/或远程控制器。输出设备1208可以是能够呈现信息的任何类型的设备,并且可以包括但不限于显示器、扬声器、视频/音频输出终端、振动器和/或打印机。
[0075]
计算设备1200还可以包括或被连接至非暂态存储设备1214,该非暂态存储设备1214可以是任何非暂态的并且可以实现数据存储的存储设备,并且可以包括但不限于盘驱动器、光存储设备、固态存储器、软盘、柔性盘、硬盘、磁带或任何其他磁性介质、压缩盘或任何其他光学介质、缓存存储器和/或任何其他存储芯片或模块、和/或计算机可以从其中读取数据、指令和/或代码的其他任何介质。计算设备1200还可以包括随机存取存储器(ram)1210和只读存储器(rom)1212。rom 1212可以以非易失性方式存储待执行的程序、实用程序或进程。ram 1210可提供易失性数据存储,并存储与计算设备1200的操作相关的指令。计算设备1200还可包括耦接至数据链路1218的网络/总线接口1216。网络/总线接口1216可以是能够启用与外部装置和/或网络通信的任何种类的设备或系统,并且可以包括但不限于调制解调器、网络卡、红外线通信设备、无线通信设备和/或芯片集(诸如蓝牙
tm
设备、802.11设备、wifi设备、wimax设备、蜂窝通信设施等)。
[0076]
本公开可以被实现为装置、系统、集成电路和非瞬时性计算机可读介质上的计算机程序的任何组合。可以将一个或多个处理器实现为执行本公开中描述的部分或全部功能的集成电路(ic)、专用集成电路(asic)或大规模集成电路(lsi)、系统lsi,超级lsi或超lsi组件。
[0077]
本公开包括软件、应用程序、计算机程序或算法的使用。可以将软件、应用程序、计算机程序或算法存储在非瞬时性计算机可读介质上,以使诸如一个或多个处理器的计算机执行上述步骤和附图中描述的步骤。例如,一个或多个存储器以可执行指令存储软件或算法,并且一个或多个处理器可以关联执行该软件或算法的一组指令,以根据本公开中描述的实施例提供各种功能。
[0078]
软件和计算机程序(也可以称为程序、软件应用程序、应用程序、组件或代码)包括用于可编程处理器的机器指令,并且可以以高级过程性语言、面向对象编程语言、功能性编程语言、逻辑编程语言或汇编语言或机器语言来实现。术语“计算机可读介质”是指用于向可编程数据处理器提供机器指令或数据的任何计算机程序产品、装置或设备,例如磁盘、光盘、固态存储设备、存储器和可编程逻辑设备(pld),包括将机器指令作为计算机可读信号来接收的计算机可读介质。
[0079]
举例来说,计算机可读介质可以包括动态随机存取存储器(dram)、随机存取存储
器(ram)、只读存储器(rom)、电可擦只读存储器(eeprom)、紧凑盘只读存储器(cd-rom)或其他光盘存储设备、磁盘存储设备或其他磁性存储设备,或可以用于以指令或数据结构的形式携带或存储所需的计算机可读程序代码以及能够被通用或专用计算机或通用或专用处理器访问的任何其它介质。如本文中所使用的,磁盘或盘包括紧凑盘(cd)、激光盘、光盘、数字多功能盘(dvd)、软盘和蓝光盘,其中磁盘通常以磁性方式复制数据,而盘则通过激光以光学方式复制数据。上述的组合也包括在计算机可读介质的范围内。
[0080]
提供本公开的主题作为用于执行本公开中描述的特征的装置、系统、方法和程序的示例。但是,除了上述特征之外,还可以预期其他特征或变型。可以预期的是,可以用可能代替任何上述实现的技术的任何新出现的技术来完成本公开的部件和功能的实现。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1