CN105740708A - 一种基于Java反射机制的安卓应用自动脱壳方法 - Google Patents
一种基于Java反射机制的安卓应用自动脱壳方法 Download PDFInfo
- 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
Links
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/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/566—Dynamic detection, i.e. detection performed at run-time, e.g. emulation, suspicious activities
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test 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反射机制的安卓应用自动脱壳方法。
背景技术
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所述的从可执行文件中获取所有已知的解密方法及其参数,具体为:通过构造控制流图的方式并采用到达定值算法获取。
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)
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)
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 | 上海斐讯数据通信技术有限公司 | 安卓***中应用程序加密方法及*** |
-
2016
- 2016-01-28 CN CN201610061008.8A patent/CN105740708A/zh active Pending
Patent Citations (9)
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)
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 |