怎么加密apk文件(apk怎么加卡密)

广告 X
欧意最新版本

欧意最新版本

欧意最新版本app是一款安全、稳定、可靠的数字货币交易平台。

APP下载  官网地址

《原创》防止APK被别人二次修改盗用 会点玩机的才进来

Android APP以APK文件形式存在,APP中主要包含应用程序代码和资源文件两部分,如何有效保护Android应用中的代码、资源的安全一直是开发者最关心的话题。针对应用程序代码,目前主要有两类方案,即代码混淆和应用加密。比较常见的代码混淆有proguard、dexguard等,而应用加密近些年国内也涌现出很多安全厂商提供该服务。本文则主要针对Android apk资源文件保护方案进行分析。

Android apk中的资源主要分为assets资源和res资源两类。Assets资源存放在APP的assets目录下,该类文件是一些原始文件,APP打包时并不会对其进行编译,而是直接打包到APP中,对于这一类资源文件的访问,应用层代码需要通过文件名对其进行访问。Res资源则存放在APP的res目录下,该类资源在APP打包时大多会被编译,变成二进制文件,并会为每个该类文件赋予一个resource id。对于该类资源的访问,应用层代码则是通过resource id进行访问的。

Android apk资源文件中存放了大量的应用UI界面图片、UI布局文件、隐私数据文件等,保障这些文件的安全性一直困扰着开发者,接下来将具体分析一下目前市场上常见的资源文件保护方案。

一、 Android资源文件保护相关方案

目前对Android应用资源文件的保护主要有两类方案,一类是对资源文件混淆保护,另一种则是对资源文件加密保护。

1. 资源文件混淆保护

Android apk开发过程中公司大都提倡命名规范化,因此通过文件名称非常容易理解其含义,这样有利于开发者理解和维护应用,但是同时也给应用破解者提供了方便,破解者通过这些命名很容易便可找到他们需要的文件位置,并理解这些文件的意图。对资源文件进行重命名则可以在一定程度上提升破解者理解这些文件的难度,从而一定程度上提升资源文件的安全性。例如将原资源文件res/layout/activity_main.xml命名为res/a/a.xml,通过layout和activity_main.xml我们很容易知道该文件可能是个布局相关文件,且可能是主activity的布局文件,而被混淆变成res/a/a.xml后,破解者则很难通过名字知道a.xml文件的作用。

我们知道,Android应用在编译过程中aapt工具会对资源文件进行编译、打包,并生成一个resource.arsc文件,resource.arsc文件相当于一个文件索引表,记录了很多跟资源相关的信息。因此,如果需要对资源文件进行混淆,如何保证resource.arsc文件的正确性是个难点。至少我们可以两个方面攻克这一问题。

1) 修改aapt方案

在APP的编译打包过程中,工具aapt负责对资源文件进行编译、打包并生成resource.arsc文件,因此我们可以通过分析并修改aapt源码来实现生成正确的resource.arsc文件。

2) 修改resource.arsc文件

修改aapt源码的方案对开发者要求较高,且不同版本aapt可能有区别,直接修改打包好的APP中的resource.arsc文件可能也是一个不错的方案。

文件resource.arsc的格式可以通过分析aapt的源码获知,且目前也有很多文档介绍该文件的格式,因此,我们可以通过对APP解包、读取、解析、修改其中的资源文件和resource.arsc文件来实现对APP资源文件的混淆。

下面我们通过一个demo APP文件展示一下资源文件混淆保护的效果。

其中图1为资源文件保护前的资源文件结构图,图2为资源文件保护后的资源文件结构图。

图1 资源文件保护前res目录结构

图2 资源文件保护后res目录结构

从图1和图2可以看出,资源文件混淆后,原来的res目录变成了r目录,该目录下的目录名字都变成了没有字面意义的字母,从而一定程度上保证了res资源的安全性。

以上提出的资源文件混淆保护方案有一定技术难度,所以在开发者实际使用过程中并没有广泛运用。目前,开发者出于技术能力和精力的种种限制,越来越多的开发者选择使用第三方应用加密保护平台来实现对资源文件的保护。

2. 资源文件加密保护

资源文件加密保护,从字面来看,无非是对APP中的资源文件进行加密,在APP运行时对资源文件进行解密恢复,从而使应用正常访问资源文件。由于资源文件被加密,因此通过对APP进行反编译并不能看到真正的资源文件,从而保证资源文件的安全性。虽然资源文件加密保护大体思路如此,但是实现方案和效果则可能不同。下面以360加固保提供的资源文件加密保护方案为例分析其方案效果。

写一个demo APP文件,使用360加固保的资源文件加密保护功能,图3和图4为资源保护前的APP的assets目录和res目录文件结构,图5和图6为资源保护后的APP的assets目录和res目录文件结构。

图3 资源保护前assets目录文件结构

图4 资源保护前res目录文件结构

如图3和图4所示,原APP的assets目录下有三个文件,分别是a.log、b.log、c.log。res目录下有很多文件,如ui文件、配置文件等。目录assets下面存放的是未进行压缩的原始文件,可以很容易的被破解者修改并重打包,目录res下的文件虽然大部分是经过了压缩处理的,但是其中的图片却能直接看到,且即使是被压缩过的二进制文件也很容易被破解者修改。

接下来使用360加固保的对该APP进行资源文件保护,解压保护后的APP,得到图5和图6。图5为360加固保资源文件保护后的assets目录结构,图6为资源文件保护后的res目录结构。

图5 资源保护后asset目录文件结构

图6 资源保护后res目录文件结构

图5中可以看出,之前该目录下的a.log、b.log、c.log文件消失了,但多出了libjiagu.so、libjiagu_x84.a、libjiagu_x86_1.a、libjiagu_x86.so和resConf文件。多出的这些文件则是360加固保的APP加固和资源加密相关的文件。

图6中可以看出,之前res目录下的很多文件都不见了,查看了一下留下的几个目录的文件,里面的文件是APP的图标。

可以看到使用360加固保后,能对资源文件进行有效的加密保护效果。360加固保资源文件加密保护的大体原理如下:

1) 抽取原APP中需要加密保护的资源文件

解压抽取APP中的需要加密的资源文件,并过滤到一些不能保护的资源文件,如APP图标等;

2)加密资源文件

对抽取出来的需要加密保护的资源文件进行加密处理,并隐藏起来;

