CN105740708A - 一种基于Java反射机制的安卓应用自动脱壳方法 - Google Patents

一种基于Java反射机制的安卓应用自动脱壳方法 Download PDF

Info

Publication number
CN105740708A
CN105740708A CN201610061008.8A CN201610061008A CN105740708A CN 105740708 A CN105740708 A CN 105740708A CN 201610061008 A CN201610061008 A CN 201610061008A CN 105740708 A CN105740708 A CN 105740708A
Authority
CN
China
Prior art keywords
territory
java
android
executable file
reflex mechanism
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.)
Pending
Application number
CN201610061008.8A
Other languages
English (en)
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.)
Boyawangxin (beijing) Technology Co Ltd
Peking University
Original Assignee
Boyawangxin (beijing) Technology Co Ltd
Peking 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 Boyawangxin (beijing) Technology Co Ltd, Peking University filed Critical Boyawangxin (beijing) Technology Co Ltd
Priority to CN201610061008.8A priority Critical patent/CN105740708A/zh
Publication of CN105740708A publication Critical patent/CN105740708A/zh
Pending legal-status Critical Current

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/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/566Dynamic detection, i.e. detection performed at run-time, e.g. emulation, suspicious activities
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/03Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
    • G06F2221/033Test or assess software

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Health & Medical Sciences (AREA)
  • General Health & Medical Sciences (AREA)
  • Virology (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明涉及一种基于Java反射机制的安卓应用自动脱壳方法,属于移动互联网网络安全技术领域,该方法相比AppSpear被动触发采用主动触发的模式保证DEX文件的完整性,相比dexhunter保证完整脱壳,dexhunter可以得到被保护的dex,但某些方法依然处于加密状态,而本发明通过收集所有解密操作并动态执行,使得所有方法都处于解密状态;此外,以上两种基于Android***源码开发的***对于***依赖强,需要针对不同版本***分别开发,难以扩展维护,本发明基于Java反射机制,轻量且在各版本Android***都适用。

Description

一种基于Java反射机制的安卓应用自动脱壳方法
技术领域
本发明属于移动互联网网络安全技术领域,具体涉及一种基于Java反射机制的安卓应用自动脱壳方法。
背景技术
Android开发者常常面临的一个问题就是防破解、防二次打包;现如今,安全问题越来越重要,越来越多的Android开发者也开始寻求安全的保护方案;为了加强APP安全性,越来越多的开发者选择APP加固方案对APP进行加固保护来防止二次打包(盗版)、数据篡改等风险;目前恶意代码往往也会采用加固技术对抗木马查杀,为了精确定位恶意代码,需要使用相应的脱壳技术。
现有技术中,AppSpear和DexHunter***都是基于Android***源码开发,其中AppSpear采用模拟人工点击应用以触发执行所有代码,同时通过记录所有执行过的指令来还原代码,可能导致有些代码没有触发从而无法恢复;而DexHunter采用主动触发所有代码,在代码即将执行前一刻进行收集,在对抗某些加固技术是可行的,但是在对抗像百度加固这样只有真正执行代码之后才进行还原的是无法恢复完整的代码。
发明内容
针对现有技术的不足,本发明提出一种基于Java反射机制的安卓应用自动脱壳方法,以达到保证DEX文件的完整性和完整脱壳的目的。
一种基于Java反射机制的安卓应用自动脱壳方法,包括以下步骤:
步骤1、定位内存中的安卓应用可执行文件;
步骤2、确定上述可执行文件中所有需要被转存的类的类型描述符,并利用java的反射机制获取所有类所声明的域和方法,并进一步获取域和方法的信息;
步骤3、从可执行文件中获取所有已知的解密方法及其参数,并利用java的反射机制进行动态调用,实时对处于加密状态下的域和方法信息进行解密;
步骤4、根据解密后的域和方法重写可执行文件,完成安卓应用的自动脱壳。
步骤1所述的定位内存中的安卓应用可执行文件,具体为:从Dalvik虚拟机运行时保存的全局变量中获取。
步骤2所述的域和方法的信息,具体为:域的信息包括:名称、类型、标志符和值;方法的信息包括:名称、返回值类型、参数类型、访问标志和代码地址。
步骤3所述的从可执行文件中获取所有已知的解密方法及其参数,具体为:通过构造控制流图的方式并采用到达定值算法获取。
本发明优点:
本发明提出一种基于Java反射机制的安卓应用自动脱壳方法,该方法相比AppSpear被动触发采用主动触发的模式保证DEX文件的完整性,相比dexhunter保证完整脱壳,dexhunter可以得到被保护的dex,但某些方法依然处于加密状态,而本发明通过收集所有解密操作并动态执行,使得所有方法都处于解密状态;此外,以上两种基于Android***源码开发的***对于***依赖强,需要针对不同版本***分别开发,难以扩展维护,本发明基于Java反射机制,轻量且在各版本Android***都适用。
附图说明
图1为本发明一种实施例的基于Java反射机制的安卓应用自动脱壳方法流程图;
图2为本发明一种实施例的基于Java反射机制的安卓应用自动脱壳过程示意图。
具体实施方式
下面结合附图对本发明一种实施例做进一步说明。
本发明实施例中,如图1和图2所示,基于Java反射机制的安卓应用自动脱壳方法,包括以下步骤:
步骤1、定位内存中的安卓应用可执行文件;
Android加固技术通常会采用多种方案进行DEX隐藏(e.g.擦除DEX头部标识),但Dalvik虚拟机运行时***将会把所有已经加载到内存的DEX文件保存在一个全局变量gDvm里;本发明实施例通过dlopen、dlsym函数动态加载libdvm.so,并获取到全局变量gDvm的地址,通过这个结构最终获取到pDexFile,即已加载DEX内存地址;
步骤2、确定上述可执行文件中所有需要被转存的类的类型描述符,并利用java的反射机制获取所有类所声明的域和方法,并进一步获取域和方法的信息;具体步骤如下:
步骤2-1、确定可执行文件中所有需要被转存的类的类型描述符;
通过第一步收集的pDexFile结构中的pClassdef指针定位到所有的类,针对每一项,本发明实施例通过DEX文件结构找到每个类的类型描述符,即通过DEX文件中的类数据区域找到每个类的类型索引(class_idx),通过该索引可以在DEX文件中的类型数据区域中找到对应的描述符索引(descriptor_idx),再通过描述符索引可以在DEX文件中的字符串数据区域中找到指向类型描述符的指针(string_data_off),最终获取到类型描述符(类型描述符的格式为“L包名/类名;”,如Lcom/test/Class;);
步骤2-2、利用java的反射机制获取所有类所声明的域和方法;
通过类型描述符,本发明实施例使用Java反射机制来动态调用指定类(如loadClass/FindClass),此外针对每个动态获取的类,Java提供getDeclaredFields、getDeclaredMethods、getDeclaredConstructors等函数接口获取到所有该类声明的域和方法(即获取到数据结构Field和Method);
以下内容为一个类的代码:
本发明实施例通过类型描述符和Java反射机制动态获取到该类之后,通过上述三个函数可以获取到的域/成员变量包括“str”和“cwt”,获取到的成员方法有“main”;
步骤2-3、获取域和方法的信息;
本发明实施例中,类中的每个域需要收集的信息有名称、类型(包括整数、浮点数等)、标志符和值;上述信息分别通过Field.getName、Field.getType、Field.getModifiers和Field.getxxx函数(如Field.getInt函数,依域的类型决定)获取;
例如:步骤2-2中获取了“cwt”的数据结构Field,那么通过Field.getName得到这个域的变量名“cwt”,通过Field.getType得到这个域的类型“int”,通过Field.getModifiers得到标志符“public”,通过Field.getInt得到值为“10”;
本发明实施例中,类中的每个方法需要收集的信息有名称、返回值类型、参数类型、访问标志和代码地址,上述信息的前四项的获取与方法的类型有关;
若是构造函数(即通过getDeclaredConstructors函数获取的方法),名称固定为“<init>”,返回值类型固定为“V”,参数类型通过Constructor.getParameterTypes函数获取,访问标志通过Constructor.getModifiers函数获取;
若是普通函数(即通过getDeclaredMethods函数获取的方法),前四项分别通过Method.getName,Method.getReturenType,Method.getParameterTypes,Method.getModifiers函数获取;
本发明实施例中,代码地址的获取需要借用Java的JNI机制,通过JNI(getmethodID)获取到一个隐形结构jmethodID,实际上等价于Java中的Method结构,而这个结构有一个重要的成员变量insns,指向代码地址。
例如:步骤2-2中获取了“main”方法的数据结构Method,这是一个普通函数,则通过Method.getName函数获取到函数名“main”,通过Method.getReturenType函数获取的返回值为“Void”,通过Method.getParameterTypes函数获取到参数类型为“String[]”,通过Method.getModifiers函数获取到访问标志“publicstatic”;
步骤3、从可执行文件中获取所有已知的解密方法及其参数,并利用java的反射机制进行动态调用,实时对处于加密状态下的域和方法信息进行解密;
由于加固技术可能采用边解密边执行的技术,本发明实施例中,还需要从代码中抽取出解密函数并动态调用执行,由于这类函数容易识别,例如以下的代码:
由以上代码可知,当第一次进行脱壳实验时并不能确定解密函数,但依然能够获取到。其中A.d是解密函数,A.e是加密函数,onCreate001函数是被保护的代码,其中代码已经被无效指令NOP进行填充,显示是加密之后的代码,当程序在onCreate函数中想要调用onCreate001函数时,首先调用A.d函数对其进行解密操作,当调用完成后,又执行A.e进行加密操作,因而可以轻易看出只要调用了A.d函数就可以得到正确的代码,A.d函数就是想要获取的解密函数的名称;
本发明实施例中,直接将已知的函数写入配置文件中;并对每个函数代码进行扫描匹配判断是否存在已知解密函数;如果存在,对含有解密函数的方法代码构造控制流图,并使用到达定值算法抽取参数值,上述的解密方法A.d,它有一个类型为字符串的参数“Lcom/cc/test/MainActivity;->onCreate001(Landroid/os/Bundle;)V”,由于这个参数在不同地方是不一样的,因此需要分别获取;然后通过Java反射机制动态调用。
所述的到达定值算法是现有技术中常见算法,具体算法如下:
在到达定值问题中对于给定的基本块S数据流等式如下:
REACHin[S]=Up∈pred[s]REACHout[p](1)
REACHout[S]=GEN[S]∪(REACHin[S]-KILL[S])(2)
其中,pred[S]表示包含在数据流图中S的全部前继基本块;REACHin[S]表示对于给定基本块S入口处的定值集合,REACHout[p]表示对于基本块P出口处的定值集合;
REACHout[S]表示对于给定基本块S出口处的定值集合,本发明实施例中定义GEN[S]和KILL[S]集合如下:
GEN[d:y←f(x1,...,xn)]={d}(3)
KILL[d:y←f(x1,...,xn)]=DEFS[y]-{d}(4)
其中,DEFS[y]表示对变量y赋值的所有定值的集合,d是该赋值指令独一无二的标签;本发明实施例使用这些指令标签来表示到达定值。y←f(x1,...,xn)表示对变量y的任意赋值语句。
本发明实施例中,到达定值算法如以下代码所示:
输入:控制流程图,每个基本块的KILL和GEN集合
输出:每个基本块的REACHin和REACHout集合(入口点和出口点的定值集合)
该算法展示了计算每个基本块入口点和出口点的定值的集合的方法。之后扫描每个包含指定解密函数的基本块,通过入口点的定值集合以及DEF和KILL集合获取解密函数的参数。
步骤4、根据解密后的域和方法重写可执行文件,完成安卓应用的自动脱壳。
本发明实施例中,通过第二步收集的信息我们可以使用baksmali工具将其转换成samli语言,之后再通过samli工具重新生成DEX文件。

Claims (4)

1.一种基于Java反射机制的安卓应用自动脱壳方法,其特征在于,包括以下步骤:
步骤1、定位内存中的安卓应用可执行文件;
步骤2、确定上述可执行文件中所有需要被转存的类的类型描述符,并利用java的反射机制获取所有类所声明的域和方法,并进一步获取域和方法的信息;
步骤3、从可执行文件中获取所有已知的解密方法及其参数,并利用java的反射机制进行动态调用,实时对处于加密状态下的域和方法信息进行解密;
步骤4、根据解密后的域和方法重写可执行文件,完成安卓应用的自动脱壳。
2.根据权利要求1所述的基于Java反射机制的安卓应用自动脱壳方法,其特征在于,步骤1所述的定位内存中的安卓应用可执行文件,具体为:从Dalvik虚拟机运行时保存的全局变量中获取。
3.根据权利要求1所述的基于Java反射机制的安卓应用自动脱壳方法,其特征在于,步骤2所述的域和方法的信息,具体为:域的信息包括:名称、类型、标志符和值;方法的信息包括:名称、返回值类型、参数类型、访问标志和代码地址。
4.根据权利要求1所述的基于Java反射机制的安卓应用自动脱壳方法,其特征在于,步骤3所述的从可执行文件中获取所有已知的解密方法及其参数,具体为:通过构造控制流图的方式并采用到达定值算法获取。
CN201610061008.8A 2016-01-28 2016-01-28 一种基于Java反射机制的安卓应用自动脱壳方法 Pending CN105740708A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610061008.8A CN105740708A (zh) 2016-01-28 2016-01-28 一种基于Java反射机制的安卓应用自动脱壳方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610061008.8A CN105740708A (zh) 2016-01-28 2016-01-28 一种基于Java反射机制的安卓应用自动脱壳方法

Publications (1)

Publication Number Publication Date
CN105740708A true CN105740708A (zh) 2016-07-06

Family

ID=56246776

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610061008.8A Pending CN105740708A (zh) 2016-01-28 2016-01-28 一种基于Java反射机制的安卓应用自动脱壳方法

Country Status (1)

Country Link
CN (1) CN105740708A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108446186A (zh) * 2018-01-30 2018-08-24 国家计算机网络与信息安全管理中心 从加壳Android应用程序中恢复Dex源文件的方法
WO2021248315A1 (zh) * 2020-06-09 2021-12-16 深圳市欢太科技有限公司 一种脱壳处理方法、装置、设备及存储介质

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103530535A (zh) * 2013-10-25 2014-01-22 苏州通付盾信息技术有限公司 一种Android平台应用程序保护的加脱壳方法
US20140150096A1 (en) * 2012-11-26 2014-05-29 Electronics And Telecommunications Research Institute Method for assuring integrity of mobile applications and apparatus using the method
CN103886230A (zh) * 2014-02-24 2014-06-25 四川长虹电器股份有限公司 android***的软件版权保护方法及其***
CN103902858A (zh) * 2013-12-25 2014-07-02 武汉安天信息技术有限责任公司 一种apk应用加固的方法及***
KR20140114769A (ko) * 2013-03-15 2014-09-29 주식회사 에스이웍스 안드로이드에서의 dex파일 바이너리 난독화 방법
CN104102860A (zh) * 2014-08-11 2014-10-15 北京奇虎科技有限公司 安卓平台应用程序的保护方法、运行方法、装置及***
CN104318155A (zh) * 2014-11-18 2015-01-28 刘鹏 一种防逆向apk文件的动态加载方法
CN104408337A (zh) * 2014-11-18 2015-03-11 刘鹏 一种apk文件防逆向的加固方法
CN104866739A (zh) * 2015-06-04 2015-08-26 上海斐讯数据通信技术有限公司 安卓***中应用程序加密方法及***

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20140150096A1 (en) * 2012-11-26 2014-05-29 Electronics And Telecommunications Research Institute Method for assuring integrity of mobile applications and apparatus using the method
KR20140114769A (ko) * 2013-03-15 2014-09-29 주식회사 에스이웍스 안드로이드에서의 dex파일 바이너리 난독화 방법
CN103530535A (zh) * 2013-10-25 2014-01-22 苏州通付盾信息技术有限公司 一种Android平台应用程序保护的加脱壳方法
CN103902858A (zh) * 2013-12-25 2014-07-02 武汉安天信息技术有限责任公司 一种apk应用加固的方法及***
CN103886230A (zh) * 2014-02-24 2014-06-25 四川长虹电器股份有限公司 android***的软件版权保护方法及其***
CN104102860A (zh) * 2014-08-11 2014-10-15 北京奇虎科技有限公司 安卓平台应用程序的保护方法、运行方法、装置及***
CN104318155A (zh) * 2014-11-18 2015-01-28 刘鹏 一种防逆向apk文件的动态加载方法
CN104408337A (zh) * 2014-11-18 2015-03-11 刘鹏 一种apk文件防逆向的加固方法
CN104866739A (zh) * 2015-06-04 2015-08-26 上海斐讯数据通信技术有限公司 安卓***中应用程序加密方法及***

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108446186A (zh) * 2018-01-30 2018-08-24 国家计算机网络与信息安全管理中心 从加壳Android应用程序中恢复Dex源文件的方法
CN108446186B (zh) * 2018-01-30 2022-05-13 国家计算机网络与信息安全管理中心 从加壳Android应用程序中恢复Dex源文件的方法
WO2021248315A1 (zh) * 2020-06-09 2021-12-16 深圳市欢太科技有限公司 一种脱壳处理方法、装置、设备及存储介质

Similar Documents

Publication Publication Date Title
Iqbal et al. Adgraph: A graph-based approach to ad and tracker blocking
Chang et al. sCompile: Critical path identification and analysis for smart contracts
CN106203120B (zh) 一种针对Android加固应用的多点Hook逆向方法
Musch et al. New Kid on the Web: A Study on the Prevalence of WebAssembly in the Wild
Deng et al. iris: Vetting private api abuse in ios applications
US9747447B2 (en) Suspicious program detection
CN104346148B (zh) 获取程序性能消耗信息的方法、装置及***
Lu et al. DeepAutoD: Research on distributed machine learning oriented scalable mobile communication security unpacking system
CN114266050B (zh) 一种跨平台恶意软件对抗样本生成方法及***
Yue et al. RepDroid: an automated tool for Android application repackaging detection
Cho et al. Anti-debugging scheme for protecting mobile apps on android platform
US20140123283A1 (en) Detection of heap spraying by flash with an actionscript emulator
Kim et al. Risk assessment of mobile applications based on machine learned malware dataset
Araujo et al. Compiler-instrumented, Dynamic {Secret-Redaction} of Legacy Processes for Attacker Deception
Wang et al. FSFC: An input filter-based secure framework for smart contract
US20140122052A1 (en) Detection of jit spraying by flash with an actionscript emulator
Bouffard et al. Reversing the operating system of a Java based smart card
CN105740708A (zh) 一种基于Java反射机制的安卓应用自动脱壳方法
CN108763924A (zh) 一种安卓应用程序中不可信第三方库访问权限控制方法
Singh et al. Parallel chopped symbolic execution
Wang et al. Trust beyond border: lightweight, verifiable user isolation for protecting in-enclave services
CN107066886A (zh) 一种Android加固脱壳的检测方法
US20140123282A1 (en) Unpacking flash exploits with an actionscript emulator
CN109214184B (zh) 一种Android加固应用程序通用自动化脱壳方法和装置
CN113672908A (zh) 定点插桩方法、相关装置及***

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
WD01 Invention patent application deemed withdrawn after publication
WD01 Invention patent application deemed withdrawn after publication

Application publication date: 20160706