您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

Android逆向与安全——360 dex加固与脱壳

时间:2022-09-21 15:00:03  来源:今日头条  作者:Android秃老师

前言

现在市面上对App的安全合规管控越来越严格了,也就要求了APP在上架之前一定要做合规检测和加固处理。对APP就是加固的好处,可以提高APP的安全性,提高APP被逆向分析破解的门槛,同时通过加固保护可以提高过安全合规的检测。

由于APP加固技术不断被攻破情况,因此加固技术也是不断在快速迭代的过程。现在市面上的加固产品的还是比较多的,并且各个加固技术产品都有其各自优缺点,但是加固产品的所采用技术去有很多共性的地方。下面就对加固和脱壳对抗方案做些梳理总结。

Android 反编译的威胁

  • 逆向分析: 漏洞挖掘、协议分析
  • 二次打包: 盗版、破解、广告

保护方案

  • 代码混淆:JAVA代码、CC++带马甲、JShtml代码
  • 应用加固:DEX文件、SO文件、资源文件

APP构建过程中用到的工具

 

编译流程

  • java源码编译:通过javac将源码编译为.class文件
  • 多dex分包:脚本将类根据一定规则划分到主dex和从dex中,生成配置文件
  • proguard优化/混淆:对.class文件进行压缩、优化、混淆处理
  • 转化为dex文件:dxd8将.class文件转换为dex文件

DEX加固方案的演进

 

  • 动态加载:从服务器动态加载业务的DEX
  • DEX内存加载:模拟App启动的时候,将我们的壳、将业务DEX文件加载到内存中,然后通过一些处理方式,让DEX文件把Application启动起来,让应用认为和普通的启动方式是一样的 (缺点:DEX会暴露在内存中)
  • DEX指令抽取:把DEX文件中的一些方法的指令抽取出来,然后在内存中开辟一段区域,然后将我们内存加载的DEX解析到相应的方法指令偏移的地方,方法指令的偏移指向我们开辟的一段内存里面。(缺点:不彻底)
  • 虚拟机加固:我们通过自己实现一套虚拟机,将DEX方法的指令抽取出来,在运行的时候,我们的虚拟机里面就运行被抽取的一段指令。这样攻击者想要破解,首先必须要找到我们虚拟机的入口,将虚拟机整个逻辑还原出来,这样攻击成本相对比较高 (缺点:本身Android应用就运行在虚拟机里面,不论是Dalvik还是ART,增加个虚拟机,就会增加一层对应用运行时代码的解释执行操作,那么解释执行的效率会大大下降)
  • JAVA2C:提升应用运行时的效率,我们的方法会转换为一层在Native(JNI)上实现的逻辑,最终通过JNI编译成so,这样的话在本地执行,而不是在虚拟机执行,执行效率会大大提升。

360加固与脱壳流程

360整体加固classes.dex后的apk程序的特点,以超信1.1.4版本为例。360加固以后,会在apk的assets文件的路径下增加两个文件libjiagu.so和libjiagu_x86.so以及修改原apk的AndroidManifest.xml文件的application标签增加两个元素。

 

 

360加固脱壳需要完成两个任务,一个任务是过掉360加固的反调试,另外一个是获取原apk的classes.dex文件。下面写一下具体的脱壳步骤,完成这两个任务。为了脱壳成功,在动态调试加固apk程序前,需要将android_server调试程序的名字修改一下,因为360加固会通过查询/proc/pid/cmdline文件获取程序的名称来对android_server、gdb、ltrace、strace调试器进行反调试。

在动态调试加固apk程序的时候,需要在几个关键点函数 open、strtol、mmap、memcmp处下断点,后面具体的分析。由于android系统是由linux系统修改而来,因此Android系统上很多的属性和Linux系统下的属性。Linux下进程和线程的信息是保存在文件中的,因此要查询进程或者线程的信息必须通过open或者fopen等方式操作文件来完成。

Android的so调试的步骤略过,已经在上面提到的4个函数处下断点,注意下断点的技巧,下断点的时候,要在一个函数的第1条指令和最后一条指令的地方下断点。

 

F9运行程序,当看到下图的状态,调用open函数打开文件/proc/self/status时,可以确实是加固外壳apk程序通过TracePid的反调试。

 

过掉通过TracePid方式的反调试的方法是在strtol函数处下断点,在strstol函数的最后一行指令的地方,修改该函数的返回值R0的值为0即可,然后F9运行程序。

 

360加固的外壳程序apk还会通过文件/proc.NET/tcp的本地套接字进行反调试,一旦检测到程序有23946端口的本地连接的套接字,他就会结束当前程序,其实过这个方式的反调试的方法很多,修改远程调试的端口号就可以过掉反调试。

 


 

过掉通过/proc/net/tcp文件的本地套接字的反调试的方法是在open函数处下断点,然后F8单步调试发现strstr函数,加固的外壳apk程序就是通过strstr函数进行判断当前进程是否存在本地连接的套接字,一旦检测到,就结束当前进程。

 

发现程序循环调用strstr函数进行判断,当strstr函数的返回值不为0为字符串“sl local_address rem_address”时,需要注意,说明当前进程已经检测到了本地连接的套接字,因此需要修改strstsr函数的返回值为0即可。

 


 

加固apk程序还会通过"/proc/pid/mdline"对android_server、gdb、strace、ltrace调试器进行反调试,但是只要向前文提到的修改android_server的名称即可过掉该反调试。

 

过掉反调试的方法已经说明白了,下面只要F9运行,按照前面的方法过掉几次前面提到的反调试即可畅快的调试程序了。当发现当前进程调用open函数打开文件/proc/pid/maps需要注意了,脱壳需要关注的地方开始了。原被加固的dex文件开始解压和解密了。

 

经过几次F9的调试发现了下面截图的状态,但是不要心急,只是离脱壳进了一步,此时内存dump出来的odex文件不是被加固的原dex文件的而是加固外壳qihu360的dex文件。

 

继续F9运行程序,经过n次F9运行memcmp函数以后(其实这里可以做一个处理,暂时去掉mmap函数的断点,等到mmap函数断点处再次设置mmap函数的断点),再经过大约2次mmap函数运行以后,再一次调用memcmp函数即到了脱壳的地方,注意此时加固外壳apk程序呈现的堆栈和内存的状态。由于360加固自己制作了dvmDexFileOpenPartial函数,但是该函数需要调用memcmp进行dex文件的魔法字符串”dex“的比较,因此此时是脱壳的最佳时机。

 

OK,现在的任务就是从内存中dump出原来完整的dex文件,既可以手动的dump出内存中的dex文件,也可以通过IDC的脚本或者dumpdex的插件将原dex文件dump出来。

 

原apk程序的Dex文件拿到了,只需替换360加固的外壳程序的dex,删除AndroidManifest.xml文件的application标签增加的两个元素,删除assets文件的路径下增加两个文件libjiagu.so和libjiagu_x86.so以及原来的签名,重新签名一下apk程序即可。

在删除的application标签增加的元素中,特别是在删除android:name =””的时候,一定要检查脱壳的classes.Dex文件中否重写过application类,如果脱壳后的classes.Dex文件中重写了application类,需要将application标签中android:name=””修改过来才行。

以上就是有关dex加固的方法了,举例了360加固与脱壳流程。

 

文末

拓展学习

so加固

so反编译比较困难,比dex的反编译困难。一般做法是抽取Android工程的关键java代码转为c/c++, 然后生成so文件。so加密我只是了解了一下破坏.so部分头文件的方式加固。

加固里面的VMP(虚拟机)是什么?

VMP(虚拟软件保护技术)大概思路就是自定义一套虚拟机指令和对应的解释器,并将标准的指令转换成自己的指令,然后由解释器将自己的指令给对应的解释器。



Tags:Android   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言现在市面上对APP的安全合规管控越来越严格了,也就要求了APP在上架之前一定要做合规检测和加固处理。对APP就是加固的好处,可以提高APP的安全性,提高APP被逆向分析破解的门...【详细内容】
2022-09-21  Tags: Android  点击:(0)  评论:(0)  加入收藏
一丶Android多进程通信的应用场景? 保活 webview 加载图片 push推送 与系统服务通信二丶为什么要用binder Android系统内核是Linux内核 Linux内核进程通信有:管道、内存共享、...【详细内容】
2022-09-14  Tags: Android  点击:(12)  评论:(0)  加入收藏
Android 13上调最低内存要求 不到2GB RAM装不了GMS和去年的Windows 11类似,谷歌日前也对Android 13的最低硬件要求做出上调,意在提高门槛。简单来说,RAM现在最低2GB,ROM最低得是...【详细内容】
2022-09-10  Tags: Android  点击:(14)  评论:(0)  加入收藏
adb 常用命令 获取连接设备号:adb devices 列出设备所有已安装的包名 (不需root权限) adb shell “pm list packages”,可以加上grep 进行筛选(windows系统使用findstr /i "x...【详细内容】
2022-09-07  Tags: Android  点击:(23)  评论:(0)  加入收藏
通过本文可快速了解:1.为何使用 MVI2.为何最终考虑 SharedFlow 实现3.repeatOnLifecycle + SharedFlow 实现 MVI 思路为何使用 MVIMVI 是一响应式模型,通过唯一入口入参,并从唯...【详细内容】
2022-08-23  Tags: Android  点击:(30)  评论:(0)  加入收藏
IT之家8 月 17 日消息,昨日,谷歌已经向 Pixel 机型推送了 Android 13 正式版更新,该公司还宣布 Android 13 已经正式开源,Android 13 新系统的源代码已经上传到 Android 开源项...【详细内容】
2022-08-17  Tags: Android  点击:(40)  评论:(0)  加入收藏
IT之家8 月 16 日消息,今天谷歌已经向 Pixel 机型推送了 Android 13 正式版更新,该公司还宣布 Android 13 已经正式开源,Android 13 新系统的源代码已经上传到 Android 开源项...【详细内容】
2022-08-16  Tags: Android  点击:(41)  评论:(0)  加入收藏
本文最初发布于 Level Up Coding 博客。 在这篇文章中,我将谈谈为什么我在这个行业工作了近十年之后,永远地离开了 Android 开发。在开始之前,让我简单介绍下自己在这个领域的...【详细内容】
2022-08-11  Tags: Android  点击:(48)  评论:(0)  加入收藏
frameworks/base/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java public class KeyguardStatusView extends GridLayout { clockView12...【详细内容】
2022-08-09  Tags: Android  点击:(49)  评论:(0)  加入收藏
Android系统的层次架构非常清晰,其平台由应用程序、应用程序框架、系统库、Android运行时以及Linux内核5部分组成。 APPLICATIONS(应用程序)Android平台默认包含了主要的应用...【详细内容】
2022-08-07  Tags: Android  点击:(61)  评论:(0)  加入收藏
▌简易百科推荐
前言现在市面上对APP的安全合规管控越来越严格了,也就要求了APP在上架之前一定要做合规检测和加固处理。对APP就是加固的好处,可以提高APP的安全性,提高APP被逆向分析破解的门...【详细内容】
2022-09-21  Android秃老师  今日头条  Tags:Android   点击:(0)  评论:(0)  加入收藏
一丶Android多进程通信的应用场景? 保活 webview 加载图片 push推送 与系统服务通信二丶为什么要用binder Android系统内核是Linux内核 Linux内核进程通信有:管道、内存共享、...【详细内容】
2022-09-14  初壹十五a  今日头条  Tags:binder机制   点击:(12)  评论:(0)  加入收藏
前言大家好,我是小彭。过去两年,我们在掘金平台上发表过一些文章,小彭也收到了大家的意见和鼓励。最近,我会陆续搬运到公众号上。ViewBinding 是 Android Gradle Plugin 3.6 中...【详细内容】
2022-09-08  彭旭锐  今日头条  Tags:ViewBinding   点击:(34)  评论:(0)  加入收藏
adb 常用命令 获取连接设备号:adb devices 列出设备所有已安装的包名 (不需root权限) adb shell “pm list packages”,可以加上grep 进行筛选(windows系统使用findstr /i "x...【详细内容】
2022-09-07  Android不是安卓  今日头条  Tags:Android   点击:(23)  评论:(0)  加入收藏
一、各自的功能及用途ProgressBar:进度条,主要向用户展示当前任务的完成进度,例如游戏加载、app更新、文件下载等;SeekBar:进度条的升级款,与ProgressBar不同的是用户可以自行拖动...【详细内容】
2022-09-06  一起学安卓  今日头条  Tags:rogressBar   点击:(38)  评论:(0)  加入收藏
通过本文可快速了解:1.为何使用 MVI2.为何最终考虑 SharedFlow 实现3.repeatOnLifecycle + SharedFlow 实现 MVI 思路为何使用 MVIMVI 是一响应式模型,通过唯一入口入参,并从唯...【详细内容】
2022-08-23  KunMinX  掘金  Tags:Android   点击:(30)  评论:(0)  加入收藏
Android4.4版本后,Google 默认启用了SELinux, 并会把SELinux 审查异常打印在kernel log 或者 android log(L 版本)中,对应的关键字是: "avc: denied" 或者"avc: denied"。格式...【详细内容】
2022-08-17  怀揣梦想的自由开发者    Tags:SELinux   点击:(41)  评论:(0)  加入收藏
frameworks/base/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java public class KeyguardStatusView extends GridLayout { clockView12...【详细内容】
2022-08-09  积硅步以致1000里    Tags:Android   点击:(49)  评论:(0)  加入收藏
Android系统的层次架构非常清晰,其平台由应用程序、应用程序框架、系统库、Android运行时以及Linux内核5部分组成。 APPLICATIONS(应用程序)Android平台默认包含了主要的应用...【详细内容】
2022-08-07  看我小评论    Tags:android   点击:(61)  评论:(0)  加入收藏
方法一:修改ro.product.model的值,在build\tools\buildinfo.sh发现ro.product.name对应的宏的名称,此处为PRODUCT_MODELecho “ro.product.model=$PRODUCT_MODEL”在device\med...【详细内容】
2022-08-03  积硅步以致1000里    Tags:Android   点击:(69)  评论:(0)  加入收藏
站内最新
站内热门
站内头条