前言 Android 系统安全愈发重要,像传统pc安全的可执行文件加固一样,应用加固是Android系统安全中非常重要的一环。 目前Android 应用加固可以分为dex加固和Native加固,Native 加固的保护对象为 Native 层的 SO 文件,使用加壳、反调试、混淆、VM 等手段增加SO文件的反编译难度。 目前最主流的 SO 文件保护方案还是加壳技术, 在SO文件加壳和脱壳的攻防技术领域,最重要的基础的便是对于 Linker 即装载链接机制的理解。 加壳技术 在病毒和版权保护领域,“壳”一直扮演着极为重要的角色。通过加壳可以对代码进行压缩和加密,同时再辅以虚拟化、代码混淆和反调试等手段,达到防止静态和动态分析。 在 Android 环境中,Native 层的加壳主要是针对动态链接库 SO,SO 加壳的示意图如下: ? 加壳工具、loader、被保护SO。 SO: 即被保护的目标 SO。
概述 现在使用Proguard进行混淆的代码,也很容易被破解,所以就出现了加固工具,让反编译的难度更大。但是有了加固技术,就会有反加固技术,正所谓道高一尺魔高一丈。 经过加固后的apk,通过 dex2jar反编译: 腾讯乐固: ? 360加固: ? 从上面可以看出,经过加固后的apk,通过常规方法反编译无法获取到源码。 下载地址: https://vxposed.com/ 脱壳 Step1: 将 VirtualXposed、 FDex2和需要脱壳的应用都安装到手机上。 Step6: 在 VirtualXposed中运行要脱壳的应用。 Step7: 脱壳后的dex文件: ? Step8: 通过 dex2jar对 脱壳的dex进行反编译: ? 从上图就可以看到脱壳后的dex文件被成功的反编译。
提供包括云服务器,云数据库在内的90+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。
但是有了加固技术,就会有反加固技术,正所谓道高一尺魔高一丈。 经过加固后的apk,通过dex2jar反编译: 腾讯乐固: legu.png 360加固: 360jiagu.png 从上面可以看出,经过加固后的apk,通过常规方法反编译无法获取到源码。 下载地址: https://vxposed.com/ 脱壳 Step1: 将VirtualXposed、FDex2和需要脱壳的应用都安装到手机上。 Step8: 通过dex2jar对 脱壳的dex进行反编译: shelling-dex2jar.png 从上图就可以看到脱壳后的dex文件被成功的反编译。 e.printStackTrace(); XposedBridge.log("文件写出失败"); } } } 参考链接 【手机端】腾讯乐固,360加固一键脱壳
脱壳存根(stub) 脱壳存根执行了以下三个步骤: (1)将原始程序脱壳到内存中 (2)解析原始可执行文件的所有导入函数 (3)将可执行程序转移到原始的程序入口点(OEP) 手动查找OEP 查找尾部跳转指令 最简单的手动查找策略就是查找尾部跳转指令,当脱壳存根开始运行时,尾部跳转指令跳转的地址不包含有效指令,但是一旦原程序运行就肯定包含有效的指令。 多数脱壳器会使用GetProcess函数来解析原始函数的导出表。在该函数上设置断点可以使你绕过脱壳存根的开头代码。 在原始程序调用且继续向后工作的函数上设置断点。 使用OllyDbg的RunTrace选项 手动修复导入表 导入表在内存中实际上有两个表: 函数名称或者序号列表,其中包含加载器或脱壳存根所需要的函数名称或者序号 所有导入函数的地址列表。 常见的壳 UPX、ASPack、Petite、WinUpack(Upack)、Themida 脱壳exe和dll的区别 DLL中的OEP是DllMain原始函数的开始地址,加壳DLL列出的开始地址是脱壳存根中的一个地址
壳史 第一代壳 Dex加密 Dex字符串加密资源加密对抗反编译反调试自定义DexClassLoader 第二代壳 Dex抽取与So加固 对抗第一代壳常见的脱壳法Dex Method代码抽取到外部(通常企业版 )Dex动态加载So加密 第三代壳 Dex动态解密与So混淆 Dex Method代码动态解密So代码膨胀混淆对抗之前出现的所有脱壳法 第四代壳 arm vmp(未来) vmp壳的识别 1.用加固厂商特征 android-unpacker https://github.com/strazzere/android-unpacker ? notifywait-for-Android https://github.com/mkttanabe/inotifywait-for-Android监视DexOpt输出 ? ? 静态脱壳机 分析壳so逻辑并还原加密算法 http://www.cnblogs.com/2014asm/p/4924342.html ?
而对于移动应用APP加密保护的问题,如何对DEX文件加密尤为重要。那么接下来,我们就先介绍一下什么是App加壳和加壳的原理,利与弊等。 一、什么是加壳? 三、Android Dex文件加壳原理 Android Dex文件大量使用引用给加壳带来了一定的难度,但是从理论上讲,Android APK加壳也是可行的。 在这个过程中,牵扯到三个角色: 1、加壳程序:加密源程序为解壳数据、组装解壳程序和解壳数据 2、解壳程序:解密解壳数据,并运行时通过DexClassLoader动态加载 3、源程序:需要加壳处理的被保护代码 Android 上的加壳技术发展至今也不过三年,而 PC 端的加壳技术已经有十多年的发展。 目前市面上有很多第三方加壳的平台, 如果应用需要加壳选哪一种好?
而对于移动应用APP加密保护的问题,如何对DEX文件加密尤为重要。那么接下来,我们就先介绍一下什么是App加壳和加壳的原理,利与弊等。 一、什么是加壳? 三、Android Dex文件加壳原理 ---- Android Dex文件大量使用引用给加壳带来了一定的难度,但是从理论上讲,Android APK加壳也是可行的。 在这个过程中,牵扯到三个角色: 加壳程序:加密源程序为解壳数据、组装解壳程序和解壳数据 解壳程序:解密解壳数据,并运行时通过DexClassLoader动态加载 源程序:需要加壳处理的被保护代码 四、加壳的利与弊 Android 上的加壳技术发展至今也不过三年,而 PC 端的加壳技术已经有十多年的发展。 目前市面上有很多第三方加壳的平台, 如果应用需要加壳选哪一种好?
安卓的加固方案是从 19 年底开始写的,到现在为止差不多快一年了,写这个目的还是学习怎么脱壳,前几个月再看雪看到有人直接分析壳来学习,不过我感觉从加壳写起也是一种浪漫。 (PS: 以后有时间会接着修改) 环境配置: Android studio v3.5.3 华为G621-TL00 android v4.4.4 第一代壳:落地加载 1、原理 a、原理很简单,就是首先将我们的 APK文件sourceApk.apk加壳完毕,加壳后DEX文件' + filename + '生成完毕') shell.close() if __name__ == '__main__ 第二代壳:不落地加载 1、原理 大体原理和第一代壳相同,和第一代壳不同的是,第一代壳将 dex 文件解密出来会保存到文件中,在通过 DexClassLoader 加载进内存中,而不落地加载直接重写DexClassLoader /p/ce20fa304e1e Android 插件化框架之动态加载 Activity(一): https://www.jianshu.com/p/1035ffd9e9cf Android APK 加固之动态加载
最近在做移动安全测试的项目时,遇到了最新的某数字壳,好久都没脱壳了,记得上次脱壳还是zjdroid通杀的时候。秉着安全研究的精神,趁此机会,又把最新的加固与脱壳技术过了一遍,然而并没有成功脱掉。 其中一个我感觉很有趣, 正是strazzere大神的android-unpacker,这是一款ndk写的动态Android脱壳的工具,原理简单来说就是ptrace,然后在内存中匹配特征码和odex的magic 3.我直接抛弃了android-unpacker中的壳的特征匹配这一整块儿内容。 4.android-unpacker只匹配和dump一次,而我引入了双循环机制,这点对我的脱壳成功也非常重要。 5.android-unpacker在peek_memory(下图)中进行magic匹配,我改了逻辑,换了一种匹配方式。 ? 6.另外我还增加了一匹配种方法,来增强匹配的成功率。 我找了三家公司的壳试了下,下面直接上效果图顺便说说工具怎么用: 1.这个工具就是ndk程序,所以要在Root后的Android环境下运行(虚拟机和实体机都可以) 2.一般来说,先让工具跑起来等着,第一个参数是包名
这是一款带壳的APP,打开之后要求强制升级最新版,否则无法使用,针对此APP可以进行脱壳后定位关键代码,然后重打包进行消除强制升级弹窗。 ? DEXDump三种使用模式脱壳 1、使用objection加载frida_dexdump objection -g com.xxx explore plugin load /root/.objection 如果关键字符串做了加密混淆,搜索大法也就无效了,可以使用wallbreaker内存可视化漫游,所见即所得。 四种模式: classdump 查看一个类的结构 classsearch 根据类名来找类 objectsearch 查看一个类的实例内容 objectdump 查看对象的属性 使用objection加载 修改源码重打包去强制升级 接着我们进行修改代码去掉升级框并重打包,首先因为是带壳的APP,无法直接使用apktool进行反编译,不然壳也会被反编译为smali。
一、加壳技术原理 所谓apk的加壳技术和pc exe的加壳原理一样,就是在程序的外面再包裹上另外一段代码,保护里面的代码不被非法修改或反编译,在程序运行的时候优先取得程序的控制权做一些我们自己想做的工作 (哈哈,跟病毒的原理差不多) PC exe的加壳原理如下: ? 二、android apk加壳实现 要想实现加壳需要解决的技术点如下: (1)怎么第一时间执行我们的加壳程序? (2)怎么将我们的加壳程序和原有的android apk文件合并到一起? 我们知道android apk最终会打包生成dex文件,我们可以将我们的程序生成dex文件后,将我们要进行加壳的apk和我们dex文件合并成一个文件,然后修改dex文件头中的checksum、signature 和file_size的信息,并且要附加加壳的apk的长度信息在dex文件中,以便我们进行解壳保证原来apk的正常运行。
从而实现第一层防护壳、加密壳的脱壳。 ;android程序在执行过程,使用到类时候,都需要进行加载,而在加载过程中,函数指令就会进行指令还原或修订函数指令指向的位置,我们可以利用这个时机,将代码拷贝到原代码位置,进而实现类抽取壳的脱壳。 自定义系统和定制的android设备方法: 1、采用定制的android的rom,可以有效对抗市场中所有的加密壳、类抽取类型的壳;相比开源的脱壳工具,大体都是基于hook框架,例如frida、Xposed 2、采用定制android硬件设备优势,基于android的开源性,google公司每次发布新版的rom,都会率先在Pixel、Nexus系列的设备上最早应用,这也导致大部分安全从业者为了提升工作效率, 通过定制android硬件设备,没有Nexus、pixel设备相关特征,更能提高脱壳的成功率。 E N D
01 概述 — 由于近期很多朋友问关于Android加壳与脱壳技术,这两天我就对目前主流的脱壳工具和加壳方法做了研究,就对目前的脱壳方法做个汇总和方法记录。 其实对于加壳的方案很多加固尝试都做了什么防动态调试等等措施,所以整体来讲,Android的加壳技术也提升了不少。 从图中可以看到,核心代码一个也没有,只反编译出了壳代码,这里很明显是qihoo,即360的免费加壳,查看stub包,里面包含了加载加密资源的路径和方法: ? 03 总结 通过对3款Android应用的脱壳工具的测试,效果最好的就是drizzleDumper 了,但未测试收费的加壳服务不知道能不能脱壳,后面有机会再测试,脱壳过程主要是研究各个工具的使用,均是利用工具自动化方式来实现 还有其他厂商的加固,如梆梆,腾讯,爱加密等,如果有兴趣也可以一一进行尝试。
加固技术: 第一代加固技术——混淆技术; 第二代加固技术——加壳技术(落地与不落地脱壳); 第三代加固技术——指令抽离; 第四代加固技术——指令转换,即VMP(虚拟软件保护)加固技术。 二代加固: 加壳是指给可执行文件加个外衣, 这个外衣就是壳程序. 壳程序先取得程序的控制权, 之后把加密的可执行程序在内存中解开为真正的程序并运行. VMP加固原理 从难度方面来说, 二代加固一般还有破解思路, 但到了四代加固这里, 一般的逆向脱壳技术全部失效, 你面对的是如何破解这个虚拟机. ---- apk加壳实例: apk加壳示例 apk加壳实例可以用上图来说明 这个dex有脱壳逻辑, 程序运行时, 首先运行这个脱壳dex, 脱壳dex从dex尾部获取到要加密的apk的大小, 然后从自己的dex中拷贝出这个myapk.apk, 最后调用Android系统API运行 这里再说下, 这种二代加壳是现在最简单的加壳方式, 也是最基本的加壳方式.
加固技术: 第一代加固技术——混淆技术; 第二代加固技术——加壳技术(落地与不落地脱壳); 第三代加固技术——指令抽离; 第四代加固技术——指令转换,即VMP(虚拟软件保护)加固技术。 二代加固: 加壳是指给可执行文件加个外衣, 这个外衣就是壳程序. 壳程序先取得程序的控制权, 之后把加密的可执行程序在内存中解开为真正的程序并运行. : [apk加壳示例] apk加壳实例可以用上图来说明, 我们把要加固的myapk.apk放到一个dex尾部. 这个dex有脱壳逻辑, 程序运行时, 首先运行这个脱壳dex, 脱壳dex从dex尾部获取到要加密的apk的大小, 然后从自己的dex中拷贝出这个myapk.apk, 最后调用Android系统API运行 这里再说下, 这种二代加壳是现在最简单的加壳方式, 也是最基本的加壳方式.
加固技术: 第一代加固技术——混淆技术; 第二代加固技术——加壳技术(落地与不落地脱壳); 第三代加固技术——指令抽离; 第四代加固技术——指令转换,即VMP(虚拟软件保护)加固技术。 二代加固: 加壳是指给可执行文件加个外衣, 这个外衣就是壳程序. 壳程序先取得程序的控制权, 之后把加密的可执行程序在内存中解开为真正的程序并运行. ? apk加壳实例可以用上图来说明, 我们把要加固的myapk.apk放到一个dex尾部. 这个dex有脱壳逻辑, 程序运行时, 首先运行这个脱壳dex, 脱壳dex从dex尾部获取到要加密的apk的大小, 然后从自己的dex中拷贝出这个myapk.apk, 最后调用Android系统API运行 这里再说下, 这种二代加壳是现在最简单的加壳方式, 也是最基本的加壳方式.
前言 说起壳可能有的同学并不太了解,简单的说,计算机软件领域所说的壳实际上是一种软件加密技术。 与自然界中的壳类似,花生用壳保护种子,乌龟用壳保护自己的身体,而我们写的程序为了在一定程度上防止被逆向分析,也可以给它加壳。 壳主要分为两大类:加密壳和压缩壳,加密壳侧重于防止软件被篡改,而压缩壳则侧重于减小软件体积。其实,在Windows上已经有许多壳了,但Android(或者可以说Linux)上的壳相对而言就少了一些。 本文就主要讲讲Android动态库(so文件)压缩壳要如何实现。 一、压缩 说到压缩,我们可能首先会想到一些常用的压缩工具,例如7-zip、WinRAR、tar等等。 二、加载 Android中so的加载全靠Linker,所以要理解so的加载过程,需要对Linker有一定的了解。
一本《Android软件安全权威指南》帮你搞定。 《Android软件安全权威指南》是何方神圣? 五年前,Android才刚刚开始普及;五年后,Android已经“雄霸天下”了。 在这五年中,软件保护技术从第一代壳——DEX加密、字符串加密、资源加密、反调试及自定义DexClassLoader,进化到第二代壳——DEX抽取与so加固、DEX Method代码抽取、DEX动态加载及 so加固,再进化到第三代壳——DEX动态解密与so混淆、DEX Method代码动态解密及so代码膨胀混淆,直至现在最流行的第四代壳——代码虚拟化保护,也就是《Android软件安全权威指南》主要与大家分享的基于 读者可以通过阅读这些实例的源码来加深对技术的理解。 实用工具的讲解。本书提倡多动手、多实践,而实践的内容之一就是掌握书中介绍的第三方工具。 如何学习本书 《Android软件安全权威指南》共12章,系统地讲解了与Android软件安全相关的环境搭建、文件格式、静态分析、动态调试、Hook与注入、软件保护技术、软件壳等主题。
直播 SDK 是腾讯云直播服务在移动场景的延伸,集成了腾讯云直播的推 / 拉流、主播观众互动连麦、主播跨房 PK 等能力,提供包括 iOS、Android、小程序、Web 等多种接入方式,为您提供针对移动场景的高质量直播服务,快速满足手机直播的需求。
扫码关注云+社区
领取腾讯云代金券