3) 实现外壳程序

要想让APP正常运行,则需要为使用资源保护后的APP实现一个外壳程序,360加固保本身具有APP加固功能,因此他们可以将资源文件保护的恢复程序集成到360加固保的加固壳程序里面,如果不使用360加固保,那么我们就需要自己实现一个外壳,外壳程序需要负责在APP使用资源前对资源文件进行恢复。例如如果保护我们自己的APP资源,那么我们就需要实现一个资源恢复程序外壳,并将该外壳的程序入口代码放到APP中,壳程序入口的运行时机应足够早,比如放到我们可以将这个外壳放在应用代码的Application类里面。

本文介绍了两种可行的资源文件混淆保护方案,一种是修改aapt工具,让aapt在编译资源时生成混淆后的正确的resource.arsc文件,同时修改资源文件名称,另一种方案则是直接修改APP中的资源文件名,同时修改其中的resource.arsc文件。

从实现难易度和工作量综合来看,第二种方案,即直接修改APP中相关文件可能更为适合,但从保护效果来看,两种方案实现的混淆效果是一样的,都是对文件进行重命名。

资源混淆保护方案优缺点:

优点:可减小APP体积。

缺点:安全强度有限:仅对资源文件进行重命名并不能有效的保护资源文件,破解者依然能可查看并修改资源文件内容,

assets文件保护难度较大:如需对assets目录下的资源进行混淆,则需要修改java程序代码或者dex文件,难度和复杂度较大,容易出错。

资源文件加密保护方案优缺点:

本文对360加固保的资源文件保护方案的效果和实现进行了分析,从效果来看该保护方案安全强度较高,资源文件加密处理后在APP中不可见,且壳程序采用native代码实现,逆向难度较大。

优点:安全强度高,破解者不能查看和修改资源文件。

缺点:由于需要运行时解密,有可能会对APP的性能有所影响,不过经过测试平台的测试,加固后对APP的兼容性在99%以上,这也是越来越多的开发者选择这种第三方应用加固平台的原因。

VR行业-加密与授权解决方案

很多公司都有着自己的APP,包括安卓端以及ios端都有属于自己的APP应用,随着互联网的快速发展,APP安全也影响着整个公司的业务发展,前段时间有客户的APP被攻击,数据被篡改,支付地址也被修改成攻击者自己的,损失惨重,通过朋友介绍找到我们做APP的安全防护,我们对客户APP进行渗透测试,漏洞检测,等全方位的安全检测。通过近十年的APP安全维护经验来总结一下,该如何做好APP的安全,防止被攻击。

根据我们的研究发现,国内大部分的APP应用都存在安全隐患,我们对其进行过安全测试,结果发现百分之40的APP使用的是http来进行数据的传输,包括用户的登录账户与密码,百分之22的用户使用SSL证书来对数据进行加密传输,百分之80的APP应用都使用的明文在存储手机上数据,百分之75的APP没有进行安全加固,由此看来整个移动互联网的APP应用都存在着安全风险,随着移动5G的普及,万物互联的局势将要到来,APP的安全起着重要的作用,速度再快,安全没有保障,出现的用户信息泄露,以及数据篡改等情况的发生,对任何一家企业都是致命的。

如何对APP进行安全测试与安全加固?

我们在这里跟大家详细的分享一下,希望能帮到更多APP应用企业。大部分APP都使用的是服务器作为后端,那么我们在APP安全加固的同时,也要做好服务器的安全包括windows,linux系统的安全加固,对服务器的端口进行安全设置,实行端口安全策略只允许APP端与服务器进行通信,拒绝任何外部的IP访问与扫描,同时也要对服务器的SSH,mstsc远程登录做安全身份验证,对服务器做全面的渗透测试,符合信息安全等级保护,与服务器的远程连接可以启用IP安全策略,将IP单独加入白名单,例如:阿里云服务器,可以在阿里云控制台,端口安全,单独放行IP。

网站安全也叫web安全,很多APP都嵌入网站来使用一些接口调用,方便快捷的同时,也要对网站进行安全加固,包括网站的漏洞进行检测,代码人工安全审计,网站木马后门的检测与清除,网站防篡改部署,网站日志安全分析,定期的对网站进行安全巡检等安全工作,自己对安全加固不是太懂的话也可以找专业的网站安全公司来处理,网站需要启用https协议访问,通过SSL证书来加密APP的数据传输。

APP的代码加密与混淆,APP在开发的同时一定要对代码进行混淆加密,对核心功能包括一些支付功能,都做代码的加密,对APP的每段代码进行人工安全审计,提前检测出APP漏洞进行修复,防止攻击者下载APK逆向进行代码的解密操作,对数据的传输做AES加密,混合多层次的加密与解密,防止通过数据抓包来篡改数据进行POST到API接口,达到篡改数据的目的,有些APP存在一些逻辑功能,都是通过APP数据抓包来实现的,有些APP开发者并没有对一些权限做严格的安全判断与限制,导致可以绕过,直接执行其他账户的操作,像账户的密码修改,资料修改等等。

对APP用户登录做安全认证,增强APP接口的安全,增加身份安全验证,包括人脸以及手机短信验证码,再结合手机设备信息来安全认证,防止恶意登录。在支付的接口做数据传输的双向加密措施,支付网关与APP的服务器IP做绑定,数据做SSL加密传输,AES加密。

很多公司的APP运营者都十分重视APP的安全问题,APP安全了,才能保障整个公司业务的安全,在APP开发阶段应该对APP进行安全测试,包括APP安全渗透,渗透测试服务,APP的逆向破解保护,如果您的APP数据被篡改,用户信息被泄露,肯定是APP存在漏洞,找专业的渗透测试公司来帮您找到APP存在的漏洞,防止攻击扩大化,将损失降到最低,APP安全要从多个方面去入手,服务器安全,网站安全,APP代码,传输加密,接口安全等等方面去深入的安全加固,来增强公司安全团队的安全应急快速响应的能力。

unity 代码加密方案

一、前言

今天是端午节,然而小编不能吃粽子了,只能继续破解之路,今天我们来看一下在了解了破解三部曲之后,如何开始脱掉各个市场中的apk壳,关于破解三部曲在之前已经介绍了:

Android中使用Eclipse动态调试smali源码

Android中使用IDA动态调试so源码

Android中破解加固的apk

