CN106778103B - 一种安卓应用程序防逆向破解的加固方法、系统及解密方法 - Google Patents

一种安卓应用程序防逆向破解的加固方法、系统及解密方法 Download PDF

Info

Publication number
CN106778103B
CN106778103B CN201611265457.0A CN201611265457A CN106778103B CN 106778103 B CN106778103 B CN 106778103B CN 201611265457 A CN201611265457 A CN 201611265457A CN 106778103 B CN106778103 B CN 106778103B
Authority
CN
China
Prior art keywords
file
class
android
program
decryption
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201611265457.0A
Other languages
English (en)
Other versions
CN106778103A (zh
Inventor
郑伟
龚蔚
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shanghai Zhangmen Science and Technology Co Ltd
Original Assignee
Shanghai Zhangmen Science and Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Shanghai Zhangmen Science and Technology Co Ltd filed Critical Shanghai Zhangmen Science and Technology Co Ltd
Priority to CN201611265457.0A priority Critical patent/CN106778103B/zh
Publication of CN106778103A publication Critical patent/CN106778103A/zh
Application granted granted Critical
Publication of CN106778103B publication Critical patent/CN106778103B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Storage Device Security (AREA)

Abstract

本发明涉及一种安卓应用程序防逆向破解的加固的方法、系统及解密方法,其中加固方法及系统均利用apktool工具对Android应用程序反汇编成smali文件,遍历所有的类,添加clinit,使用apktool进行重新编译成DEX文件,对DEX加固用到的关键SO进行SO加固保护。解密方法为分布式按需加载类文件,判断系统环境,通过数学统计学探测虚拟机是否被篡改。应用本发明的加解密技术方案,为Android平台下的应用加解密提出了创新的思路和可行的技术解决途径,可用于对Android平台下的应用进行保护,防止程序被反编译等黑客手段攻击,保护商业软件的机密性、保护用户应用安全。

Description

一种安卓应用程序防逆向破解的加固方法、系统及解密方法
技术领域
本发明涉及基于移动终端应用加密技术领域,具体而言,本发明涉及一种安卓应用程序防逆向破解的加固方法、系统及解密方法。
背景技术
目前,由Google公司主导开发的Android操作系统已经是全球市场占有率最高的移动智能终端平台。Android的应用软件数量不断增长,并建立了良好的软件销售模式。与传统PC平台一样,Android应用软件的成功商业化,也引发了对它们的逆向分析和破解。
对应用软件的逆向分析(reversing analysis)包括:
一、对软件的可执行代码采用反汇编、反编译、调试等方法进行分析,以了解其代码的执行流程和算法实现等;
二、对软件的配置文件和数据文件进行分析,以获得这些文件的格式和语义等;
三、对软件的网络通信数据进行分析,以获得软件与服务器通信的协议格式、协议语义、数据加密方法和数据具体含义等。
其中,后两类分析建立在第一类分析的基础之上,即需要先分析可执行代码,才能进一步分析配置文件、数据文件、网络通信数据等。
通过逆向分析,攻击者可以获得软件中的商业机密。例如,在手机的反病毒软件中,恶意代码检测算法、特征匹配算法等可执行代码,以及恶意代码特征库等数据文件,一旦被攻击者逆向分析得到具体细节,既可能被其他同类软件所利用,也可能被恶意代码作者进行针对性防御或攻击。
另外,为避免逆向破解,现有技术中也存在多种方式来进行预防和避免,如申请号:201610279693.1通过smali代码混淆的方式对自己的android app进行保护,代码依然可以被反汇编和反编译,只是提高了理解代码所需要的时间;申请号:201610206483.x通过反汇编后的smali代码进行加密保护,然而无论是代码还是加密后的数据,都以文件形式长期存在于Android安装文件和Android设备之中,使用内存dump仍可完成破解,由此,对于Android应用来说,黑客还是可以找到蛛丝马迹进行逆向破解。
发明内容
鉴于现有技术中的上述缺陷或不足,期望能够提供一种安全性高、难以破解的方案。为了实现上述一个或多个目的,本申请提供了一种安卓应用程序防逆向破解的加固的方法和系统。
根据本发明的一个方面,本发明提供了
一种安卓应用程序防逆向破解的加固方法,包括以下步骤:
使用安卓安装包编译工具对安卓应用程序进行反向汇编,生成中间文件;
遍历生成中间文件中的类,对需要加载的类设置对应的类构造器;
抽取出除了类构造器和初始化函数之外的所有中间文件进行加密并存储;以及,
调用动态链接库对可执行文件进行加固。
优选的,在抽取出除了类构造器和初始化函数之外的所有中间文件进行加密之前,还包括:使用安卓安装包编译工具对上述设置了类构造器的中间文件进行汇编处理,重新编译成可执行文件。
优选的,对所述中间文件进行加密还包括:
对所述中间文件进行抽取操作,生成空壳程序文件和入口地址文件;以及,
对所述入口地址文件进行修改操作,生成修改入口。
优选的,调用动态链接库对可执行文件进行加固之后还包括:将加固文件写入空壳程序文件中。
优选的,所述空壳程序文件中还包括解密流程,该解密流程包括:当类需要装载的时候,调用类构造器,通过类构造器调用底层函数进而解密出代码;使用数学统计方法探测虚拟机是否被恶意篡改。
优选的,所述数学统计方法可包括规律性统计或方差均化方式。
根据本发明的另一个方面,本发明还提供了一种安卓应用程序防逆向破解的加固系统,包括以下单元:
获取安装包单元:用于获取原始安卓安装包;
反向汇编单元:利用安卓安装包编译工具对安卓应用程序反向汇编从而得到中间文件;
类构造器单元:遍历生成的中间文件中的类,对需要加载的类设置对应的类构造器;
抽取加密单元:抽取出除了类构造器和初始化函数之外的所有中间文件进行加密并存储;以及
加固单元,调用动态链接库对可执行文件进行加固。
优选的,所述抽取加密单元在抽取出除了类构造器和初始化函数之外的所有中间文件进行加密之前,还包括:使用安卓安装包编译工具对上述设置了类构造器的中间文件进行汇编处理,重新编译成可执行文件
优选的,所述抽取加密单元还包括:
对所述中间文件进行抽取操作,生成空壳程序文件和入口地址文件;
对所述入口地址文件进行修改操作,生成修改入口。
优选的,所述系统还包括写入单元,用于将动态链接库写入空壳程序文件中。
优选的,所述空壳程序文件中还包括解密单元,该解密单元用于当类需要装载的时候,调用类构造器,通过类构造器调用底层函数进而解密出代码;使用数学统计方法探测虚拟机是否被恶意篡改。
优选的,所述数学统计方法可包括规律性统计或方差均化方式。
根据本发明的另一个方面,本发明还提供了一种空壳文件解密方法,包括以下步骤:
得到Android版本号,判断该版本是否是有漏洞的版本;
如果是有漏洞版的,采用重写类函数以修复此漏洞;
测试是否是32位系统环境,如果是32位系统环境对32位系统虚拟机漏洞进行修复;
检测是否是ARM处理器环境;
对java运行环境进行检测,判断该运行环境是DVM模式还是ART模式;
检测是否是三星定制只读内存镜像;
如果是三星定制只读内存镜像的话,对可执行文件偏移地址进行修改;
当类需要装载的时候,调用类构造器,通过类构造器调用底层函数进而解密出代码;
使用数学统计方法探测虚拟机是否被恶意篡改。
优选的,所述判断具有漏洞的版本是android3.0或android1.6
本发明实施例提出的具体的Android应用程序APK加固方法、系统及解密方法,通过将按需解密以及对SO文件进行自定义格式,从而使得汇编后的SO文件内容难以识别,极大地增加了APK程序逻辑的分析时间成本以及分析难度,进一步提高的程序代码的安全性,有效的满足了Android应用程度对抗静态以及动态逆向破解的需求。另外,该方法和系统能够兼容多个版本android,包括兼容android4.0以下、android 6.0,适合在在三星定制的只读内存镜像、android4.4 art模式下运行。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1为本发明的较佳实施例的Android应用程序APK加密方法的流程图。
图2为本发明的较佳实施例的Android应用程序APK加密系统的结构图。
图3为本发明的较佳实施例的解密的方法流程图。
图4为本发明的较佳另外一种实施例的解密的方法流程图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图1示出了根据本发明一个实施例的一种安卓应用程序防逆向破解的加固方法的流程示意图;如图1所示,本发明的防逆向破解的加固方法包括以下步骤:
步骤101获取安卓应用的原始安卓安装包;
安卓系统中,一个可以安装、运行的应用需要打包成安卓安装包,即APK(androidapplication package file)文件格式。其中,所述APK是Android Package的缩写,即Android安装包。一个Android应用程序的代码想要在Android设备上运行,必须先进行编译,并被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的文件格式便是“APK”。一个APK文件内可以包含被编译的代码文件(DEX文件),资源文件夹(名称为res的文件夹),证书(certificates)和清单文件(manifest file)等。APK文件其实是zip格式,但后缀名被修改为apk,通过Unzip解压后,就可以得到所述APK文件中的原始DEX文件,其中DEX是DalvikVM executes的全称,即Android Dalvik执行程序,也就是说,DEX文件的功能类似于Windows系统下的EXE文件。
步骤102,利用安卓安装包编译工具对安卓应用反向汇编从而得到中间文件;
所述安卓安装包编译工具可为apktool或Baksmali反汇编器,所述中间文件为smali文件。将安卓应用中的DEX文件进行反汇编操作,从而在反编译工程目录下生成一个smali文件夹,里面存放着所有反编译出的smali文件,这些文件会根据程序包的层次结构生成相应的目录,程序中所有的类都会在相应的目录下生成独立的smali文件。
步骤103,遍历生成的中间文件中的类,对需要加载的类设置对应的类构造器;优选的,所述设置对应的类构造器包括:遍历smali文件中的类函数,确定那些类是需要执行的,自动添加<clinit>标记;当读到<clinit>标记时,表示要指引执行这段程序。
步骤104,使用安卓安装包编译工具对上述设置了类构造器的smali文件进行汇编操作,重新编译成可执行文件;随后抽取出除了类初始化函数和初始化函数之外的所有中间文件进行加密并存储;
所述可执行文件为DEX文件,所述类初始化函数和初始化函数分别为clinit和init函数;
具体的,使用已知的第三方汇编工具apktool或Smali汇编器将上述设置了类构造器的的smali文件重新编译成DEX文件,其中,汇编工具与反汇编工具应该是相互匹配的,如Smali和Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种DEX格式文件的汇编器和反汇编器。
优选的,对文件加密包括:
对smali代码进行抽取操作,以生成空壳smali文件和入口地址文件;
对所述入口地址文件进行修改操作,以生成修改入口。
优选的,还可以对重新编译的DEX进行加密。具体包括:加载DEX文件,解析DEX文件为DEX基础结构数据文件和字节码数据文件,调用davlik虚拟机函数openDEXFile以加载所述DEX基础结构数据文件。将DEX文件的Head,String Table,Type Table,Proto Table,Field Table,Method Table、Class Def Table,Data Section这几个部分进行分离,形成字节码数据文件,确定并读取各部分文件的偏移值。抽取DEX文件中的字节码数据,并存储到所述DEX函数实现字节码数据文件;使用对称加密算法对各字节码数据文件进行加密。加密算法可以是加密算法可以是利用常规的数据加密算法,如AES(Advanced EncryptionStandard,高级加密标准),对所述原始DEX文件进行加密处理,从而得到加密DEX文件。进一步地,还可以对所述原始DEX文件进行整体加密,如加密算法采用AES,签名算法采用RSA(公钥加密算法),摘要算法采用SHA1(Secure Hash Algorithm,安全哈希算法),也可以得到加密DEX文件。
步骤105,通过动态链接库对可执行文件进行加固。
所述加固包括:
对SO文件进行格式分析以生成自定义格式;
对所述自定义格式进行加密以生成加密后的自定义格式;
将加密后的自定义格式嵌入到linker装载器里。
通常地,SO文件为动态链接库,本质是共享文件库,由C或C++语言编译出来的。在程序启动的时候首先加载该SO文件。并由该SO文件分别解密解压缩文件,并且调用openDEXFile加载DEX基础结构数据文件。并根据DEX函数实现字节码数据文件中的数据依次修复DEX基础结构数据文件每个函数的偏移,之后程序正常运行。
步骤106,将动态链接库写入空壳程序文件中,进而通过空壳程序文件进行加载运行。所述空壳程序文件为空壳smali文件。
优选的,对SO文件进行加壳处理,将加固后的SO文件作为代码数据写入壳程序文件中;对壳程序文件中的SO文件可通过以下方式进行保护。包括去掉SO文件中的局部信息,即实现了SO文件局部信息缺失;从而无法得到完整的SO文件;对SO文件进行分段加密处理:即对数据节和代码节分别加密,提升解密难度;对SO文件进行代码混淆处理:即给破解者提供乱序代码,造成困扰,增加破解难度。
优选的,在壳程序文件中包含能够对加固的SO文件进行解密处理的代码。在加载运行SO文件时,壳程序文件会先于SO文件运行,取得优先权,对加固的SO文件进行解密处理,
如附图3所示,所述解密处理流程包括:
1.测试是系统环境是否是32位系统环境,如果是32位系统环境对32位系统虚拟机漏洞进行修复;
优选的,所述32位系统为X86,该虚拟机漏洞是smali指令集漏洞,对x86虚拟机漏洞进行修复是在虚拟机中指令集解释层面的x86汇编,采用hook技术进行修复;
2.检测是否是arm环境;
3.对java运行环境进行检测,判断该运行环境是dvm模式还是art模式;优选的,可通过加载libart.SO或libdvm.SO来检测出java运行环境;
4.当类需要装载的时候,调用clinit函数,通过clinit函数调用底层函数进而解密出代码,代码遍历采用红黑树算法进行优化,以达到O(lgn)级别的数据结构;
优选的,利用clinit函数指引到要执行的程序,在执行相应的程序后执行空壳程序文件,通过空壳程序文件调用动态链接库,在利用动态链接库从中间文件中调取相应的程序,通过动态链接库对加密的程序进行解密;
优选的,解密代码包括使用接口DEXGetClassDef循环获取DEXFile结构ClassDef,使用GetStaticMethodID查找含有clinit方法的类,实现主动解密;优选的,所述实现主动解密方法为循环查找内存中Method结构被解密的代码,判断AccessFlags有无Native标志,若无,则表示已完成主动解密。
5.使用数学统计方法探测虚拟机是否恶意篡改,以防止破解者从内核层来逆向破解;没有被恶意篡改则通过DEXClassLoader动态加载apk文件;该数学统计方法可包括规律性统计或方差均化方式。
优选的,在步骤4中,只对需要的类进行解密并动态加载,没有用到的类还是以加密形式存在,等该类加载完成后再加密。这样即使程序被反编译,由于重要代码已经被隐藏在DEX文件中,并且已经被加密过,攻击者也不能获得关键信息。由于不存在完全被解密的原始的DEX文件,从而降低了APK安装文件被破解和反编译的风险。使得SO文件的源代码恢复为完整的、代码排序正确的、无加密的、可还原的代码。
本发明实施例提出的加固方法,通过将DEX文件反汇编得到中间文件,并将中间文件的相关指令进行加密处理,可以将相关指令保护起来,得到受保护的DEX文件,增加了程序逻辑的分析时间成本以及分析难度,提高了程序代码的安全性。
图2示出了根据本发明一个实施例的一种安卓应用程序防逆向破解的加固系统结构框图,该系统包括以下模块:
获取安装包单元:用于获取原始安卓安装包;
反向汇编单元:使用安卓安装包编译工具对安卓应用程序进行反向汇编,生成中间文件;
具体的,所述安卓安装包编译工具可为apktool或Baksmali反汇编器,所述中间文件为smali文件。将安卓应用中的DEX文件进行反汇编操作,从而在反编译工程目录下生成一个smali文件夹,里面存放着所有反编译出的smali文件,这些文件会根据程序包的层次结构生成相应的目录,程序中所有的类都会在相应的目录下生成独立的smali文件。
类构造器单元:遍历生成中间文件中的类,对需要加载的类设置对应的类构造器并对抽取出的中间文件进行加密并存储;
优选的,所述设置对应的类构造器包括:遍历smali文件中的类函数,确定那些类是需要执行的,自动添加<clinit>标记;当读到<clinit>标记时,表示要指引执行这段程序。
优选的,对文件加密包括:
对smali代码进行抽取操作,以生成空壳smali文件和入口地址文件;
对所述入口地址文件进行修改操作,以生成修改入口。
抽取加密单元:使用安卓安装包编译工具对上述设置了类构造器的中间文件进行汇编处理,重新编译成DEX文件。
具体的,使用已知的第三方汇编工具apktool或Smali汇编器将上述设置了类构造器的的smali文件重新编译成DEX文件,其中,汇编工具与反汇编工具应该是相互匹配的,如Smali和Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种DEX格式文件的汇编器和反汇编器。
优选的,还可以对重新编译的DEX进行加密。具体包括:加载DEX文件,解析DEX文件为DEX基础结构数据文件和字节码数据文件,调用davlik虚拟机函数openDEXFile以加载所述DEX基础结构数据文件。将DEX文件的Head,String Table,Type Table,Proto Table,Field Table,Method Table、Class Def Table,Data Section这几个部分进行分离,形成字节码数据文件,确定并读取各部分文件的偏移值。抽取DEX文件中的字节码数据,并存储到所述DEX函数实现字节码数据文件;使用对称加密算法对各字节码数据文件进行加密。加密算法可以是加密算法可以是利用常规的数据加密算法,如AES(Advanced EncryptionStandard,高级加密标准),对所述原始DEX文件进行加密处理,从而得到加密DEX文件。进一步地,还可以对所述原始DEX文件进行整体加密,如加密算法采用AES,签名算法采用RSA(公钥加密算法),摘要算法采用SHA1(Secure Hash Algorithm,安全哈希算法),也可以得到加密DEX文件。
加固单元,通过动态链接库对DEX文件进行加固。
优选的,所述加固单元包括:
解析单元:用于对SO文件进行格式分析以生成自定义格式;
抽取单元,用于对所述SO文件进行抽取操作,以生成抽取后的自定义格式;
加密单元,用于对所述自定义格式进行加密;
修改单元,用于对所述修改入口函数进行修改操作,以生成修改后入口;
保护代码单元,用于在加密后的自定义格式中嵌入保护代码;
嵌入单元,用于将加密并嵌入保护代码后的自定义格式嵌入到linker装载器里。
通常地,SO文件为动态链接库,本质是共享文件库,由C或C++语言编译出来的。在程序启动的时候首先加载该SO文件。并由该SO文件分别解密解压缩文件,并且调用openDEXFile加载DEX基础结构数据文件。并根据DEX函数实现字节码数据文件中的数据依次修复DEX基础结构数据文件每个函数的偏移,之后程序正常运行。
写入单元:将动态链接库写入空壳中间文件中,进而通过空壳程序文件进行加载运行。所述空壳程序文件为空壳smali文件。
优选的,所述空壳程序文件中还包括解密单元,所述解密单元包括:测试是否x86环境,如果是x86环境对x86虚拟机漏洞进行修复;检测是否是arm环境;对java运行环境进行检测,判断该运行环境是dvm模式还是art模式;当类需要装载的时候,调用clinit函数,通过clinit函数调用底层函数进而解密出代码,代码遍历采用红黑树算法进行优化,以达到O(lgn)级别的数据结构;使用数学统计方法探测虚拟机是否恶意篡改,以防止破解者从内核层来逆向破解。所述数学统计方法可包括规律性统计或方差均化方式。
同时,该解密流程通过判断虚拟机、arm、java环境来解决系统的兼容性。
图4示出了根据本发明另一个实施例的一种递进式解密方法的流程,
该解密流程进一步解决在不同安卓版本下对三星定制只读内存镜像的解密流程,该流程具体如下:
1.得到Android版本号,判断该版本是否是有漏洞的版本;
2.判断具有漏洞的版本是否是安卓3.0或安卓1.6;
3.如果是有漏洞版的,采用重写类函数以修复此漏洞;
4.测试是否是32位系统环境,如果是32位系统环境对32位系统虚拟机漏洞进行修复;
优选的,所述32位系统为X86,该虚拟机漏洞是smali指令集漏洞,对x86虚拟机漏洞进行修复,是在虚拟机中指令集解释层面的x86汇编,采用hook技术进行修复;
5.检测是否是arm环境;
6.对java运行环境进行检测,判断该运行环境是dvm模式还是art模式;优选的,可通过加载libart.SO或libdvm.SO来检测出java运行环境;
7.检测是否是三星定制只读内存镜像ROM;
优选的,因三星定制只读内存镜像ROM的装载DEX的偏移地址和原android版有根本的不同,进而判断是否是三星定制只读内存镜像ROM;
8.如果是三星定制只读内存镜像的话,对可执行文件DEX偏移地址进行修改,不是,则直接执行步骤9;
其中可修改DEX头中的checksum、signature、file_size、header_size、string_ids_off、type_ids_off、proto_ids_off、field_ids_off、method_ids_off、class_defs_off和data_off相关项。分析map_off数据,修改相关的数据偏移量。
9.当类需要装载的时候,调用clinit函数,通过clinit函数调用底层函数解密出代码,代码遍历采用红黑树算法进行优化,以达到O(lgn)级别的数据结构;
进一步地,解密代码包括使用接口DEXGetClassDef循环获取DEXFile结构ClassDef,使用GetStaticMethodID查找含有clinit方法的类,实现主动解密;进一步地,所述实现主动解密方法为循环查找内存中Method结构被解密的代码,判断AccessFlags有无Native标志,若无,则表示已完成主动解密。
10.使用数学统计方法探测虚拟机是否恶意篡改用于破解;该数学统计方法可包括规律性统计或方差均化方式。
其中在步骤9中,只对需要的类进行解密并动态加载,没有用到的类还是以加密形式存在,等该类加载完成后再加密。这样即使程序被反编译,由于重要代码已经被隐藏在DEX文件中,并且已经被加密过,攻击者也不能获得关键信息。由于不存在完全被解密的原始的DEX文件,从而降低了APK安装文件被破解和反编译的风险。该方法中解决了代码运行时,由于系统漏洞的问题导致崩溃的现象,极大提升了加固时的兼容性问题。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉该技术的人在本发明所揭露的技术范围内,可轻易想到的变化或替换,都应该涵盖在本发明保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。

Claims (12)

1.一种安卓应用程序防逆向破解的加固方法,包括以下步骤:
使用安卓安装包编译工具对安卓应用程序进行反向汇编,生成中间文件;
遍历生成中间文件中的类,对需要加载的类设置对应的类构造器;
抽取出除了类构造器和初始化函数之外的所有中间文件进行加密并存储,对所述中间文件进行抽取操作,生成空壳程序文件和入口地址文件,
调用动态链接库对可执行文件进行加固;以及
将加固文件写入空壳程序文件中;其中
所述设置对应的类构造器包括:遍历smali文件中的类函数,确定那些类是需要执行的,自动添加<clinit>标记;当读到<clinit>标记时,表示要指引执行这段程序。
2.根据权利要求1所述的方法,在抽取出除了类构造器和初始化函数之外的所有中间文件进行加密之前,还包括:使用安卓安装包编译工具对上述设置了类构造器的中间文件进行汇编处理,重新编译成可执行文件。
3.根据权利要求1所述的方法,对所述中间文件进行加密还包括:
对所述入口地址文件进行修改操作,生成修改入口。
4.根据权利要求1所述的方法,所述空壳程序文件中还包括解密流程,该解密流程包括:当类需要装载的时候,调用类构造器,通过类构造器调用底层函数进而解密出代码;使用数学统计方法探测虚拟机是否被恶意篡改。
5.根据权利要求4所述的方法,所述数学统计方法包括方差均化方式。
6.一种安卓应用程序防逆向破解的加固系统,包括以下单元:
获取安装包单元:用于获取原始安卓安装包;
反向汇编单元:利用安卓安装包编译工具对安卓应用程序反向汇编从而得到中间文件;
类构造器单元:遍历生成的中间文件中的类,对需要加载的类设置对应的类构造器;所述设置对应的类构造器包括:遍历smali文件中的类函数,确定那些类是需要执行的,自动添加<clinit>标记;当读到<clinit>标记时,表示要指引执行这段程序;
抽取加密单元:抽取出除了类构造器和初始化函数之外的所有中间文件进行加密并存储,对所述中间文件进行抽取操作,生成空壳程序文件和入口地址文件;
加固单元,调用动态链接库对可执行文件进行加固;以及
写入单元,用于将动态链接库写入空壳程序文件中。
7.根据权利要求6所述的系统,所述抽取加密单元在抽取出除了类构造器和初始化函数之外的所有中间文件进行加密之前,还包括:使用安卓安装包编译工具对上述设置了类构造器的中间文件进行汇编处理,重新编译成可执行文件。
8.根据权利要求6所述的系统,所述抽取加密单元还包括:
对所述入口地址文件进行修改操作,生成修改入口。
9.根据权利要求6所述的系统,所述空壳程序文件中还包括解密单元,该解密单元用于当类需要装载的时候,调用类构造器,通过类构造器调用底层函数进而解密出代码;使用数学统计方法探测虚拟机是否被恶意篡改。
10.根据权利要求9所述的系统,所述数学统计方法包括方差均化方式。
11.一种与权利要求1-5之一所述方法对应的空壳文件解密方法,包括以下步骤:
得到Android版本号,判断该版本是否是有漏洞的版本;
如果是有漏洞版的,采用重写类函数以修复此漏洞;
测试是否是32位系统环境,如果是32位系统环境对32位系统虚拟机漏洞进行修复;
检测是否是ARM处理器环境;
对java运行环境进行检测,判断该运行环境是DVM模式还是ART模式;
检测是否是三星定制只读内存镜像;
如果是三星定制只读内存镜像的话,对可执行文件偏移地址进行修改;
当类需要装载的时候,调用类构造器,通过类构造器调用底层函数进而解密出代码;
使用数学统计方法探测虚拟机是否被恶意篡改。
12.根据权利要求11所述的方法,所述判断具有漏洞的版本是android3.0或android1.6。
CN201611265457.0A 2016-12-30 2016-12-30 一种安卓应用程序防逆向破解的加固方法、系统及解密方法 Active CN106778103B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201611265457.0A CN106778103B (zh) 2016-12-30 2016-12-30 一种安卓应用程序防逆向破解的加固方法、系统及解密方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201611265457.0A CN106778103B (zh) 2016-12-30 2016-12-30 一种安卓应用程序防逆向破解的加固方法、系统及解密方法

Publications (2)

Publication Number Publication Date
CN106778103A CN106778103A (zh) 2017-05-31
CN106778103B true CN106778103B (zh) 2020-03-13

Family

ID=58951480

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201611265457.0A Active CN106778103B (zh) 2016-12-30 2016-12-30 一种安卓应用程序防逆向破解的加固方法、系统及解密方法

Country Status (1)

Country Link
CN (1) CN106778103B (zh)

Families Citing this family (25)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107480513B (zh) * 2017-08-17 2020-09-11 深信服科技股份有限公司 一种认证实现方法及装置、计算机装置、可读存储介质
CN107977553B (zh) * 2017-12-25 2020-07-10 中国电子产品可靠性与环境试验研究所 移动应用程序的安全加固的方法及装置
CN108491235B (zh) * 2018-03-21 2021-03-30 北京理工大学 结合动态加载和函数Native化的DEX保护方法
CN108733379B (zh) * 2018-05-28 2022-04-08 常熟理工学院 基于dex字节码抽离映射混淆的安卓应用加固方法
CN108846264A (zh) * 2018-06-11 2018-11-20 北京奇虎科技有限公司 代码加固方法、装置、智能终端和计算机可读存储介质
CN108959860B (zh) * 2018-07-20 2020-11-17 厦门市美亚柏科信息股份有限公司 一种检测Android系统是否被破解和破解记录获取方法
CN110210256B (zh) * 2018-08-07 2023-06-06 腾讯科技(深圳)有限公司 一种应用加固、加固应用启动方法、装置及服务器
CN109214148A (zh) * 2018-09-03 2019-01-15 平安普惠企业管理有限公司 一种dex文件抽取方法、系统及终端设备
CN109344577A (zh) * 2018-09-25 2019-02-15 四川大学 一种art下使用自修改技术进行软件保护的方法
CN109543369B (zh) * 2018-11-23 2022-03-25 杭州哲信信息技术有限公司 一种dex的保护方法
CN109840425B (zh) * 2019-01-22 2020-07-31 北京数科网维技术有限责任公司 一种文件加密的方法和装置
CN110175067B (zh) * 2019-03-05 2023-06-13 广东电网有限责任公司信息中心 一种移动应用立体防御方法和系统
CN110427757A (zh) * 2019-08-06 2019-11-08 南方电网科学研究院有限责任公司 一种Android漏洞检测方法、系统及相关装置
CN110610097A (zh) * 2019-09-09 2019-12-24 杭州天宽科技有限公司 一种基于安卓应用的文件传输保密系统
CN110765424B (zh) * 2019-10-22 2021-07-09 福州汇思博信息技术有限公司 一种android应用加固方法及计算机设备
CN110990056A (zh) * 2019-11-01 2020-04-10 北京三快在线科技有限公司 逆向分析方法、装置、电子设备及存储介质
CN111190604B (zh) * 2019-12-30 2023-11-03 航天信息股份有限公司 一种安卓应用内存混淆方法、装置、电子设备及介质
CN111274551B (zh) * 2019-12-30 2023-06-27 上海上讯信息技术股份有限公司 基于编译器的java代码保护方法、装置及电子设备
CN111967032B (zh) * 2020-08-27 2023-08-25 长城计算机软件与系统有限公司 基于混淆处理的文件加密方法及解密方法
CN112347431A (zh) * 2020-10-31 2021-02-09 山东开创云计算有限公司 Android应用加固保护方法
CN112671715B (zh) * 2020-12-03 2023-05-09 上海连尚网络科技有限公司 一种用于保障应用的数据安全通信的方法与装置
US11886584B2 (en) * 2021-05-28 2024-01-30 AO Kaspersky Lab System and method for detecting potentially malicious changes in applications
CN113934461B (zh) * 2021-09-26 2023-10-13 厦门亿联网络技术股份有限公司 一种基于dex的安卓系统格式化方法及其装置
CN113836582A (zh) * 2021-09-30 2021-12-24 西安诺瓦星云科技股份有限公司 软件加密及解密方法、装置、电子设备和存储介质
CN116522343B (zh) * 2023-07-05 2023-09-08 北京国御网络安全技术有限公司 一种Native函数防御攻击的方法及装置

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102945351A (zh) * 2012-11-05 2013-02-27 中国科学院软件研究所 云环境下基于二维码的移动智能终端安全漏洞修复方法
CN104484585A (zh) * 2014-11-26 2015-04-01 北京奇虎科技有限公司 一种应用程序安装包的处理方法、装置及移动设备
CN105740714A (zh) * 2016-02-01 2016-07-06 中国人民大学 一种Android平台修复系统库漏洞方法及装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102945351A (zh) * 2012-11-05 2013-02-27 中国科学院软件研究所 云环境下基于二维码的移动智能终端安全漏洞修复方法
CN104484585A (zh) * 2014-11-26 2015-04-01 北京奇虎科技有限公司 一种应用程序安装包的处理方法、装置及移动设备
CN105740714A (zh) * 2016-02-01 2016-07-06 中国人民大学 一种Android平台修复系统库漏洞方法及装置

Also Published As

Publication number Publication date
CN106778103A (zh) 2017-05-31

Similar Documents

Publication Publication Date Title
CN106778103B (zh) 一种安卓应用程序防逆向破解的加固方法、系统及解密方法
Sun et al. Taintart: A practical multi-level information-flow tracking system for android runtime
KR101471589B1 (ko) 공통중간언어 기반 프로그램을 위한 보안 제공 방법
Roundy et al. Binary-code obfuscations in prevalent packer tools
CN108229112B (zh) 一种保护应用程序、应用程序的运行方法以及装置
US8205096B2 (en) Software license embedded in shell code
KR101503785B1 (ko) 동적 라이브러리를 보호하는 방법 및 장치
EP1936532A1 (en) Obfuscating computer program code
WO2016078130A1 (zh) 一种防逆向apk文件的动态加载方法
US20170024230A1 (en) Method, apparatus, and computer-readable medium for ofuscating execution of an application on a virtual machine
CN104462959A (zh) 一种安卓应用的加固保护方法、服务器和系统
CN107430650B (zh) 保护计算机程序以抵御逆向工程
CN109255235B (zh) 基于用户态沙箱的移动应用第三方库隔离方法
WO2015192637A1 (zh) 软件安装包的加固保护方法和装置
CN107273723B (zh) 一种基于so文件加壳的Android平台应用软件保护方法
Shioji et al. Code shredding: byte-granular randomization of program layout for detecting code-reuse attacks
Li et al. AppSpear: Automating the hidden-code extraction and reassembling of packed android malware
CN108595950A (zh) 一种结合远程认证的sgx安全增强方法
Lim et al. Structural analysis of packing schemes for extracting hidden codes in mobile malware
El-Harake et al. Blocking advertisements on android devices using monitoring techniques
CN112134905B (zh) 基于安卓系统的签名方法、装置以及设备
CN107209815B (zh) 用于使用返回导向编程的代码混淆的方法
Abrath et al. Obfuscating windows dlls
Wan et al. Defending application cache integrity of android runtime
Jurczyk Detecting kernel memory disclosure with x86 emulation and taint tracking

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant