CN108255496B - 一种获取安卓应用原生层代码的方法、系统及相关装置 - Google Patents
一种获取安卓应用原生层代码的方法、系统及相关装置 Download PDFInfo
- Publication number
- CN108255496B CN108255496B CN201810053720.2A CN201810053720A CN108255496B CN 108255496 B CN108255496 B CN 108255496B CN 201810053720 A CN201810053720 A CN 201810053720A CN 108255496 B CN108255496 B CN 108255496B
- Authority
- CN
- China
- Prior art keywords
- code
- initialization function
- decompilation
- target
- target application
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/53—Decompilation; Disassembly
-
- 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/562—Static detection
- G06F21/563—Static detection by source code analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/74—Reverse engineering; Extracting design information from source code
-
- 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)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Health & Medical Sciences (AREA)
- General Health & Medical Sciences (AREA)
- Virology (AREA)
- Storage Device Security (AREA)
- Telephone Function (AREA)
Abstract
本申请公开了一种获取安卓应用原生层代码的方法,从所有安卓应用正常运行时均需使用的Linker入手,准确率高;利用反编译技术结合预设的关键字符串确定其中包含的初始化函数,以最终判定是否调用了该初始化函数对加密代码进行解密,在解密完整后立即执行DUMP操作,能够在目标应用执行反DUMP操作和二次加密之前提前截取到解密后代码,充分利用了恶意应用本身的加密代码自解密过程,无需人工解密,能够显著提升解密后代码获取效率。本申请还同时公开了一种获取安卓应用原生层代码的系统、装置及计算机可读存储介质,具有上述有益效果。
Description
技术领域
本申请涉及应用运行代码获取技术领域,特别涉及一种获取安卓应用原生层代码的方法、系统、装置及计算机可读存储介质。
背景技术
自Android(又被称为安卓)系统诞生以来,软件安全问题一直被广大开发者所诟病,一方面,许多辛苦开发得到的应用通过逆向工程破解得到源代码,并二次封装和打包;另一方面,许多简单的病毒木马的内部代码逻辑也易被病毒分析人员简单获取,出现存活率低,难以逃过杀毒软件拦截等问题。
在此背景下,部分病毒开发者通过将内代码逻辑从易被逆向工程反编译破解的java层移到原生层,并对代码进行高强度加密与混淆,以此达到提高病毒分析人员手动分析代码逻辑的难度,拖延被分析扼杀的时间来将病毒进行变种传播,甚至完全瞒过分析人员以达到长期生存的目的。
除常规的自动化检测之外,仍需要手动对部分使用加密技术后变得难以进行恶意应用判断的应用进行手动分析,业界现今是使用Linux系统自带的dd指令(该指令作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换)在目标应用运行时将解密后的代码DUMP(将软件进程中的内存镜像,即内存数据拷贝出来的一种操作)出来,该方法能够在一定程度上帮助恶意应用分析人员获取到解密后代码,但由于此种技术获取解密后代码的时机不够早,在面对某些会执行反dump操作或在运行后对代码又进行了二次加密的恶意应用时非常无力。
所以,如何克服现有原生层解密后代码获取方法存在的各项技术缺陷,提供一种更科学、更快速、从恶意应用运行过程出发、效率更高、解密后代码获取更精准的安卓应用原生层代码方法是本领域技术人员亟待解决的问题。
发明内容
本申请的目的是提供一种获取安卓应用原生层代码的方法,从所有安卓应用正常运行时均需使用的Linker入手,准确率高;利用反编译技术结合预设的关键字符串确定其中包含的初始化函数,以最终判定是否调用了该初始化函数对加密代码进行解密,在解密完整后立即执行DUMP操作,能够在目标应用执行反DUMP操作和二次加密之前提前截取到解密后代码,充分利用了恶意应用本身的加密代码自解密过程,无需人工解密,能够显著提升解密后代码获取效率。
本申请的另一目的在于提供了一种获取安卓应用原生层代码的系统、装置及计算机可读存储介质。
为实现上述目的,本申请提供一种获取安卓应用原生层代码的方法,该方法包括:
将运行目标应用的Linker中的内容利用反编译技术执行反编译操作,得到反编译结果;
在所述反编译结果中检索预设关键字符串,并定位得到初始化函数;
当所述目标应用调用所述初始化函数对加密代码进行解密并解密完成后,对解密后代码执行DUMP操作,得到解密后代码。
可选的,将运行目标应用的Linker中的内容利用反编译技术执行反编译操作,得到反编译结果,包括:
提取所述目标应用正常运行调用的Linker;
将所述Linker放入IDA中执行所述反编译操作,得到所述反编译结果。
可选的,在所述反编译结果中检索预设关键字符串,并定位得到初始化函数,包括:
在所述反编译结果中检索所述预设关键字符串,得到第一目标位置;
在所述第一目标位置的预设范围内查找调用所述初始化函数的汇编代码,得到第二目标位置。
可选的,在得到第二目标位置之后,还包括:
在所述第二目标位置处设置断点以使所述目标应用在所述断点处持续循环直至所述加密代码解密完成。
可选的,对解密后代码执行DUMP操作,得到解密后代码,包括:
利用所述IDA中的预设执行脚本获取所述解密后代码;
将所述解密后代码发送至预设路径下。
为实现上述目的,本申请还提供了一种获取Android应用原生层代码的系统,该系统包括:
反编译处理单元,用于将运行目标应用的Linker中的内容利用反编译技术执行反编译操作,得到反编译结果;
关键字符串检索及初始化函数定位单元,用于在所述反编译结果中检索预设关键字符串,并定位得到初始化函数;
DUMP操作执行单元,用于在所述目标应用调用所述初始化函数对加密代码进行解密并解密完成时,对解密后代码执行DUMP操作,得到解密后代码。
可选的,所述反编译处理单元包括:
Linker提取子单元,用于提取所述目标应用正常运行调用的Linker;
IDA反编译执行子单元,用于将所述Linker放入IDA中执行所述反编译操作,得到所述反编译结果。
可选的,所述关键字符串检索及初始化函数定位单元包括:
关键字符串检索子单元,用于在所述反编译结果中检索所述预设关键字符串,得到第一目标位置;
初始化函数位置确定子单元,用于在所述第一目标位置的预设范围内查找调用所述初始化函数的汇编代码,得到第二目标位置。
为实现上述目的,本申请还提供了一种获取Android应用原生层代码的装置,该装置包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序时实现如上述内容所描述的获取Android应用原生层代码的方法的步骤。
为实现上述目的,本申请还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上述内容所描述的获取Android应用原生层代码的方法的步骤。
本申请所提供的一种获取安卓应用原生层代码的方法:将运行目标应用的Linker中的内容利用反编译技术执行反编译操作,得到反编译结果;在所述反编译结果中检索预设关键字符串,并定位得到初始化函数;当所述目标应用调用所述初始化函数对加密代码进行解密并解密完成后,对解密后代码执行DUMP操作,得到解密后代码。
显然,本申请所提供的技术方案,从所有安卓应用正常运行时均需使用的Linker入手,准确率高;利用反编译技术结合预设的关键字符串确定其中包含的初始化函数,以最终判定是否调用了该初始化函数对加密代码进行解密,在解密完整后立即执行DUMP操作,能够在目标应用执行反DUMP操作和二次加密之前提前截取到解密后代码,充分利用了恶意应用本身的加密代码自解密过程,无需人工解密,能够显著提升解密后代码获取效率。本申请同时还提供了一种获取安卓应用原生层代码的系统、装置及计算机可读存储介质,具有上述有益效果,在此不再赘述。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请实施例所提供的一种获取安卓应用原生层代码的方法的流程图;
图2为本申请实施例所提供的另一种获取安卓应用原生层代码的方法的流程图;
图3为本申请实施例所提供的一种获取安卓应用原生层代码的系统的结构框图。
具体实施方式
鉴于现有的解密后代码获取方式无法实现精准获取解密后代码的目的,还会浪费分析人员的时间甚至导致错误的分析结果。因而,本申请重新审视安卓应用的运行过程,旨在从安卓系统运行底层出发提供一种能够克服现有技术中存在的各种技术缺陷。在此处对安卓应用在Android系统的运行过程进行简单的背景说明:
Linker是Android系统的加载/链接器,主要用于实现共享库的加载与链接,共享库是运行在Android系统上的各应用程序均可能会调用、使用的函数集合,旨在作为Android系统内的通用组件方便各应用程序的调用,就好像我们在PC中安装运行某些程序和游戏时需要的环境组件一样,因为安装的某些程序和游戏需要这些组件最终实现程序或游戏功能,在Android系统也是如此。各Android中的共享库和可执行映像都默认采用ELF格式的文件(一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件)。
其中,SO库文件作为库文件中一种重要的动态库文件常见于Android系统中,SO库文件中会包含许多节(section),用于存放不同类型的数据,而加密过的SO库文件会加密其中最重要的用于存放可执行代码的节,而加密后的可执行代码显然是不可直接读取分析的。但需要说明的是,因为恶意应用在运行在Android系统中时要实现恶意代码的运行也必须将加密后的可执行代码解密才行,而用于解密加密的可执行代码的解密函数其实也会内置在某一节中,本申请在充分了解恶意应用将运行的各步骤的基础上,基于Linker和反编译技术判断何时调用了该解密函数并完成了加密可执行代码的解密,以在第一时间获取解密后代码,防止该恶意应用在过程中利用反DUMP操作或二次加密等操作阻止恶意应用分析人员获取解密后代码。
本申请的核心是提供一种获取安卓应用原生层代码的方法、系统、装置及计算机可读存储介质,从所有安卓应用正常运行时均需使用的Linker入手,准确率高;利用反编译技术结合预设的关键字符串确定其中包含的初始化函数,以最终判定是否调用了该初始化函数对加密代码进行解密,在解密完整后立即执行DUMP操作,能够在目标应用执行反DUMP操作和二次加密之前提前截取到解密后代码,充分利用了恶意应用本身的加密代码自解密过程,无需人工解密,能够显著提升解密后代码获取效率。
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
以下结合图1,图1为本申请实施例所提供的一种获取安卓应用原生层代码的方法的流程图。
其具体包括以下步骤:
S101:将运行目标应用的Linker中的内容利用反编译技术执行反编译操作,得到反编译结果;
本步骤旨在先后利用Linker和反编译技术获得目标应用实际运行过程代码。Linker加载SO库文件的大体流程如下:
(1):装载与启动;
(2):对SO库文件进行内存映射并解析其文件格式;
(3):对SO库文件进行重定位;
(4):调用初始化函数,在正常SO库文件中此处是进行常规动作,而加密SO则会在此处调用解密函数对加密的可执行代码进行解密操作。
前三步属于Linker的固有操作步骤,并非本申请的重点,本申请重点将对第四步进行阐述:Linker在完成对SO库文件的装载、映射和重定向以后,首先需要对该SO库文件进行分析,因为恶意应用的加密SO文件一般会在调用初始化函数这一步骤中利用.init节和.init_array节中的代码(存放用于解密的函数)进行解密操作,而正常SO库文件则是执行其它常规操作,因此需要先看看其中是否存在.init_array节和.init节。
而在Linker加载SO库文件时还需要利用反编译技术将其反编译为代码分析人员可直接读取的数据,而非编译后的显示方式。实现反编译技术的工具和应用程序有很多,例如ildasm、ILSpy、apktool、IDA等工具。其中,IDA(Interactive DisassemblerProfessional,交互式反汇编器专业版)是目前最好用的一个静态反编译软件,它是一款交互式的,可编程的,可扩展的,多处理器的,交叉Windows或Linux WinCE MacOS平台主机来分析程序,被公认为花钱可以买到的最好的逆向工程利器。它支持数十种CPU指令集,是一种能够准确分析恶意代码并让其自身迅速成为攻击研究领域的重要工具。
S102:在反编译结果中检索预设关键字符串,并定位得到初始化函数;
在S101的步骤中,本步骤旨在于获得的反编译结果中检索预设的关键字符串,以最终定位恶意应用用于解密加密的可执行代码的初始化函数(解密函数)。通常情况下,由于SO库文件中会存在不同的标志来区分各节,因此可以采用检索拥有特定字符串的方式去定位解密该加密可执行代码的解密函数,该预设的关键字符串可以为“Calling%s@%pfor‘%s’”,但由于Android各版本间存在的差异以及其它差异因素该关键字符串不一定完全吻合,但总能够依据上述内容最终确定出该解密函数所在位置,因此本步骤并不对该关键字符串进行具体限定,只需要能够实现本步骤目的即可,可视实际情况不同进行适应性修改。
同时,在此步骤中还可能存在其它辅助定位步骤,例如通过上面的步骤并不能准确的确定解密函数所在节位置,还需要在此处周围进行二次寻找、定位等操作,目的还是在于确定用于解密加密的可执行代码的解密函数所在节位置,此处并不做具体限定。
S103:当目标应用调用初始化函数对加密代码进行解密并解密完成后,对解密后代码执行DUMP操作,得到解密后代码。
在S102的基础上,本步骤旨在判断该目标应用是否调用了该初始化函数(解密函数)用于解密加密的可执行代码,并在解密完成后对解密后代码执行DUMP操作,以准确、高效的获得解密后代码。
具体的,如何判断该目标应用是否调用了在S102中确定的节中包含的解密函数,给出的一种实现方式为在S102确定的节位置处设置断点来判断是否调用,当然,还可以由其它实现方式,例如判断某个目标寄存器中是否存放有解密后代码或设置使用标志来判断等等,可以根据实际情况和不同的实际应用环境综合调整,此处并不做具体限定。
基于上述技术方案,本申请实施例提供的一种获取安卓应用原生层代码的方法,从所有安卓应用正常运行时均需使用的Linker入手,准确率高;利用反编译技术结合预设的关键字符串确定其中包含的初始化函数,以最终判定是否调用了该初始化函数对加密代码进行解密,在解密完整后立即执行DUMP操作,能够在目标应用执行反DUMP操作和二次加密之前提前截取到解密后代码,充分利用了恶意应用本身的加密代码自解密过程,无需人工解密,能够显著提升解密后代码获取效率。
以下结合图2,图2为本申请实施例所提供的另一种获取安卓应用原生层代码的方法的流程图。
本步骤针对实施例一,提供一种相对具体的实现方式,具体包括以下步骤:
S201:提取目标应用正常运行调用的Linker;
S202:将Linker放入IDA中执行反编译操作,得到反编译结果;
首先在运行该目标应用的Android系统设备中在目标路径下提取得到Linker,接下来将提取得到的Linker放入IDA(静态反编译软件)中执行反编译操作。
S203:在反编译结果中检索预设关键字符串,得到第一目标位置;
S204:在第一目标位置的预设范围内查找调用初始化函数的汇编代码,得到第二目标位置;
本实施建立在无法直接用预设的关键字符串直接确定初始化函数(解密函数)所在节的位置的情况下,因此在确定第一目标位置后在其预设范围内查找调用初始化函数的汇编代码,一种具体的实际情况下该汇编代码为“blx r4”,即该汇编代码所指的位置为该第二目标位置。
S205:在第二目标位置处设置断点以使目标应用在断点处持续循环直至加密代码解密完成;
本步骤在第二目标位置处设置断点以使目标应用在断点处持续循环直至加密代码解密完成。
S206:利用IDA中的预设执行脚本获取解密后代码;
S207:将解密后代码发送至预设路径下。
基于上述技术方案,本申请实施例提供的一种获取安卓应用原生层代码的方法,从所有安卓应用正常运行时均需使用的Linker入手,准确率高;利用反编译技术结合预设的关键字符串确定其中包含的初始化函数,以最终判定是否调用了该初始化函数对加密代码进行解密,在解密完整后立即执行DUMP操作,能够在目标应用执行反DUMP操作和二次加密之前提前截取到解密后代码,充分利用了恶意应用本身的加密代码自解密过程,无需人工解密,能够显著提升解密后代码获取效率。
因为情况复杂,无法一一列举进行阐述,本领域技术人员应能意识到根据本申请提供的基本方法原理结合实际情况可以存在很多的例子,在不付出足够的创造性劳动下,应均在本申请的保护范围内。
下面请参见图3,图3为本申请实施例所提供的一种获取安卓应用原生层代码的系统的结构框图。
该系统可以包括:
反编译处理单元100,用于将运行目标应用的Linker中的内容利用反编译技术执行反编译操作,得到反编译结果;
关键字符串检索及初始化函数定位单元200,用于在反编译结果中检索预设关键字符串,并定位得到初始化函数;
DUMP操作执行单元300,用于在目标应用调用初始化函数对加密代码进行解密并解密完成时,对解密后代码执行DUMP操作,得到解密后代码。
其中,反编译处理单元100可以包括:
Linker提取子单元,用于提取目标应用正常运行调用的Linker;
IDA反编译执行子单元,用于将Linker放入IDA中执行反编译操作,得到反编译结果。
其中,关键字符串检索及初始化函数定位单元200可以包括:
关键字符串检索子单元,用于在反编译结果中检索预设关键字符串,得到第一目标位置;
初始化函数位置确定子单元,用于在第一目标位置的预设范围内查找调用初始化函数的汇编代码,得到第二目标位置。
其中,DUMP操作执行单元300可以包括:
IDA脚本执行子单元,用于利用IDA中的预设执行脚本获取解密后代码;
解密后代码发送子单元,用于将解密后代码发送至预设路径下。
进一步的,在完成关键字符串检索及初始化函数定位单元200中得到第二目标位置之后,还可以包括:
断点设置单元,用于在第二目标位置处设置断点以使目标应用在断点处持续循环直至加密代码解密完成。
以上各单元可以应用于以下的一个具体的实际例子中:
步骤一:将运行目标应用的Android系统设备中/system/bin目录下的linker导出并使用IDA进行反编译,搜索字符串“Calling%s@%p for‘%s’”,并跳转至引用此字符串的代码中,此代码位于偏移0x2726处;其中,定位到此字符串是为了快速定位到调用初始化函数.init节与.init.array节调用处;
步骤二:从偏移0x2726处往下寻址,便可于偏移0x272c处定位”blx r4”汇编指令,在此指令上设置断点;其中,设置断点是使被目标应用在调试过程中可中断在此处,目标应用会循环中断在断点处,循环执行程序直到中断在目标应用加载了加密的SO库文件后;
步骤三:启动调试流程,在第二次命中”blx r4”断点时便到了Linker调用加密SO库文件的初始化函数(解密函数)时。此时”r4”寄存器便指向了解密函数,大部分加密过的恶意软件会在此函数中对加密代码进行解密,因此在”blx r4”执行后代码便会还原成正常可执行的代码;
第一次命中的为此目标应用的另外一个并不加密的SO库。通常情况下,此时包含可执行代码的节中的内容依然处于加密状态,而加密算法位于.init节中的初始化函数(解密函数)里;
步骤四:此时在IDA中执行步过函数功能,使被调试SO库执行至偏移0x272E处,观察加密的代码是否解密完成,通常情况下,此时包含可执行代码的节中的内容已解密完成,为可读取、分析的代码。
步骤五:使用IDA自带脚本执行DUMP操作获取解密后代码。
本实施例旨在提供一种便捷、准确性高的原生层代码截获技术,由Android系统底层出发,直接从内存中捕获解密后代码,无须分析人员手动编写解密代码,无须分析人员具备熟悉加解密的能力,可降低恶意软件分析人员针对此类加密SO库文件的分析门槛;为了防止加密SO库文件在运行后对代码进行二次加密的行为,在Linker加载SO库文件的前期便可将解密后的代码DUMP下来,捕获的代码准确性更强;为了防止加密SO库文件在运行后执行反DUMP代码,阻挠分析人员进行DUMP操作,在加载前期进行DUMP,此时反DUMP行为还未开始触发,无法阻止DUMP操作,具有更强的抗反分析能力。
说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以对本申请进行若干改进和修饰,这些改进和修饰也落入本申请权利要求的保护范围内。
还需要说明的是,在本说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其它变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其它要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。
Claims (10)
1.一种获取安卓应用原生层代码的方法,其特征在于,包括:
将运行目标应用的Linker中的内容利用反编译技术执行反编译操作,得到反编译结果;
在所述反编译结果中检索预设关键字符串,并定位得到初始化函数;
当所述目标应用调用所述初始化函数对加密代码进行解密并解密完成后,对解密后代码执行DUMP操作,得到解密后代码;
其中,所述当所述目标应用调用所述初始化函数对加密代码进行解密并解密完成之前,还包括:
通过预先在所述初始化函数处 设置断点,判断所述目标应用是否调用所述初始化函数;
或,根据目标寄存器中是否存放有解密后代码,判断所述目标应用是否调用所述初始化函数;
或,通过预先为所述初始化函数设置使用标志位,以便根据所述使用标志位判断所述目标应用是否调用所述初始化函数。
2.根据权利要求1所述的方法,其特征在于,将运行目标应用的Linker中的内容利用反编译技术执行反编译操作,得到反编译结果,包括:
提取所述目标应用正常运行调用的Linker;
将所述Linker放入IDA中执行所述反编译操作,得到所述反编译结果。
3.根据权利要求2所述的方法,其特征在于,在所述反编译结果中检索预设关键字符串,并定位得到初始化函数,包括:
在所述反编译结果中检索所述预设关键字符串,得到第一目标位置;
在所述第一目标位置的预设范围内查找调用所述初始化函数的汇编代码,得到第二目标位置。
4.根据权利要求3所述的方法,其特征在于,在得到第二目标位置之后,还包括:
在所述第二目标位置处设置断点以使所述目标应用在所述断点处持续循环直至所述加密代码解密完成。
5.根据权利要求2至4任一项所述的方法,其特征在于,对解密后代码执行DUMP操作,得到解密后代码,包括:
利用所述IDA中的预设执行脚本获取所述解密后代码;
将所述解密后代码发送至预设路径下。
6.一种获取安卓应用原生层代码的系统,其特征在于,包括:
反编译处理单元,用于将运行目标应用的Linker中的内容利用反编译技术执行反编译操作,得到反编译结果;
关键字符串检索及初始化函数定位单元,用于在所述反编译结果中检索预设关键字符串,并定位得到初始化函数;
DUMP操作执行单元,用于在所述目标应用调用所述初始化函数对加密代码进行解密并解密完成时,对解密后代码执行DUMP操作,得到解密后代码;
其中,所述系统,还包括:
第一调用判断模块,用于通过预先在所述初始化函数处 设置断点,判断所述目标应用是否调用所述初始化函数;
第二调用判断模块,用于根据目标寄存器中是否存放有解密后代码,判断所述目标应用是否调用所述初始化函数;
第三调用判断模块,用于通过预先为所述初始化函数设置使用标志位,以便根据所述使用标志位判断所述目标应用是否调用所述初始化函数。
7.根据权利要求6所述的系统,其特征在于,所述反编译处理单元包括:
Linker提取子单元,用于提取所述目标应用正常运行调用的Linker;
IDA反编译执行子单元,用于将所述Linker放入IDA中执行所述反编译操作,得到所述反编译结果。
8.根据权利要求7所述的系统,其特征在于,所述关键字符串检索及初始化函数定位单元包括:
关键字符串检索子单元,用于在所述反编译结果中检索所述预设关键字符串,得到第一目标位置;
初始化函数位置确定子单元,用于在所述第一目标位置的预设范围内查找调用所述初始化函数的汇编代码,得到第二目标位置。
9.一种获取安卓应用原生层代码的装置,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序时实现如权利要求1至5任一项所述的获取安卓应用原生层代码的方法的步骤。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至5任一项所述的获取安卓应用原生层代码的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810053720.2A CN108255496B (zh) | 2018-01-19 | 2018-01-19 | 一种获取安卓应用原生层代码的方法、系统及相关装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810053720.2A CN108255496B (zh) | 2018-01-19 | 2018-01-19 | 一种获取安卓应用原生层代码的方法、系统及相关装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108255496A CN108255496A (zh) | 2018-07-06 |
CN108255496B true CN108255496B (zh) | 2021-07-16 |
Family
ID=62726731
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810053720.2A Active CN108255496B (zh) | 2018-01-19 | 2018-01-19 | 一种获取安卓应用原生层代码的方法、系统及相关装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108255496B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110990056A (zh) * | 2019-11-01 | 2020-04-10 | 北京三快在线科技有限公司 | 逆向分析方法、装置、电子设备及存储介质 |
CN113591089B (zh) * | 2021-08-12 | 2024-06-11 | 上海观安信息技术股份有限公司 | 一种数据混淆加密方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB2358261B (en) * | 2000-01-17 | 2004-06-09 | Advanced Risc Mach Ltd | Data processing with native and interpreted program instruction words |
CN105426777B (zh) * | 2015-11-17 | 2018-09-21 | 中科创达软件股份有限公司 | 一种动态链接库文件加密、解密方法及装置 |
CN105930692A (zh) * | 2016-04-20 | 2016-09-07 | 北京鼎源科技有限公司 | 一种Android应用程序的动态脱壳方法 |
-
2018
- 2018-01-19 CN CN201810053720.2A patent/CN108255496B/zh active Active
Non-Patent Citations (2)
Title |
---|
IDA调试android so的.init_array数组;bingghost;《博客园》;20170118;第1-6页 * |
安卓so文件脱壳思路(java版)附源代码;Angell开心果;《看流星社区》;20170604;正文第1-5页 * |
Also Published As
Publication number | Publication date |
---|---|
CN108255496A (zh) | 2018-07-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP2979219B1 (en) | Suspicious program detection | |
Bonfante et al. | Codisasm: Medium scale concatic disassembly of self-modifying binaries with overlapping instructions | |
Lin et al. | Automated forensic analysis of mobile applications on Android devices | |
Coogan et al. | Automatic static unpacking of malware binaries | |
US20170372068A1 (en) | Method to identify known compilers functions, libraries and objects inside files and data items containing an executable code | |
CN109471697B (zh) | 一种监控虚拟机中系统调用的方法、装置及存储介质 | |
JP2009129451A (ja) | 悪性コードによって挿入されたダイナミックリンクライブラリ検出装置及び方法 | |
CN102867144B (zh) | 一种用于检测和清除计算机病毒的方法和装置 | |
CN105550581A (zh) | 一种恶意代码检测方法及装置 | |
Choi et al. | A static birthmark for MS windows applications using import address table | |
CN108255496B (zh) | 一种获取安卓应用原生层代码的方法、系统及相关装置 | |
US11868465B2 (en) | Binary image stack cookie protection | |
KR101557455B1 (ko) | 응용 프로그램 코드 분석 장치 및 그것을 이용한 코드 분석 방법 | |
CN109472135B (zh) | 一种检测进程注入的方法、装置及存储介质 | |
EP4332805A1 (en) | Emulation-based malware detection | |
CN107209815B (zh) | 用于使用返回导向编程的代码混淆的方法 | |
CN109241706B (zh) | 基于静态胎记的软件抄袭检测方法 | |
US20220407695A1 (en) | Electronic device and control method thereof | |
Arnatovich et al. | Empirical Comparison of Intermediate Representations for Android Applications. | |
KR101052735B1 (ko) | 메모리 조작유무를 감지하는 방법 및 이를 이용한 장치 | |
JP5549810B2 (ja) | プログラム難読化装置、プログラム制御装置、プログラム難読化方法及びプログラム | |
Jiang et al. | CrackDex: Universal and automatic DEX extraction method | |
CN105574409A (zh) | 一种注入代码提取方法及装置 | |
US9965621B2 (en) | Program protection device | |
Lim et al. | Mal-Xtract: hidden code extraction using memory analysis |
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 |