在看完这三篇文章之后,我们开始操作如何破解市场中的加壳方案,现在市场中比较流行的加壳平台就那么几个:爱加密,梆梆加固,360加固,腾讯加固等,所以后面会一一介绍如何脱掉这些平台的壳。之前也说过现在加固的方案大体思路都是:

把源apk进行加密拆分处理,然后在套一个外部的壳Application做一些初始化操作,比如解密apk,动态加载运行即可。但是我们已经知道了如何去破解那些加固的apk了,就是使用IDA给dvmDexFileOpenPartial函数下断点,然后dump出内存中的dex数据即可。因为内存中的dex肯定是解密之后的,所以大体思路知道了,但是这些加固平台也有对策,他们会把做一些反调试操作,对so文件进行混淆加密等,让我们的调试变得比较困难。这才是我们脱壳的阻碍地方。

二、案例分析

好了,说了这么多,下面我们就开始脱壳第一站:爱加密家的壳

为了脱掉他家的壳,我们得首先有一个案例程序,这个比较简单,我们自己弄一个demo程序,然后去他家的网站上加固一下,得到加固之后的apk,然后这时候我们开始破解了,按照惯例:

第一步:解压apk,看看大体的目录,得到classes.dex文件,然后用dex2jar+jd-gui得到Java源码

看到,这里只有Application的壳,而且这个是爱加密加固之后的特点,都是这两个Application的。

第二步:使用apktool来反编译apk,获取资源文件信息

###分析一下爱加密的加密流程

也是国际惯例,爱加密把我们的源程序进行加密操作然后隐藏到了一个地方,在之前破解加固apk的那篇文章中也说过了,隐藏的地方就那么几个:assets目录、libs目录、自己的dex文件中

这里我们直接看assets目录:

多了这个东东,猜想这个可能就是处理之后的源apk了。我们在AndroidManifest.xml中看到了入口的Application类,先来看这个类

下面我们来分析一下这个SuperApplication类:

这里一般都是在attachBaseContext这个方法中进行操作的,这里的时机比较早,我们看到首先会调用loadLibs方法进行加载libs:

这里区分不同的平台,然后进行拷贝不同的so文件,继续看copyLib方法:

这里我们可以看到了,从assets目录下把爱加密增加的两个so文件:libexec.so和libexecmain.so拷贝到应用程序的files目录下,我们可以去看看assets/ijm_lib目录下的so文件:

到这里loadLibs方法就执行完了,下面就开始调用NativeApplication的load方法进行加载数据,继续看NativeApplication类:

这里会开始从应用程序的files目录中加载这两个so文件,而且load方法也是一个native方法,我们继续看看这两个so文件内容:

我们首先用IDA打开libexecmain.so文件,但是发现,他里面并没有什么重要信息,连JNI_OnLoad函数都没有东东

我们继续在查看libexec.so文件:

擦,可惜的是,打开提示so文件格式错误,到这里,我们就猜到了,这个so可能被加密处理了,elf格式改了,关于so如何进行加密操作的,不了解的同学可以看这里:Android中如何对so文件进行加密 那么这里我们点击Yes继续强制打开之后,在使用Ctrl+S查看so的各个段信息:

现在可以百分百的确定,这个so文件被处理了,段格式被修改了。我们没办法分析so文件了,当然这里我们可以在dump出内存中的so文件,然后在分析的,但是这个不是今天讲解的重点。我们先分析到这里,也知道了爱加密的大体加密流程。

好了,到这里,我们差不多分析完了爱加密的加密流程了:

1、按照国际惯例把源apk进行加密处理存放在一个地方,通过分析猜想是assets目录下的ijiami.dat文件

2、添加壳Application:SuperApplication类,在这个壳的attachContext方法中,主要做了两件事:

1》第一件事是把assets/ijm_lib目录下的两个so文件copy到程序的files目录中;

2》第二件事是调用NativeApplication的load方法,在这个类中同时也把上面的两个so文件加载到内存中

3、对apk的加密操作都是放在底层的两个so文件中操作的,我们通过IDA去分析这两个so文件之后,发现核心功能的so文件被加密了,IDA打开是看不到具体信息了

到这里,我们知道爱加密加固之后的特点是:在程序的assets目录下多了一个ijiami.dat文件和两个so文件,同时这两个so文件被加密处理了,增加破解难度。

三、破解脱壳

上面就简单分析了爱加密的原理和流程,但是我们没有继续往下面分析了,因为这个不是我们今天讲解的重点,我们今天的重点是如何脱掉爱加密的壳,那么还是开始说到的,脱壳的核心就一个:给dvmDexFileOpenPartial函数下断点,dump出内存的dex文件即可,那么下面我们就是用IDA开始脱壳操作了:

第一步:启动设备中的android_server,然后进行端口转发

adb forward tcp:23946 tcp:23946

第二步:用debug模式启动程序

adb shell am start -D -n com.droider.crackme0201/.MainActivity

这里的包名和入口Activity都可以在上面反编译之后的AndroidManifest.xml中找到

第三步:双开IDA,一个用于静态分析libdvm.so,一个用于动态调试

记录dvmDexFileOpenPartial函数的相对地址:4777C

再次打开一个IDA,进行attach调试进程

第四步:使用jdb命令attach上调试器

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

第五步:对dvmDexFileOpenPartial函数下断点

进入调试页面之后,Ctrl+S查找libdvm.so的内存基地址:415BB000

在第三步得到相对地址:4777C+415BB000=4160277C 得到了dvmDexFileOpenPartial在内存中的绝对地址

注意:

当然这里还有一个更方便的办法:

就是直接打开Modules View:

在这里查找libdvm.so文件:

然后双击libdvm.so文件:

查找需要下断点的函数名称,看到这里的绝地地址也是:4160277C

这里有两种方式可以得到一个函数在内存中的绝对地址。

然后我们使用G键,直接跳转到函数处,下断点:

第六步:设置Debugger Options选项

能够让程序断在dvmDexFileOpenPartial函数处

注意:

上面的第四步,第五步,第六步,没有顺序的,只要在运行之前设置到就可以了。

第七步:运行程序

出现这个对话框,不要在意,一路点击Cancel即可

jdb也attach上了调试程序:

我们一路点击运行按钮,知道运行到dvmDexFileOpenPartial处的断点,但是可惜的是,这里我们遇到了错误:

我们点击OK之后,出现了下面对话框:

再次点击任何一个按钮,都会退出了调试页面:

我们在重新尝试一次上面的流程,开始调试,但是错误是一样的,好了,到这里我们就立马想到了,之前说的IDA调试so的那篇文章遇到的那个问题:反调试检测

当时我们也是遇到这个情况,在没有运行到我们下的断点处,就退出了调试页面,其实这个是现在加固平台必要选择的一种方式,其实反调试原理很简单,就是在程序运行最早的时机比如so加载的时候即:JNI_OnLoad方法中,读取本进程的status文件,查看TracerPid字段是否为0,如果不为0,那么就表示自己的进程被别人跟踪了,也就是attach了,那么这时候立马退出程序,下面我们使用IDA在attach进程成功之后,查看本进程的status信息:

看到这里的TracerPid为11340,不为0,表示被11340进程attach了,那么我们可以查看一下这个进程是谁:

其实这个进程就是我们在设备中安插的android_server,它用于和IDA进行通信。

好了到这里,我们可以看到爱加密做了反调试检测,但是按照之前的那篇文章中,我们可以给JNI_OnLoad函数下断点,然后找到检测代码,把对应的arm指令改成空指令,检测失效了,但是这里我们知道爱加密的两个so文件被处理了,IDA没法分析了,那么这里我们该怎么办呢?如何应对反调试呢?其实我们可以借助IDA可以修改寄存器和内存数据的特性来做到?

首先我们上面分析了反调试的原理,一般在native代码去做检测的话,都是用fopen系统函数打开status文件,然后用fgets函数读取一行的内容,这个是国际惯例的,操作文件都是用的fopen函数的

好了,那么这里思路就有了:既然反调试肯定用到了fopen和fgets这两个函数,那么我们直接像给dvmDexFileOpenPartial下断点的方式一样,给这两个函数下断点,然后运行到fgets断点处的时候,发现如果是读取TracerPid这行内容的时候,就开始修改内存内容,把TracerPid字段的值改成0,或者修改R0寄存器的内容,跳过反调试检测

这两个函数是在libc.so文件中的,我们可以把设备的/system/lib/libc.so使用adb pull到本地即可,然后用IDA得到他的相对地址,在调试页面得到基地址,然后相加得到绝对地址,跳转即可,但是这里不用这种复杂的方式,有两种方式可以进行跳转:

第一种方式:在Modules界面,找到libc.so,然后在找到这两个函数,就可以得到他们的绝对地址了

然后使用G键,跳转下断点即可:

第二种方式:也是最简单的方式,就是G键,本身就有可以直接输入函数名进行跳转的功能

下断点:

看到了吧,这种方式是不是非常简单高效

好了到这里就给这两个函数下好了断点,当然这里还需要给dvmDexFileOpenPartial函数下断点,一切弄好了之后,这时候我们再次运行:

停在了fopen断点处,我们使用F8单步调试,看到R7寄存器中的内容是/proc/...,我们直接点击R7查看全部内容:

内容有点长,大致的内容是:/proc/self/cmdline.debug.atrace.app_cmdlines,这个是干什么的?

我们看看这个目录内容:

发现没有这个文件内容,只有cmdline文件,但是这里先不管他了,我们知道这个肯定不是读取status文件的,那我们直接略过这个断点,点击F9运行到下一个断点,中间过程先忽略,一路F9,直到运行到了fopen这个断点:

果然,这里使用了fopen来读取status文件了,点击R7寄存器查看全部内容:

这个16396就是我们本进程的id:

到这里,我们知道下一个断点肯定是fgets,所以点击F9进入到fgets断点处:

这里还看不到什么信息,我们继续点击F8单步调试:

途中,会看到有memchr和memcpy这两个重要函数,这个也是操作字符串的核心点,继续往下走:

到了fgets函数结束的地方,我们看到了R0寄存器的内容是Name...点击R0查看全部内容:

全部内容是:Name: der.crackme0201;这个就是status文件的第一行内容:

到这里,我们知道了,开始读取status文件的每行内容了,但是到TracerPid那行还要继续执行5次fgets函数,所以还会进入5次断点,为了节省时间,这里点击5次F9,直接运行到读取TracerPid那行的内容的fgets断点处:

看到了关键的内容了TracerPid字段了,这时候,我们打开Hex View 查看16进制的内存数据:

但是我们看到,这个并没有和调试页面View位置相对应,我们可以这么操作:

在寄存器窗口查看到R0寄存器的内容:

这里就是TracerPid字段在内存的地址,记录一下,然后在Hex View页面中使用G键,进行跳转,这里一定要注意是在HexView,而不是调试页面,调试页面使用G键跳转到的是指令地址了。

好了,这里我们看到了TracerPid的内存内容了,这里我们就开始修改吧,选择我们要修改的内容:是11340那里:

选择内容开始处,右击,选择Edit,进入修改状态:

改了之后的内容是橘黄色的,修改完成之后,在点击右键,选择Apply changes:

完成修改,颜色变成灰土色了:

注意:

这里其实还可以直接修改寄存器R0的值:

这时候就表示修改成了,我们继续使用F8单步调试下去:

这里就开始把TracerPid字段的值和0作比较了,我们点击R0寄存器查看全部内容:

这里的值已经被改成了0,所以这里就骗过去了。继续运行,我们会发现,又进入了fopen函数的断点处,而且查看还是读取status文件,这个也不好奇,因为是反调试检测肯定是一个轮训机制的,所以肯定会反复的读取的这个文件,fopen走多次也是正常的,但是这个反调试肯定是在子线程的,所以只要到了主线程中解密dex文件就肯定到了dvmDexFileOpenPartial,所以这里会多次重复上面的操作,修改多次TracerPid的值,这里就不在演示了,我在操作的过程中修改了三次,当没有在走fopen函数的时候,遇到了这个错误,这里不关心,直接点击ok就可以了。

再次点击运行:

这里说明已经改开始解密dex文件了,应该离成功不远了,继续运行:

终于到了我们想要的地方了,到这里就好办了,直接点击Shirt+F2,打开脚本运行窗口,运行下面脚本:

static main(void)

{

auto fp, dex_addr, end_addr;

fp = fopen(“F:\\dump.dex”, “wb”);

end_addr = r0 + r1;

for ( dex_addr = r0; dex_addr < end_addr; dex_addr ++ )

fputc(Byte(dex_addr), fp);

}

把内存中的dex保存到F:\dump.dex中,这里不再解释了,之前的一篇文章已经介绍过了,这里R0寄存器就是dex在内存中的起始地址,R1寄存器就是dex文件的大小:

我们使用G键,可以在HexView页面中查看R0寄存器中的地址内容:

看到了吧,这里就是dex的头文件格式。

四、还原应用apk

我们得到了内存中的dex数据之后,可以使用baksmali工具转化成smali源码,查看代码逻辑即可,这里不再演示了。

然后最后还有一步:还原apk

首先我们修改反编译之后的AndroidManifest.xml中:

把这段内容删除,如果有自己的Application的话,就改成自己的Application即可,同时删除assets目录下面的文件。

然后使用apktool进行回编译,这时候,先不要着急签名apk,而是替换classes.dex:

我们把上面得到的dump.dex改成classes.dex然后直接用压缩软件,替换未签名的apk中的dex文件即可

最后在进行签名操作,完成还原apk工作。

五、总结爱加密的破解流程

一个目标:

在脱壳的过程中,我们就一个目标:dump处内存中的dex文件

但是在上面分析了爱加密的加固流程之后,发现他做了这些事:

1、爱加密加固之后apk目录变化

把源程序apk加密处理放到了assets目录下的ijiami.dat,也同时在assets\ijm_lib目录下添加两个so文件:libexec.so和libexecmain.so,这里两个so文件用来处理整个apk解密,动态加载等逻辑,但是我们用IDA查看得知,这两个so文件被加密处理了

2、爱加密加上自己的壳Appliation

添加自己的壳Application:SuperApplication类,这个类中的attachContext方法中,首先把assets目录中的两个so文件copy到应用的files目录下,然后在使用System.load方法,加载这个files目录中的两个so文件

3、下断点调试遇到反调试检测

我们在给dvmDexFileOpenPartial下断点,进行调试的时候,发现有反调试检测,因为无法给JNI_OnLoad下断点来去除反调试功能的arm指令,所以只能去修改内存数据,把TracerPid的值变成0,骗过检测了。这里我们的思路就是给fopen和fgets这两个函数下断点,因为我们知道反调试的原理就是读取本进程的status文件,然后获取TracerPid那行内容即可,所以这里肯定用到了fopen和fgets函数,在使用fgets这个函数的时候,会读取每行内容,那么我们只要发现在读取到TracerPid那行内容的时候,去修改内存值,把TracerPid字段的值改成0即可。

4、给fopen和fgets函数下断点

有了上面的反调试思路之后,我们就开始进行操作了,但是在操作的过程中发现多次执行了fopen和fgets函数,而且我们需要修改多次TracerPid的值,原因很简单,因为是反调试检测,肯定是在子线程中轮训去检测这个值,所以会执行多次很正常,所以我们要修改多次TracerPid的值,骗过检测,直到当在主线程中,代码运行到了解密dex文件的时候,即到了dvmDexFileOpenPartial函数处的断点处为止

5、修改TracerPid内存数据骗过检测

最后修改多次TracerPid值,骗过检测,到了dvmDexFileOpenPartial这里,这时候,在执行dump脚本,把内存中的dex数据dump到本地即可。

通过上面的调试和破解流程其实不难发现,爱加密的流程是这样的:

1》fopen:/proc/self/cmdline.debug.atrace.app_cmdlines

2》fgets:com.droider.crackme0201

3》dvmLoadNativeCode–加载libexec.so

4》dvmLoadNativeCode–加载libexecmain.so

5》建立反调试线程(通过检查是否存在调试进程)

6》调用fopen—-打开/proc/pid/status

7》调用fgets—读取调试进程pid

这里除了dvmDexFileOpenPartial函数,还有一个重要的函数dvmLoadNativeCode,它是加载和初始化so的函数,如果感兴趣的同学,可以去给这个函数下断点看看运行逻辑。

所以我们只要记住我们的目的只有一个:到达dvmDexFileOpenPartial函数处,dump处内存中的dex文件,就算是完成脱壳工作

六、总结

到这里我们就分析完了如何去脱掉爱加密的壳,其实在之前说过,现在各个加固平台的原理都差不多,最后看到的就是各家的加固算法了,所以我们在脱壳的过程中目标也很明确,就是dump出内存中的dex文件即可。不管他上层再怎么牛逼的加密拆分操作,到了内存肯定是完整的dex文件了,所以现在加固平台也是一个思想就是不让你dump出来,就是让你给dvmDexFileOpenPartial函数下断点失败,调试失败。

更多详细内容:www.wjdiankong.cn/blog

关注微信公众号:Android技术分享

官方详解谷歌 Play 商店新格式 AAB:8 月起实施取代 APK

打开Android文件管理器,会发现里面数十个英文名称命名的文件夹罗列其中,很多功能我们可以从其名字上略有所知,内部大批量的文件却让我们有些一头雾水。这些文件是什么呢?有什么用?我们能不能删?这些都是我们脑中充满疑问的。现在将将Android手机内部文件夹的架构和各文件的功能描述介绍给大家,让大家自己手机的内部资源有个比较透彻的理解,同时也避免了用户误删造成的数据丢失和系统崩溃。

\system\app

这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结尾的文件。在这个文件夹下的程序为系统默认的组件,自己安装的软件将不会出现在这里,而是\data\文件夹中。

\system\bin

这个目录下的文件都是系统的本地程序,从bin文件夹名称可以看出是binary二进制的程序,里面主要是Linux系统自带的组件(命令)

\system\etc

从文件夹名称来看保存的都是系统的配置文件,比如APN接入点设置等核心配置。

\system\fonts

字体文件夹,除了标准字体和粗体、斜体外可以看到文件体积最大的可能是中文字库,或一些unicode字库,从T-Mobile G1上可以清楚的看到显示简体中文正常,其中DroidSansFallback.ttf文件大小 。

\system\framework

framework主要是一些核心的文件,从后缀名为jar可以看出是是系统平台框架。

\system\lib

lib目录中存放的主要是系统底层库,一些so文件,如平台运行时库。

\system\media

\system\media\audio

铃声音乐文件夹,除了常规的铃声外还有一些系统提示事件音。

\system\sounds

默认的音乐测试文件,仅有一个test.mid文件,用于播放测试的文件。

