CN105956425A - 一种基于smali代码混淆的Android应用保护方法 - Google Patents
一种基于smali代码混淆的Android应用保护方法 Download PDFInfo
- Publication number
- CN105956425A CN105956425A CN201610279693.1A CN201610279693A CN105956425A CN 105956425 A CN105956425 A CN 105956425A CN 201610279693 A CN201610279693 A CN 201610279693A CN 105956425 A CN105956425 A CN 105956425A
- Authority
- CN
- China
- Prior art keywords
- smali
- instruction
- file
- dex
- executable file
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 43
- 230000006870 function Effects 0.000 claims description 13
- 230000008520 organization Effects 0.000 claims description 8
- 206010008190 Cerebrovascular accident Diseases 0.000 claims description 3
- 208000006011 Stroke Diseases 0.000 claims description 3
- 239000000284 extract Substances 0.000 claims description 3
- 239000000203 mixture Substances 0.000 claims description 2
- 230000003068 static effect Effects 0.000 abstract description 5
- 238000010586 diagram Methods 0.000 description 2
- 101100273916 Schizosaccharomyces pombe (strain 972 / ATCC 24843) wip1 gene Proteins 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
- G06F21/14—Protecting 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)
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于smali代码混淆的Android应用保护方法,针对Android中间语言smali进行混淆保护,不需要修改Android源码,不仅可以抵抗静态分析,而且反汇编之后的代码不正确,从而增加动态分析的难度。
Description
技术领域
本发明属于Android应用程序保护安全领域,涉及一种基于smali代码混淆的Android应用保护方法。
背景技术
NetMarketShare数据网站刚刚公布了2015年9月份智能手机操作系统的市场份额排名,Android继续保持领先,市场份额为82.8%。但是同时根据“天下无贼”信息诈骗联盟的报告指出:2015年下半年至今,仿冒支付类APP诈骗案件猖獗。该类APP伪装成支付软件,通过后台拦截验证码获取私密信息,“敲诈”、盗刷用户资金。开发商的知识产权和用户隐私都遭受严重的威胁,这一问题产生最主要的原因就是Android apk很容易通过逆向工程进行反编译,从而使其代码逻辑完全暴露给攻击者,使apk面临破解,软件逻辑修改,插入恶意代码,替换广告商ID等风险。
为了分析任何软件或者理解可执行文件,首先要做的就是逆向工作,针对逆向工程的保护比较有效的方法是代码混淆。代码混淆是一种用来隐藏程序意图的技术,可以增加代码阅读的难度,就是通过选择复杂、模糊但相等的语义去表示原程序,这样就隐藏了原程序的真实语义,软件的行为并没有被改变,使攻击者难以全面掌握app内部实现逻辑,从而增加逆向工程和破解的难度,防止知识产权被窃取。
目前对于Android应用混淆工作面临很大的挑战。已有的混淆方法主要有两个方面:一是信息的隐藏;它们隐藏meta信息,例如标识符和字符串或者对于控制流进行混淆。但是一个攻击者如果具有动态分析的能力,应用程序运行时所有的字节码还是在内存中的,很容易被dump下来,然后逆向还原,因此现有混淆方法不能抵抗动态分析。二是针对Java源码混淆,例如现存的混淆工具Apkprotect、Proguard等,还有现有文献中利用控制流平展和插入不透明谓词方法进行代码混淆,但一般Android应用程序开发商不太会给应用的源代码,只是给一个.apk文件,因此这种方法有很大的局限性,不适合所有的应用。
发明内容
针对上述现有技术中存在的问题或缺陷,本发明的目的在于,提供一种基于smali代码混淆的Android应用保护方法,能够抵抗静态和动态的分析。
一种基于smali代码混淆的Android应用保护方法,包括以下步骤:
步骤1,反编译待保护的应用UnProtect.apk,得到smali文件,针对smali文件中的指令进行混淆,得到混淆后的smali文件,对混淆后的smali文件重新编译形成可执行文件classes1.dex;
步骤2,在可执行文件classes1.dex中,提取被混淆的指令所在方法中的所有字节码,并将所有字节码存储在存储结构newcode中,将可执行文件classes1.dex中被混淆的指令所在方法中的所有字节码用0填充,形成一个新的可执行文件classes2.dex;
步骤3,利用动态加载技术加载可执行文件classes2.dex,从Android系统中的DexFile系统类中获取可执行文件classes2.dex的加载地址,根据加载地址,解析可执行文件classes2.dex获取被混淆的指令所在方法的内存地址,然后将存储在存储结构newcode中的字节码填充到内存地址的空间中;形成一个保护后的应用Protected.apk。
具体地,所述步骤1中的smali文件中的指令,指的是smali文件中,将两个数值型变量存储在两个相邻的寄存器中的两条指令,以及关键函数调用指令。
具体地,所述步骤1中,针对smali文件中的指令进行混淆的方法包括:
将两个数值型变量存储在两个相邻的寄存器中的指令进行混淆的方法为:将存储在两个相邻的寄存器中的两个32位的数值型变量存储成一个64位的数值型变量;
对关键函数调用指令进行混淆的方法为:在关键函数调用指令和其下一条指令之间插入不透明谓词。
与现有技术相比,本发明具有以下技术效果:本发明的方法针对Android中间语言smali进行混淆保护,不需要修改Android源码,不仅可以抵抗静态分析,而且反汇编之后的代码不正确,从而增加动态分析的难度。
下面结合附图和具体实施方式对本发明的方法做进一步详细地解释和说明。
附图说明
图1为本发明的方法流程图;
图2为Android虚拟机执行流程;
图3为经过混淆之后的可执行文件经过反汇编工具反汇编之后的代码和原来的Java源码的对比结果;
图4是存储结构newcode的示意图。
具体实施方式
遵从上述技术方案,参加图1,本发明的基于smali代码混淆的Android应用保护方法,包括以下步骤:
步骤1,反编译待保护的应用UnProtect.apk,得到smali文件,针对smali文件中的指令进行混淆,得到混淆后的smali文件,对混淆后的smali文件重新编译形成可执行文件classes1.dex。
所述smali文件中的指令指的是:smali文件中,将两个数值型变量存储在两个相邻的寄存器中的两条指令,以及关键函数调用指令;
对上述将两个数值型变量存储在两个相邻的寄存器中的两条指令进行混淆的方法为:将存储在两个相邻的寄存器中的两个32位的数值型变量存储成一个64位的数值型变量;例如:
将const-int v0,0x2和const-int v1,0x3
存储成const-wide v0,0x0000000300000002L
经过上述对数值型变量进行混淆后,当反汇编工具在反汇编时会将两个数值型变量反汇编成一个数值型变量,即出现错误的汇编结果。图3为经过混淆之后的可执行文件经过反汇编工具dextojar和jeb反汇编之后的代码和原来的Java源码的对比结果。
对上述关键函数调用指令进行混淆的方法为:关键函数调用指令用来调用子函数,当子函数调用完成后,下一条执行的指令是将子函数的返回值存储到寄存器中,在关键函数调用指令和其下一条指令之间插入不透明谓词。当反汇编引擎进行反汇编时就有可能不会取得正确的返回值。
步骤2,在可执行文件classes1.dex中,提取被混淆的指令所在方法中的所有字节码,并将所有字节码存储在存储结构newcode中,存储结构newcode如图4所示,将可执行文件classes1.dex中被混淆的指令所在方法中的所有字节码用0填充,将可执行文件new1.apk重新打包成新的可执行文件classes2.dex,以防止静态分析。
步骤3,利用动态加载技术加载可执行文件classes2.dex,从Android系统中的DexFile系统类中获取可执行文件classes2.dex的加载地址,根据加载地址,解析可执行文件classes2.dex获取被混淆的指令所在方法的内存地址,此内存地址即为存储字节码的地址,然后将存储在存储结构newcode中的字节码填充到内存地址的空间中;得到保护后的应用Protected.apk。
其中,利用动态加载技术加载可执行文件classes2.dex,需要先建立一个新的应用,当执行完步骤3后,此新的应用就形成一个保护后的应用Protected.apk。
本发明步骤2中得到的可执行文件文件classes2.dex无法通过图2中的dvmVerifyCodeFlow()函数对于指令合法性的验证,因此本发明采用步骤3的加载过程得到的应用Protected.apk就能够通过dvmVerifyCodeFlow()函数对于指令合法性的验证。
本发明根据Android系统对于可执行文件加载和运行时的特点,提出一种基于smali代码混淆的Android应用保护方法,可以有效的抵抗静态分析和动态分析。即使攻击者在程序执行时动态dump到可执行文件,但是他们对可执行文件进行反汇编之后的代码也是错误的,这样就会影响攻击者对于程序逻辑的理解。
Claims (3)
1.一种基于smali代码混淆的Android应用保护方法,其特征在于,包括以下步骤:
步骤1,反编译待保护的应用UnProtect.apk,得到smali文件,针对smali文件中的指令进行混淆,得到混淆后的smali文件,对混淆后的smali文件重新编译形成可执行文件classes1.dex;
步骤2,在可执行文件classes1.dex中,提取被混淆的指令所在方法中的所有字节码,并将所有字节码存储在存储结构newcode中,将可执行文件classes1.dex中被混淆的指令所在方法中的所有字节码用0填充,形成一个新的可执行文件classes2.dex;
步骤3,利用动态加载技术加载可执行文件classes2.dex,从Android系统中的DexFile系统类中获取可执行文件classes2.dex的加载地址,根据加载地址,解析可执行文件classes2.dex获取被混淆的指令所在方法的内存地址,然后将存储在存储结构newcode中的字节码填充到内存地址的空间中;形成一个保护后的应用Protected.apk。
2.如权利要求1所述的基于smali代码混淆的Android应用保护方法,其特征在于,所述步骤1中的smali文件中的指令,指的是smali文件中,将两个数值型变量存储在两个相邻的寄存器中的两条指令,以及关键函数调用指令。
3.如权利要求2所述的基于smali代码混淆的Android应用保护方法,其特征在于,所述步骤1中,针对smali文件中的指令进行混淆的方法包括:
将两个数值型变量存储在两个相邻的寄存器中的指令进行混淆的方法为:将存储在两个相邻的寄存器中的两个32位的数值型变量存储成一个64位的数值型变量;
对关键函数调用指令进行混淆的方法为:在关键函数调用指令和其下一条指令之间插入不透明谓词。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610279693.1A CN105956425B (zh) | 2016-04-28 | 2016-04-28 | 一种基于smali代码混淆的Android应用保护方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610279693.1A CN105956425B (zh) | 2016-04-28 | 2016-04-28 | 一种基于smali代码混淆的Android应用保护方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105956425A true CN105956425A (zh) | 2016-09-21 |
CN105956425B CN105956425B (zh) | 2018-07-24 |
Family
ID=56916476
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610279693.1A Expired - Fee Related CN105956425B (zh) | 2016-04-28 | 2016-04-28 | 一种基于smali代码混淆的Android应用保护方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105956425B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107871065A (zh) * | 2016-09-27 | 2018-04-03 | 武汉安天信息技术有限责任公司 | 一种Dalvik模式下dex文件的保护方法及装置 |
CN109687974A (zh) * | 2018-12-26 | 2019-04-26 | 努比亚技术有限公司 | Apk验证方法、装置、移动终端及可读存储介质 |
CN110457872A (zh) * | 2019-07-19 | 2019-11-15 | 西安理工大学 | 一种Android App应用资源的隐藏加固方法 |
CN112528241A (zh) * | 2020-11-27 | 2021-03-19 | 北京深思数盾科技股份有限公司 | 一种代码混淆方法、代码混淆器以及计算机可读存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103544414A (zh) * | 2013-10-25 | 2014-01-29 | 苏州通付盾信息技术有限公司 | 一种Android系统应用的深度代码混淆方法 |
US20140082729A1 (en) * | 2012-09-19 | 2014-03-20 | Estsecurity Co., Ltd. | System and method for analyzing repackaged application through risk calculation |
CN104866734A (zh) * | 2014-02-25 | 2015-08-26 | 北京娜迦信息科技发展有限公司 | 一种dex文件的保护方法及装置 |
-
2016
- 2016-04-28 CN CN201610279693.1A patent/CN105956425B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140082729A1 (en) * | 2012-09-19 | 2014-03-20 | Estsecurity Co., Ltd. | System and method for analyzing repackaged application through risk calculation |
CN103544414A (zh) * | 2013-10-25 | 2014-01-29 | 苏州通付盾信息技术有限公司 | 一种Android系统应用的深度代码混淆方法 |
CN104866734A (zh) * | 2014-02-25 | 2015-08-26 | 北京娜迦信息科技发展有限公司 | 一种dex文件的保护方法及装置 |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107871065A (zh) * | 2016-09-27 | 2018-04-03 | 武汉安天信息技术有限责任公司 | 一种Dalvik模式下dex文件的保护方法及装置 |
CN107871065B (zh) * | 2016-09-27 | 2019-12-20 | 武汉安天信息技术有限责任公司 | 一种Dalvik模式下dex文件的保护方法及装置 |
CN109687974A (zh) * | 2018-12-26 | 2019-04-26 | 努比亚技术有限公司 | Apk验证方法、装置、移动终端及可读存储介质 |
CN109687974B (zh) * | 2018-12-26 | 2023-10-17 | 努比亚技术有限公司 | Apk验证方法、装置、移动终端及可读存储介质 |
CN110457872A (zh) * | 2019-07-19 | 2019-11-15 | 西安理工大学 | 一种Android App应用资源的隐藏加固方法 |
CN110457872B (zh) * | 2019-07-19 | 2021-08-06 | 西安理工大学 | 一种Android App应用资源的隐藏加固方法 |
CN112528241A (zh) * | 2020-11-27 | 2021-03-19 | 北京深思数盾科技股份有限公司 | 一种代码混淆方法、代码混淆器以及计算机可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN105956425B (zh) | 2018-07-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101201883B (zh) | 基于虚拟机的软件保护方法 | |
CN103413073B (zh) | 一种保护java可执行程序的方法及设备 | |
CN105653905B (zh) | 一种基于api安全属性隐藏与攻击威胁监控的软件保护方法 | |
CN106462699A (zh) | 软件保护 | |
CN105956425A (zh) | 一种基于smali代码混淆的Android应用保护方法 | |
CN102667712A (zh) | 用于同时定义和实行访问控制和完整性策略的系统、方法和装置 | |
Yang et al. | Deepmal: maliciousness-preserving adversarial instruction learning against static malware detection | |
CN108491235A (zh) | 结合动态加载和函数Native化的DEX保护方法 | |
Mergendahl et al. | Cross-Language Attacks. | |
CN104881610B (zh) | 一种针对虚函数表劫持攻击的防御方法 | |
CN109313677A (zh) | 用于动态可执行验证的方法和装置 | |
CN106803040A (zh) | 病毒特征码处理方法及装置 | |
Bhansali et al. | A first look at code obfuscation for webassembly | |
Muntean et al. | Analyzing control flow integrity with LLVM-CFI | |
Lim et al. | An anti-reverse engineering technique using native code and obfuscator-LLVM for android applications | |
CN108763924B (zh) | 一种安卓应用程序中不可信第三方库访问权限控制方法 | |
Ismail et al. | Tightly Seal Your Sensitive Pointers with {PACTight} | |
Farhadi et al. | Chronicle of a Java Card death | |
Braghin et al. | Modeling and verification of smart contracts with Abstract State Machines | |
Lanet et al. | Memory forensics of a java card dump | |
Hogenboom et al. | Full memory attack on a Java Card | |
Mesbah et al. | Reverse engineering a Java Card memory management algorithm | |
Karger et al. | Lessons learned: Building the caernarvon high-assurance operating system | |
Kochberger et al. | Evaluation Methodologies in Software Protection Research | |
Bouffard et al. | Accessing secure information using export file fraudulence |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20180724 Termination date: 20200428 |