安卓APP逆向分析与保护机制是怎样的

想知道Android App常见的保护方法及其对应的逆向分析方法吗?

安卓APP安全包含很多内容,本次分享了混淆代码、整体Dex加固、拆分 Dex 加固、虚拟机加固等方面。事实上,这些内容也是国内近几年Android App安全保护的一种主要趋势。

一、混淆代码

Java代码是非常容易反编译的,作为一种跨平台的、解释型语言,Java 源代码被编译成中间“字节码”存储于class文件中。由于跨平台的需要,这些字节码带有许多的语义信息,很容易被反编译成Java源代码。为了很好地保护Java源代码,开发者往往会对编译好的class文件进行混淆处理。

混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。ProGuard就是一个混淆代码的开源项目,能够对字节码进行混淆、缩减体积、优化等处理。

Proguard处理流程图如下所示,包含压缩、优化、混淆、预检四个主要环节:

安卓APP逆向分析与保护机制是怎样的

压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute);

优化(Optimize):对字节码进行优化,移除无用的指令。优化代码,非入口节点类会加上private/static/final,没有用到的参数会被删除,一些方法可能会变成内联代码;

混淆(Obfuscate):使用a、b、c、d这样简短而无意义的名称,对类、字段和方法进行重命名;

预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。

在分享中,钟亚平展示了利用Proguard,对Dex2jar进行反编译处理后的Apk效果示例:

安卓APP逆向分析与保护机制是怎样的
Proguard处理后

安卓APP逆向分析与保护机制是怎样的

Proguard混淆器不仅能够保护代码,而且能够精简编译后的程序大小,减少内存占用。

混淆代码逆向分析

如果想要反编译混淆代码,钟亚平分享了一个国外的工具DEGUADR,它能够通过统计的方式来解混淆。虽然这个工具的正确率达不到100%,但是能在一定程度上帮助反编译代码。

安卓APP逆向分析与保护机制是怎样的

使用DEGUADR解混淆的示例:

安卓APP逆向分析与保护机制是怎样的

com.xxxxx.common.util.CryptoUtil网站也提供了一种反编译服务,如下所示:

java.lang.String a(byte[]) -> encodeToStringjava.lang.String a(byte[],boolean,java.lang.String) -> a byte[] a(byte[],byte[]) -> encrypt byte[] b(byte[]) -> getKey byte[] b(byte[],byte[]) -> decrypt byte[] d(java.lang.String) -> getKey java.lang.String a(byte,char[]) -> a java.lang.String a(java.io.File) -> getHash java.lang.String a(java.lang.String) -> c java.lang.String b(java.lang.String) -> encode

二、整体Dex加固

为了加强Android保护强度,随着安全技术的发展,又出现了新型的“加固技术”。DEX加固是对DEX文件进行加壳防护,防止被静态反编译工具破解而泄露源码,最刚开始出现的是整体加固技术方案。

安卓APP逆向分析与保护机制是怎样的

整体加固技术的原理如上所示,包括替换application/classes.dex、解密/动态加载原classes.dex、调用原application相关方法、将原application对象/名称设置到系统内部相关变量四大环节。其中最为关键的一步就是解密/动态加载原classes.dex,通过加密编译好的最终dex源码文件,然后在一个新项目中用新项目的application启动来解密原项目代码并加载到内存中,再把当前进程替换为解密后的代码,能够很好地隐藏源码并防止直接性的反编译。

整体Dex加固逆向分析

整体Dex加固逆向分析有两种常用的方法。其一是在内存中暴力搜索 dexn035,再 dump。以下是在32位系统中的效果示例:

安卓APP逆向分析与保护机制是怎样的

另一种方法就是通过HookdvmDexFileOpenPartial(void* addr, int len, DvmDex**)。

三、拆分Dex加固

随着业务规模发展到一定程度,不断地加入新功能、添加新的类库,代码在急剧膨胀的同时,相应的apk包的大小也急剧增加,那么简单的整体加固方案就不能很好地满足安全需求,在整体加固方案之外又出现了拆分加固的技术方案。

安卓APP逆向分析与保护机制是怎样的

但是如上所示,dex文件在加固时,针对中间缺失的一部分数据会以解密后的数据来替换,有的时候这种拆分替换也会导致数据不准确。那么到底应该拆分什么样的数据呢?就需要了解一下dex文件的数据结构。

Dex文件结构极为复杂,以下图示选取了其中较为重要的内容。事实上,dex文件是一个以class为核心组装起来的文件,其中最重要的是classdata和classcode两部分,有其特定的接口和指令数据,选取这两部分来拆分的话,即使拆分出来也不会泄露class数据和字节码数据,反编译出来也不完整,安全性较高。

安卓APP逆向分析与保护机制是怎样的

拆分Dex加固逆向分析

对于dex拆分加固的逆向分析,如下所示,可以用classdata替换从而组装成新的dex文件,虽然和原来的dex文件不会完全一致,但也在一定程度上复原了被拆分数据的样子。

安卓APP逆向分析与保护机制是怎样的

但要注意的是,这种方法仅适用于被拆分出去的数据变形一次性完成,也就是说,在有其他保护思路的情况下尽量避免使用,而且即使有需要也尽量选在用到这个类的时候才去恢复。

此外还有一个更底层一些的工具dexhunter,这个工具较为前卫,但同时也有一些局限性,譬如部分指令数据会被优化,形成的代码界面不是很美观等等。

安卓APP逆向分析与保护机制是怎样的

四、虚拟机加固

虚拟机加固也属于dex拆分加固的一种,它是对字节做了一些变化处理。如下所示,这是一个正常安卓系统中的代码,在其中进行了虚拟机加固操作:

安卓APP逆向分析与保护机制是怎样的

以add-int v0, v1, v2、sub-int v0, v1, v2、mul-int v0, v1, v2这三条指令进行替换,然后进行加固编译,这样子操作后,即使把替换后的数据恢复了,也不会以add-int v0, v1, v2、sub-int v0, v1, v2、mul-int v0, v1, v2这三条指令进行替换,然后进行加固编译,这样子操作后,即使把替换后的数据恢复了,也不会变形成为之前的字节码,安全系数较高。

虚拟机加固逆向分析—HOOK JNI 接口

这种方式下的逆向分析,一方面可以通过HOOK JNI 接口来实现,它有两种实现方式。

其一是类成员/静态变量操作相关接口,比如:

GetStaticDoubleFieldSetStaticDoubleField GetDoubleField SetDoubleField …

(byte, object, int,long…)

其二是反射调用类方法,比如:

CallVoidMethodACallBooleanMethodA CallShortMethodA CallObjectMethodA …

CallStaticVoidMethodACallStaticBooleanMethodA CallStaticShortMethodA CallStaticObjectMethodA …

(byte, int, long,double …)

CallObjectMethodA(JNIEnv* env, jobject object, jmethoID method, …)

安卓APP逆向分析与保护机制是怎样的
通过HOOKJNI 接口实现虚拟机加固逆向分析

通过HOOK JNI 接口不用逆向底层,就可以了解APP大致的调用流程。但是对于复杂的调用过程,或者虚拟化方法数量较多的情况,这种逆向分析手段看起来会比较混乱;对于不需要返射到Java层执行的指令,如算术、逻辑运算等,则无法监控到。

虚拟机加固逆向分析—分析指令操作码映射

另一方面,也可以通过分析指令操作码映射来逆向分析。在同一加固版本,或者映射关系相同的情况下,可以采取以下所示的方法:

安卓APP逆向分析与保护机制是怎样的

但在实际情况中,每次加固时的映射关系都是随机变化的,如下所示,这种情况下就无法直接建立映射关系。

安卓APP逆向分析与保护机制是怎样的

不依赖于操作码的映射关系只与虚拟机结构有关,所以需要根据偏移关系建立映射关系,从而进行逆向分析。

安卓APP逆向分析与保护机制是怎样的

安卓APP逆向分析与保护机制是怎样的

上述就是小编为大家分享的安卓APP逆向分析与保护机制怎样的了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

文章标题:安卓APP逆向分析与保护机制是怎样的,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/24583

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月13日 下午11:34
下一篇 2022年9月13日 下午11:35

相关推荐

  • MySQL读写分离基本原理是什么

    一、读写分离工作原理 在一些大型网站业务场景中,单台数据库服务器所能提供的并发量已经无法满足业务需求,为了满足这种情况,一般而言是通过主从同步的方式来同步数据,在此基础上,通过读写分离来提升数据库的并发和负载能力。 一般而言,业务场景下对数据库的查询操作要远远高于增、删和改,并且读操作对数据库的影响…

    2022年9月13日
    57100
  • 如何进行bee-box LDAP注入的环境配置

    一、综述 按照我的学习过程来说,我必须知道我进行web攻击的这个模型和漏洞的原理是什么,现在我就碰到个冷门,最初见到LDAP时是某次在某国企的渗透测试中发现一个冷门(经过授权的),激起了我对它的兴趣。 LDAP的概念: 全称:轻量级目录访问协议(Lightweight Directory Acces…

    2022年9月18日
    68900
  • word页面颜色如何更改

    word页面颜色更改方法: 1、首先进入word然后点击屏幕上方的“页面布局”。 2、然后点击“页面颜色”。 3、选择自己喜欢的颜色。 4、你也可以点击其他颜色,选择自己喜欢但是没有的颜色。 5、最后返回word界面就可以看到颜色已经更改完成了。 关于“word页面颜色如何更改”的内容就介绍到这里了…

    2022年9月19日
    85800
  • 如何进行移动app安全评估检测技术分析

    由于现今的网络技术日益发达,安卓 APP 的安全也有很多隐患,这些都需要我们不断地去注意,从而提高其安全性。人们基于系统程序、系统数据、基础业务的安全性以及应用程序出现的漏洞这几个方面,来不断地完善并且构成一个更加安全、稳定、完整的移动 APP 监测系统来确保移动 APP 的安全性,其将作为“恶意伤…

    2022年9月15日
    99100
  • 电脑蓝屏代码0x00000023如何解决

    解决方法: 方法一: 1、首先可以重启电脑,然后按住键盘的“F8”,不松手直到出现其他界面。 2、如果可以使用鼠标就点击“最后一次正确的配置”回车进入,如果不能的话就使用键盘的方向键。 3、要是使用这种方法也进不去系统,那就可能是磁盘出现了问题,需要修复磁盘。 方法二: 1、再次使用上面的方法进入这…

    2022年9月16日
    70100
  • Redis单机安装和哨兵模式集群安装怎么实现

    1、Redis单机版安装 1.1:下载安装包 cd /usr/local/src/wget https://download.redis.io/releases/redis-5.0.13.tar.gz 看到redis-5.0.13.tar.gz 文件就说明下载成功了 1.2:解压安装包 tar -z…

    2022年9月18日
    70400
  • windows 0x00000124蓝屏代码怎么解决

    解决方法: 方法一: 1、我们可以在上图位置看到具体错误文件的名称,所以我们可以在电脑中先找到它。 2、如果我们发现是版本更新的问题,那么可以尝试在网络上下载一个最新版本。 3、如果不是版本问题,那么右键选中该文件,点击“属性”进入属性设置。 4、然后点击上方“安全”选项卡,点击下方的“编辑” 5、…

    2022年9月16日
    95900
  • MySQL学习之日期函数怎么使用

    获取 系统时间 函数 “NOW()” 函数 能够获得当前系统日期和时间,格式如下:“YYYY-MM-DD hh:mm:ss” (这里的小时单位是 24 小时制) “CURDATE()” 函数 能够获取到当前系统的日期,格式如下:“YYYY-MM-DD” “CURTIME()” 函数 能够获得当前系统…

    2022年9月2日
    64500
  • 怎么使用Python处理KNN分类算法

    KNN分类算法的介绍 KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法,是一个概念极其简单,而分类效果又很优异的分类算法。 他的核心思想就是,要确定测试样本属于哪一类,就寻找所有训练样本中与该测试样本“距离”最近的前K个样本,然后看这K个样本大部…

    2022年9月8日
    49200
  • Redis发布订阅实例分析

    Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 订阅/发布消息图: 名列前茅个对象:消息发送者。第二个对象:频道。第三个对象:消息订阅者。 下图展示了频道 channel1 , 以及订阅这个频…

    2022年9月26日
    89000
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部