\system\usr

用户文件夹,包含共享、键盘布局、时间区域文件等。

\system\app

这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结尾的文件。在这个文件夹下的程序为系统默认的组件,自己安装的软件将不会出现在这里,而是\data\文件夹中。

\system\app\AlarmClock.apk 闹钟

\system\app\AlarmClock.odex

\system\app\Browser.apk 浏览器

\system\app\Browser.odex

\system\app\Bugreport.apk Bug报告

\system\app\Bugreport.odex

\system\app\Calculator.apk 计算器

\system\app\Calculator.odex

\system\app\Calendar.apk 日历

\system\app\Calendar.odex

\system\app\CalendarProvider.apk 日历提供

\system\app\CalendarProvider.odex

\system\app\Camera.apk 照相机

\system\app\Camera.odex

\system\app\com.amazon.mp3.apk 亚马逊音乐

\system\app\Contacts.apk 联系人

\system\app\Contacts.odex

\system\app\DownloadProvider.apk 下载提供

\system\app\DownloadProvider.odex

\system\app\DrmProvider.apk DRM数字版权提供

\system\app\DrmProvider.odex

\system\app\Email.apk 电子邮件客户端

\system\app\Email.odex

\system\app\FieldTest.apk 测试程序

\system\app\FieldTest.odex

\system\app\GDataFeedsProvider.apk GoogleData提供

\system\app\GDataFeedsProvider.odex

\system\app\Gmail.apk Gmail电子邮件

\system\app\Gmail.odex

\system\app\GmailProvider.apk Gmail提供

\system\app\GmailProvider.odex

\system\app\GoogleApps.apk 谷歌程序包

\system\app\GoogleApps.odex

\system\app\GoogleSearch.apk 搜索工具

\system\app\GoogleSearch.odex

\system\app\gtalkservice.apk GTalk服务

\system\app\gtalkservice.odex

\system\app\HTMLViewer.apk HTML查看器

\system\app\HTMLViewer.odex

\system\app\IM.apk 即使通讯组件包含MSN、yahoo通

\system\app\ImCredentialProvider.apk

\system\app\ImProvider.apk

\system\app\ImProvider.odex

\system\app\Launcher.apk 启动加载器

\system\app\Launcher.odex

\system\app\Maps.apk 电子地图

\system\app\Maps.odex

\system\app\MediaProvider.apk 多媒体播放提供

\system\app\MediaProvider.odex

\system\app\Mms.apk 短信、彩信

\system\app\Mms.odex

\system\app\Music.apk 音乐播放器

\system\app\Music.odex

\system\app\MyFaves.apk T-Mobile MyFaves程序

\system\app\MyFaves.odex

\system\app\PackageInstaller.apk apk安装程序

\system\app\PackageInstaller.odex

\system\app\Phone.apk 电话拨号器

\system\app\Phone.odex

\system\app\Settings.apk 系统设置

\system\app\Settings.odex

\system\app\SettingsProvider.apk 设置提供

\system\app\SettingsProvider.odex

\system\app\SetupWizard.apk 设置向导

\system\app\SetupWizard.odex

\system\app\SoundRecorder.apk 录音工具

\system\app\SoundRecorder.odex

\system\app\Street.apk 街景地图

\system\app\Street.odex

\system\app\Sync.apk 同步程序

\system\app\Sync.odex

\system\app\Talk.apk 语音程序

\system\app\Talk.odex

\system\app\TelephonyProvider.apk 电话提供

\system\app\TelephonyProvider.odex

\system\app\Updater.apk 更新程序

\system\app\Updater.odex

\system\app\Vending.apk 制造商信息

\system\app\Vending.odex

\system\app\VoiceDialer.apk 语音拨号器

\system\app\VoiceDialer.odex

\system\app\YouTube.apk Youtube视频

\system\app\YouTube.odex

\system\bin

这个目录下的文件都是系统的本地程序,从bin文件夹名称可以看出是binary二进制的程序,里面主要是Linux系统自带的组件:

\system\bin\akmd

\system\bin\am

\system\bin\app_process 系统进程

\system\bin\dalvikvm Dalvik虚拟机宿主

\system\bin\dbus-daemon 系统BUS总线监控

\system\bin\debuggerd 调试器

\system\bin\debug_tool 调试工具

\system\bin\dexopt DEX选项

\system\bin\dhcpcd DHCP服务器

\system\bin\dumpstate 状态抓取器

\system\bin\dumpsys 系统抓取器

\system\bin\dvz

\system\bin\fillup

\system\bin\flash_image 闪存映像

\system\bin\hciattach

\system\bin\hcid HCID内核

\system\bin\hostapd

\system\bin\hostapd_cli

\system\bin\htclogkernel

\system\bin\input

\system\bin\installd

\system\bin\itr

\system\bin\linker

\system\bin\logcat Logcat日志打印

\system\bin\logwrapper

\system\bin\mediaserver

\system\bin\monkey

\system\bin\mountd 存储挂载器

\system\bin\netcfg 网络设置

\system\bin\ping Ping程序

\system\bin\playmp3 MP3播放器

\system\bin\pm 包管理器

\system\bin\qemud QEMU虚拟机

\system\bin\radiooptions 无线选项

\system\bin\rild RIL组件

\system\bin\sdptool

\system\bin\sdutil

\system\bin\service

\system\bin\servicemanager 服务管理器

\system\bin\sh

\system\bin\ssltest SSL测试

\system\bin\sur-f-aceflinger 触摸感应驱动

\system\bin\svc 服务

\system\bin\system_server

\system\bin\telnetd Telnet组件

\system\bin\toolbox

\system\bin\wlan_loader

\system\bin\wpa_cli

\system\bin\wpa_supplicant

\system\etc

从文件夹名称来看保存的都是系统的配置文件,比如APN接入点设置等核心配置。

\system\etc\apns-conf.xml APN接入点配置文件

\system\etc\AudioFilter.csv 音频过滤器配置文件

\system\etc\AudioPara4.csv

\system\etc\bookmarks.xml 书签数据库

\system\etc\dbus.conf 总线监视配置文件

\system\etc\dhcpcd

\system\etc\event-log-tags

\system\etc\favorites.xml 收藏夹

\system\etc\firmware 固件信息

\system\etc\gps.conf GPS设置文件

\system\etc\hcid.conf 内核HCID配置文件

