CN105956425B - 一种基于smali代码混淆的Android应用保护方法 - Google Patents

一种基于smali代码混淆的Android应用保护方法 Download PDF

Info

Publication number
CN105956425B
CN105956425B CN201610279693.1A CN201610279693A CN105956425B CN 105956425 B CN105956425 B CN 105956425B CN 201610279693 A CN201610279693 A CN 201610279693A CN 105956425 B CN105956425 B CN 105956425B
Authority
CN
China
Prior art keywords
instruction
dex
executable file
smali
obscured
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.)
Expired - Fee Related
Application number
CN201610279693.1A
Other languages
English (en)
Other versions
CN105956425A (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.)
Northwest University
Original Assignee
Northwest University
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 Northwest University filed Critical Northwest University
Priority to CN201610279693.1A priority Critical patent/CN105956425B/zh
Publication of CN105956425A publication Critical patent/CN105956425A/zh
Application granted granted Critical
Publication of CN105956425B publication Critical patent/CN105956425B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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)
  • Stored Programmes (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种基于smali代码混淆的Android应用保护方法,针对Android中间语言smali进行混淆保护,不需要修改Android源码,不仅可以抵抗静态分析,而且反汇编之后的代码不正确,从而增加动态分析的难度。

Description

一种基于smali代码混淆的Android应用保护方法
技术领域
本发明属于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 (1)

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;
所述步骤1中的smali文件中的指令,指的是smali文件中,将两个数值型变量存储在两个相邻的寄存器中的两条指令,以及关键函数调用指令;
所述步骤1中针对smali文件中的指令进行混淆的方法包括:
将两个数值型变量存储在两个相邻的寄存器中的指令进行混淆的方法为:将存储在两个相邻的寄存器中的两个32位的数值型变量存储成一个64位的数值型变量;
对关键函数调用指令进行混淆的方法为:在关键函数调用指令和其下一条指令之间插入不透明谓词。
CN201610279693.1A 2016-04-28 2016-04-28 一种基于smali代码混淆的Android应用保护方法 Expired - Fee Related CN105956425B (zh)

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 CN105956425A (zh) 2016-09-21
CN105956425B true 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)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107871065B (zh) * 2016-09-27 2019-12-20 武汉安天信息技术有限责任公司 一种Dalvik模式下dex文件的保护方法及装置
CN109687974B (zh) * 2018-12-26 2023-10-17 努比亚技术有限公司 Apk验证方法、装置、移动终端及可读存储介质
CN110457872B (zh) * 2019-07-19 2021-08-06 西安理工大学 一种Android App应用资源的隐藏加固方法
CN112528241B (zh) * 2020-11-27 2021-09-14 北京深思数盾科技股份有限公司 一种代码混淆方法、代码混淆器以及计算机可读存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103544414A (zh) * 2013-10-25 2014-01-29 苏州通付盾信息技术有限公司 一种Android系统应用的深度代码混淆方法
CN104866734A (zh) * 2014-02-25 2015-08-26 北京娜迦信息科技发展有限公司 一种dex文件的保护方法及装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101402057B1 (ko) * 2012-09-19 2014-06-03 주식회사 이스트시큐리티 위험도 계산을 통한 리패키지 애플리케이션의 분석시스템 및 분석방법

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103544414A (zh) * 2013-10-25 2014-01-29 苏州通付盾信息技术有限公司 一种Android系统应用的深度代码混淆方法
CN104866734A (zh) * 2014-02-25 2015-08-26 北京娜迦信息科技发展有限公司 一种dex文件的保护方法及装置

Also Published As

Publication number Publication date
CN105956425A (zh) 2016-09-21

Similar Documents

Publication Publication Date Title
van der Veen et al. The dynamics of innocent flesh on the bone: Code reuse ten years later
Banescu et al. A tutorial on software obfuscation
Zhang et al. VTrust: Regaining Trust on Virtual Calls.
Younan et al. PAriCheck: an efficient pointer arithmetic checker for C programs
Göktas et al. Position-independent code reuse: On the effectiveness of aslr in the absence of information disclosure
CN105956425B (zh) 一种基于smali代码混淆的Android应用保护方法
CN105653905B (zh) 一种基于api安全属性隐藏与攻击威胁监控的软件保护方法
CN105512521A (zh) 一种软件安装包的加固保护方法和系统
Rivera et al. Keeping safe rust safe with galeed
CN101866406A (zh) 一种栈溢出攻击防御方法
Chen et al. JITSafe: a framework against Just‐in‐time spraying attacks
Mergendahl et al. Cross-Language Attacks.
Follner et al. PSHAPE: automatically combining gadgets for arbitrary method execution
CN108763924B (zh) 一种安卓应用程序中不可信第三方库访问权限控制方法
Hamadouche et al. Subverting byte code linker service to characterize java card api
Bouffard et al. Reversing the operating system of a Java based smart card
Ismail et al. Tightly Seal Your Sensitive Pointers with {PACTight}
Kilic et al. Blind format string attacks
Razafindralambo et al. A dynamic syntax interpretation for java based smart card to mitigate logical attacks
Lanet et al. Memory forensics of a java card dump
EP3574425B1 (en) Method to secure a software code
Hogenboom et al. Full memory attack on a Java Card
CN102855439A (zh) 一种执行文件自校验方法及装置
Deng et al. A Pattern-Based Software Testing Framework for Exploitability Evaluation of Metadata Corruption Vulnerabilities
Mesbah et al. Reverse engineering a Java Card memory management algorithm

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