\system\etc\hosts 网络DNS缓存

\system\etc\init.goldfish.sh

\system\etc\location 定位相关

\system\etc\mountd.conf 存储挂载配置文件

\system\etc\NOTICE.html 提示网页

\system\etc\permissions.xml 权限许可

\system\etc\pvplayer.conf

\system\etc\security

\system\etc\wifi WLAN相关组件

\system\etc\dhcpcd\dhcpcd-hooks

\system\etc\dhcpcd\dhcpcd-run-hooks

\system\etc\dhcpcd\dhcpcd.conf

\system\etc\dhcpcd\dhcpcd-hooks\01-test

\system\etc\dhcpcd\dhcpcd-hooks\20-dns.conf

\system\etc\dhcpcd\dhcpcd-hooks\95-configured

\system\etc\firmware\brf6300.bin

\system\etc\location\gps

\system\etc\location\gps\location 定位相关

\system\etc\location\gps\nmea GPS数据解析

\system\etc\location\gps\properties

\system\etc\security\cacerts.bks

\system\etc\security\otacerts.zip OTA下载验证

\system\etc\wifi\Fw1251r1c.bin

\system\etc\wifi\tiwlan.ini

\system\etc\wifi\wpa_supplicant.conf WPA验证组件

\system\fonts

字体文件夹,除了标准字体和粗体、斜体外可以看到文件体积最大的可能是中文字库,或一些unicode字库,从T-Mobile G1上可以清楚的看到显示简体中文正常,其中DroidSansFallback.ttf文件大小

\system\fonts\DroidSans-Bold.ttf

\system\fonts\DroidSans.ttf

\system\fonts\DroidSansFallback.ttf

\system\fonts\DroidSansMono.ttf

\system\fonts\DroidSerif-Bold.ttf

\system\fonts\DroidSerif-BoldItalic.ttf

\system\fonts\DroidSerif-Italic.ttf

\system\fonts\DroidSerif-Regular.ttf

\system\framework

framework主要是一些核心的文件,从后缀名为jar可以看出是是系统平台框架。

\system\framework\am.jar

\system\framework\am.odex

\system\framework\android.awt.jar AWT库

\system\framework\android.awt.odex

\system\framework\android.policy.jar

\system\framework\android.policy.odex

\system\framework\android.test.runner.jar

\system\framework\android.test.runner.odex

\system\framework\com.google.android.gtalkservice.jar GTalk服务

\system\framework\com.google.android.gtalkservice.odex

\system\framework\com.google.android.maps.jar 电子地图库

\system\framework\com.google.android.maps.odex

\system\framework\core.jar 核心库,启动桌面时首先加载这个

\system\framework\core.odex

\system\framework\ext.jar

\system\framework\ext.odex

\system\framework\framework-res.apk

\system\framework\framework-tests.jar

\system\framework\framework-tests.odex

\system\framework\framework.jar

\system\framework\framework.odex

\system\framework\input.jar 输入库

\system\framework\input.odex

\system\framework\itr.jar

\system\framework\itr.odex

\system\framework\monkey.jar

\system\framework\monkey.odex

\system\framework\pm.jar 包管理库

\system\framework\pm.odex

\system\framework\services.jar

\system\framework\services.odex

\system\framework\ssltest.jar

\system\framework\ssltest.odex

\system\framework\svc.jar 系统服务

\system\framework\svc.odex

\system\lib

lib目录中存放的主要是系统底层库,如平台运行时库。

\system\lib\libaes.so

\system\lib\libagl.so

\system\lib\libandroid_runtime.so Android运行时库

\system\lib\libandroid_servers.so 系统服务组件

\system\lib\libaudio.so 音频处理

\system\lib\libaudioeq.so EQ均衡器

\system\lib\libaudioflinger.so 音频过滤器

\system\lib\libbluetooth.so 蓝牙组件

\system\lib\libc.so

\system\lib\libcamera.so 超相机组件

\system\lib\libcameraservice.so

\system\lib\libcorecg.so

\system\lib\libcrypto.so 加密组件

\system\lib\libctest.so

\system\lib\libcutils.so

\system\lib\libdbus.so

\system\lib\libdl.so

\system\lib\libdrm1.so DRM解析库

\system\lib\libdrm1_jni.so

\system\lib\libdvm.so

\system\lib\libexif.so

\system\lib\libexpat.so

\system\lib\libFFTEm.so

\system\lib\libGLES_CM.so

\system\lib\libgps.so

\system\lib\libhardware.so

\system\lib\libhgl.so

\system\lib\libhtc_ril.so

\system\lib\libicudata.so

\system\lib\libicui18n.so

\system\lib\libicuuc.so

\system\lib\liblog.so

\system\lib\libm.so

\system\lib\libmedia.so

\system\lib\libmediaplayerservice.so

\system\lib\libmedia_jni.so

\system\lib\libnativehelper.so

\system\lib\libnetutils.so

\system\lib\libOmxCore.so

\system\lib\libOmxH264Dec.so

\system\lib\libpixelflinger.so

\system\lib\libpvasf.so

\system\lib\libpvasfreg.so

\system\lib\libpvauthor.so

\system\lib\libpvcommon.so

\system\lib\libpvdownload.so

\system\lib\libpvdownloadreg.so

\system\lib\libpvmp4.so

\system\lib\libpvmp4reg.so

\system\lib\libpvnet_support.so

\system\lib\libpvplayer.so

\system\lib\libpvrtsp.so

\system\lib\libpvrtspreg.so

\system\lib\libqcamera.so

\system\lib\libreference-ril.so

\system\lib\libril.so

\system\lib\librpc.so

\system\lib\libsgl.so

\system\lib\libsonivox.so

\system\lib\libsoundpool.so

\system\lib\libsqlite.so

\system\lib\libssl.so

\system\lib\libstdc++.so

\system\lib\libsur-f-aceflinger.so

\system\lib\libsystem_server.so

\system\lib\libthread_db.so

\system\lib\libUAPI_jni.so

\system\lib\libui.so

\system\lib\libutils.so

\system\lib\libvorbisidec.so

\system\lib\libwbxml.so

\system\lib\libwbxml_jni.so

\system\lib\libwebcore.so

\system\lib\libwpa_client.so

\system\lib\libxml2wbxml.so

\system\lib\libz.so

\system\lib\modules

\system\lib\modules\wlan.ko

\system\media

铃声音乐文件夹,除了常规的铃声外还有一些系统提示事件音

\system\media\audio

\system\media\audio\alarms 闹铃音

\system\media\audio\notifications 提示音

\system\media\audio\ringtones 铃声

\system\media\audio\ui 界面操作事件音

\system\media\audio\alarms\Alarm_Beep_01.ogg

\system\media\audio\alarms\Alarm_Beep_02.ogg

\system\media\audio\alarms\Alarm_Beep_03.ogg

\system\media\audio\alarms\Alarm_Buzzer.ogg

\system\media\audio\alarms\Alarm_Classic.ogg

\system\media\audio\alarms\Alarm_Rooster_02.ogg

\system\media\audio\notifications\Beat_Box_Android.ogg

\system\media\audio\notifications\CaffeineSnake.ogg

\system\media\audio\notifications\DearDeer.ogg

\system\media\audio\notifications\DontPanic.ogg

\system\media\audio\notifications\F1_MissedCall.ogg

\system\media\audio\notifications\F1_New_MMS.ogg

\system\media\audio\notifications\F1_New_SMS.ogg

\system\media\audio\notifications\Heaven.ogg

\system\media\audio\notifications\Highwire.ogg

\system\media\audio\notifications\KzurbSonar.ogg

\system\media\audio\notifications\OnTheHunt.ogg

\system\media\audio\notifications\TaDa.ogg

\system\media\audio\notifications\Tinkerbell.ogg

\system\media\audio\notifications\Voila.ogg

\system\media\audio\ringtones\BeatPlucker.ogg

\system\media\audio\ringtones\BentleyDubs.ogg

\system\media\audio\ringtones\BirdLoop.ogg

\system\media\audio\ringtones\CaribbeanIce.ogg

\system\media\audio\ringtones\CrazyDream.ogg

\system\media\audio\ringtones\CurveBall.ogg

\system\media\audio\ringtones\DreamTheme.ogg

\system\media\audio\ringtones\EtherShake.ogg

\system\media\audio\ringtones\FriendlyGhost.ogg

\system\media\audio\ringtones\GameOverGuitar.ogg

\system\media\audio\ringtones\Growl.ogg

\system\media\audio\ringtones\InsertCoin.ogg

\system\media\audio\ringtones\LoopyLounge.ogg

\system\media\audio\ringtones\LoveFlute.ogg

\system\media\audio\ringtones\MidEvilJaunt.ogg

\system\media\audio\ringtones\MildlyAlarming.ogg

\system\media\audio\ringtones\NewPlayer.ogg

\system\media\audio\ringtones\Noises1.ogg

\system\media\audio\ringtones\Noises2.ogg

\system\media\audio\ringtones\Noises3.ogg

\system\media\audio\ringtones\OrganDub.ogg

\system\media\audio\ringtones\Ring_Classic_02.ogg

\system\media\audio\ringtones\Ring_Digital_02.ogg

\system\media\audio\ringtones\Ring_Synth_02.ogg

\system\media\audio\ringtones\Ring_Synth_04.ogg

\system\media\audio\ringtones\RomancingTheTone.ogg

\system\media\audio\ringtones\SitarVsSitar.ogg

\system\media\audio\ringtones\SpringyJalopy.ogg

\system\media\audio\ringtones\T-Jingle.ogg

\system\media\audio\ringtones\Terminated.ogg

\system\media\audio\ringtones\TwirlAway.ogg

\system\media\audio\ringtones\VeryAlarmed.ogg

\system\media\audio\ringtones\World.ogg

\system\media\audio\ui\Effect_Tick.ogg

\system\sounds

默认的音乐测试文件,仅有一个test.mid文件,用于播放测试的文件。

\system\sounds\test.mid

\system\usr

用户文件夹,包含共享、键盘布局、时间区域文件等。

\system\usr\keychars

\system\usr\keylayout

\system\usr\share

\system\usr\srec

\system\usr\keychars\qwerty.kcm.bin

\system\usr\keychars\qwerty2.kcm.bin

\system\usr\keychars\trout-keypad-qwertz.kcm.bin

\system\usr\keychars\trout-keypad-v2.kcm.bin

\system\usr\keychars\trout-keypad-v3.kcm.bin

\system\usr\keychars\trout-keypad.kcm.bin

\system\usr\keylayout\h2w_headset.kl

\system\usr\keylayout\qwerty.kl

\system\usr\keylayout\trout-keypad-qwertz.kl

\system\usr\keylayout\trout-keypad-v2.kl

\system\usr\keylayout\trout-keypad-v3.kl

\system\usr\keylayout\trout-keypad.kl

\system\usr\share\bsk

\system\usr\share\zoneinfo

\system\usr\share\bsk\V_FD_speed_101.bsk

\system\usr\share\bsk\V_FD_std_101.bsk

\system\usr\share\zoneinfo\zoneinfo.dat

\system\usr\share\zoneinfo\zoneinfo.idx

\system\usr\srec\config

\system\usr\srec\config\en.us

\system\usr\srec\config\en.us\baseline.par

\system\usr\srec\config\en.us\baseline11k.par

\system\usr\srec\config\en.us\baseline8k.par

\system\usr\srec\config\en.us\dictionary

\system\usr\srec\config\en.us\g2p

\system\usr\srec\config\en.us\grammars

\system\usr\srec\config\en.us\models

\system\usr\srec\config\en.us\dictionary\basic.ok

\system\usr\srec\config\en.us\dictionary\cmu6plus.ok.zip

\system\usr\srec\config\en.us\dictionary\enroll.ok

\system\usr\srec\config\en.us\g2p\en-US-ttp.data

\system\usr\srec\config\en.us\grammars\VoiceDialer.g2g

\system\usr\srec\config\en.us\models\generic.swiarb

\system\usr\srec\config\en.us\models\generic11.lda

\system\usr\srec\config\en.us\models\generic11_f.swimdl

\system\usr\srec\config\en.us\models\generic11_m.swimdl

\system\usr\srec\config\en.us\models\generic8.lda

\system\usr\srec\config\en.us\models\generic8_f.swimdl

\system\usr\srec\config\en.us\models\generic8_m.swimdl

上一篇: 王者露娜游戏;王者露娜玩法口诀
下一篇: 欧意怎么下载安装、欧意官网

为您推荐