app安卓加壳原理及常用脱壳方法介绍

文章目录

  • app安卓加壳原理及常用脱壳方法介绍
    • 前言
    • 1 加壳
      • 1.1 什么是加壳
      • 1.2 加壳作用
      • 1.3 加壳原理
      • 1.4 加壳后的利与弊
      • 1.5 如何辨别是否加壳
    • 2 脱壳
      • 2.1 脱壳原理
      • 2.2 常用脱壳软件
        • 2.2.1 反射大师
      • 2.3 脱壳后分析
        • 2.3.1 Dex2Java
        • 2.3.2 Dex2Smali
    • 3 总结

前言

目前针对移动应用市场上安卓APP被破解、反编译、盗版丛生的现象,很多APP开发人员已经意识到保护APP的重要性。而对于移动应用APP加密保护的问题,如何对DEX文件加密尤为重要。对APP进行加壳能有效地遏制APP被反编译破解的行为。

1 加壳

1.1 什么是加壳

加壳是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作。大多数病毒就是基于此原理。是应用加固的一种手法对原始二进制原文进行加密/隐藏/混淆。

1.2 加壳作用

加壳的程序可以有效阻止对程序的反汇编分析,以达到它不可告人的目的。这种技术也常用来保护软件版权,防止被软件破解。

1.3 加壳原理

市面上主要的加壳原理:将原Dex文件加密,加密后的Dex文件和壳Dex文件一起重新打包,产生新的Dex文件。安卓虚拟机加载的时候,会从壳Dex文件的ProxyApplication类开始,执行attachBaseContext方法和onCreate方法。而壳Dex文件会在这两个方法里面实现原Dex文件的还原和加载,让虚拟机顺利启动APP。

在这个过程中,牵扯到三个角色:

1、加壳程序:加密源程序为解壳数据、组装解壳程序和解壳数据
2、解壳程序:解密解壳数据,并运行时通过DexClassLoader动态加载
3、源程序:需要加壳处理的被保护代码

1.4 加壳后的利与弊

优势:

①、保护自己核心代码算法,提高破解/盗版/二次打包的难度

②、还可以缓解代码注入/动态调试/内存注入攻击

劣势:

①、影响兼容性

②、影响程序运行效率

1.5 如何辨别是否加壳

目前分辨加壳主要有以下两种方法:

一、使用加固检测软件检测,如:ApkScan-PKID
二、使用代码查看工具查看apk的目录结构,如:jadx

1、ApkScan-PKID

ApkScan-PKID使用非常简单,直接把我们的Apk文件拉到软件界面内即可,这里用安居客-15.5.2为例

2、反编译apk查看包结构

这里直接将apk文件拉入jadx中,查看包目录结构十分简洁,且有一些与加载原Dex相关的方法

2 脱壳

2.1 脱壳原理

跟java类似,安卓的class都是由Classloader的loadClass方法加载的。跟java不同的是,每一个class对象都会有对应的dex对象属性跟相应的dex文件关联起来。利用xposed,将loadClass方法劫持住,每当loadClass方法调用完成后,用xposed执行后置方法。获取方法加载的class对象,然后调用getDex方法。拿到对应的dex文件引用,最后将dex文件序列成byte数据,写到自定义保存文件里面去。就能拿到脱壳后的dex文件。

2.2 常用脱壳软件

这里列举三个常用的脱壳软件:

一、反射大师 (需要搭建xposed环境)
二、DumpDex (需要搭建xposed环境且在真机下运行)
三、FRIDA-DEXDump(需要搭建frida环境)

下面介绍一下反射大师的使用方法。

2.2.1 反射大师

介绍

反射大师,一个 脱壳插件工具,需要在 Xposed 环境中使用,支持市面上大多数加密壳。

使用方法

一、手机或模拟器安装xposed环境
二、安装反射大师,xposed内部勾选反射大师模块,重启模拟器
三、打开反射大师选择目标app
四、打开目标app进入到主界面
五、选择当前ACTIVITY
六、长按写出Dex约两秒后释放,然后点击确定
七、dex文件可以直接拉到jadx查看源码

2.3 脱壳后分析

经过上一步的脱壳操作,我们获取到了多个dex文件,接下来这些dex文件我们可以直接一个一个拖入jadx进行分析,在jadx中可以直接看到其内部的java代码。但是这样对于我们而言太麻烦了,像上面安居客的例子,我们获得了 16个dex,假如我们一个一个拖进jadx中分析,将会耗费我们大量的精力,因此我们需要对这些dex文件进行二次加工,加工细分为以下两个方向:

一、将多个dex使用jadx合并为单个sources文件,然后使用IDE软件进行查看(java层代码静态分析)二、将多个dex使用baksmali.jar转为smali代码,结合apktool得到项目文件,替换相关smali文件后可用于动态调试

2.3.1 Dex2Java

准备工作

1、jadx文件

jadx文件我们可以通过直接在github项目中下载,如图下载最新版本的jadx-x.x.x.zip,解压后的bin目录中即可看到

2、Dex2Java脚本

该脚本用于将多个dex合并为单个sources文件

自编写如下:

Dex2Java.py

import os, sysif __name__ == "__main__":if len(sys.argv) < 2 :print("start error!start need 2 arguments!")sys.exit()print(sys.argv[1])
path = os.path.split(__file__)[0] + '\\'
print(path)
files= os.listdir(path)
for file in files: if file.find(".dex") > 0: sh = sys.argv[1] + ' -j 1 -r -d ' + path + " " + path + fileprint(sh)os.system(sh)

ps:该python脚本执行时需要传入jadx文件的绝对路径

具体使用

1、通过2.2.1章节我们使用反射大师获取了多个dex文件,我们将Dex2Java.py放入这些dex文件的同一个文件夹中

2、该目录下执行Dex2Java.py并传入jadx的绝对路径,我这里为C:\Users\admin\Desktop\jadx\bin\jadx

Dex2Java.py C:\Users\admin\Desktop\jadx\bin\jadx

3、执行完毕后,相同目录下将会得到一个sources文件夹,该文件夹能直接用IDE工具打开查看其java代码

2.3.2 Dex2Smali

准备工作

1、apktool

apktool用于将apk文件反编译为项目文件,下载地址:https://www.pcsoft.com.cn/soft/57847.html

2、baksmali.jar文件

basksmali.jar文件用于将dex文件转为smali代码,下载地址:https://bitbucket.org/JesusFreke/smali/downloads/

3、Dex2Smali脚本

该脚本用于将dex文件转为smali代码

自编写如下:

Dex2Smali.py

import os, sysif __name__ == "__main__":if len(sys.argv) < 2 :print("start error!start need 2 arguments!")sys.exit()path = os.path.split(__file__)[0] + '\\'
files= os.listdir(path)
for file in files: if file.find(".dex") > 0: prefix = file.split('.')[0]print(prefix)sh = 'java -jar ' + sys.argv[1] + ' disassemble -o smali_' + ('' if 'classes'==prefix else prefix) + ' ' + fileprint(sh)os.system(sh)

ps:该python脚本执行时需要传入baksmali.jar文件的绝对路径

具体使用

1、通过2.2.1章节我们使用反射大师获取了多个dex文件,我们将Dex2Smali.py放入这些dex文件的同一个文件夹中

2、该目录下执行Dex2Smali.py并传入baksmali.jar的绝对路径,我这里为E:\mobileAppCrawler\dump\安居客dump\dump\baksmali.jar

Dex2Smali.py E:\mobileAppCrawler\dump\安居客dump\dump\baksmali.jar

3、执行完毕后得到多个classes文件

4、使用apktool反编译目标apk,得到apk同名项目文件夹

将apk拖入apktool脚本所在文件夹,cmd执行以下命令

apktool -r d anjuke.apk -only-main-classes



5、进入同名项目文件夹中可以看到存在多个classes文件,我们将其删除,然后将执行Dex2Smali.py脚本后得到多个classes文件复制到该文件夹中

6、使用Android Studio打开该项目文件,可以查看smali以及动态调试

最后,关于app的动态调试有不明白的可以参考这里:https://blog.csdn.net/weixin_43900244/article/details/114007059,结合本文可以从2.2章节开始看起。

3 总结

最后总结一下,目前碰到的加壳还处在一代壳阶段(dex加密),现在有些APP已经用上了二、三代壳对于代码解密以及调试难度越来越大,一些常用的脱壳手段会被逐步淘汰,遇到问题可以多去看看吾爱破解和看雪上的帖子~

APP加壳原理及常用脱壳方法介绍相关推荐

  1. 【胖虎的逆向之路】02——Android整体加壳原理详解实现

    [胖虎的逆向之路](02)--Android整体加壳原理详解&实现 Android Apk的加壳原理流程及详解 文章目录 [胖虎的逆向之路](02)--Android整体加壳原理详解& ...

  2. 加固加壳脱壳分析(1)_加固加壳原理和几代壳

    什么是加固加壳 对App资源代码进行保护,使其不容易被反编译工具解开. 加固的核心在于保证软件正常运行的同时又能保证源码的安全性. 为什么要加固加壳 若应用不做任何安全防护,极易被病毒植入.广告替换. ...

  3. 对一个加壳的可执行文件进行脱壳三种方法

    1.自动静态脱壳:通过一些脱壳工具即可,相当于解压缩,最为方便快捷 2.自动动态脱壳:运行可执行文件,让脱壳存根的的文件脱出原始的可执行文件. 3.手动脱壳:找到加壳算法程序,自己分析源程序进行脱壳.

  4. VMP虚拟机(加壳原理)

    虚拟机保护技术就是将基于x86汇编系统的可执行代码转换为字节码指令系统的代码,以达到保护原有指令不被轻易逆向和修改的目的,这种指令也可以叫伪指令,和VB的pcode有点类似. 从本质上讲,虚拟指令系统 ...

  5. (3)常用脱壳方法总结

    一.概论 壳出于程序作者想对程序资源压缩.注册保护的目的,把壳分为压缩壳和加密壳两种. 压缩壳:顾名思义,压缩壳只是为了减小程序体积对资源进行压缩.压缩壳怎么变形它还是压缩壳,压缩壳的脱壳方法一般都不 ...

  6. crack笔记1 常用脱壳方法

    --------------------------------------------------------------------------------- 黑鹰红客基地动画教程 黑鹰红客基地w ...

  7. 数据库连接池原理及常用连接池介绍

    一.背景介绍 1.1 什么是连接池 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个. 1.2 为什么要使用连接池 数据库连接是一种关键的有 ...

  8. ChatGPT原理解析以及使用方法介绍

    一.背景 这里我就直接贴上跟ChatGPT的对话作为背景输入,说真的,它的回答比我写的还要专业,具体见如下截图: 二.原理 从官网介绍可以看到,ChatGPT与InstructGPT是同源的模型.那么 ...

  9. md5 加盐原理和常用的加盐方法

    现在的MD5密码数据库的数据量已经非常庞大了,大部分常用密码都可以通过MD5摘要反向查询到密码明文.为了防止内部人员(能够接触到数据库或者数据库备份文件的人员)和外部入侵者通过MD5反查密码明文,更好 ...

  10. hex文件详解及常用合并方法介绍

    前言 在很多复杂的系统中,或者多人参与设计的系统中,程序分区必不可免,拿最简单的IAP升级来说,包含两个程序区,BOOT区和APP区,BOOT区的主要职责是引导代码进去APP区执行目标功能,但是在下载 ...

最新文章

  1. IJCAI 2020 已线上开奖!周志华、张成奇还将分别担任2021程序主席和2024大会主席...
  2. 说出java中基本数据类型_java中的基本数据类型
  3. l#039;oracle 酒,2011 Stellenbosch Vineyards Oracle of the Sun Shiraz, Stellenbosch, South Africa
  4. Anaconda中使用图形化界面创建虚拟环境
  5. SQlite数据库的C编程接口(七) 数据库锁定(Database Locking) ——《Using SQlite》读书笔记
  6. 【三维路径规划】基于matlab球面矢量粒子群算法无人机三维路径规划【含Matlab源码 1682期】
  7. 指南|七步搞定研控E总线驱动器与欧姆龙PLC主站连接
  8. 关于opencv中 tf_text_graph_ssd.py生成pbtxt报错的解决方案
  9. 软件测试网上订餐系统,星月外卖网上订餐系统软件测试报告(正式).doc
  10. 软考中级软件设计师---下午题
  11. Akka Actors入门案例解析
  12. 由可乐加比萨化学反应引发的联想
  13. 2021高考成绩查询单科,2021年全国高考总分及各科分数
  14. jflash烧录教程_Jlink flash 烧录HEX 程序
  15. 查漏补缺——字符串www.qq.com所有非空子串
  16. JS中onchange事件:域内容被改变的事件
  17. 从GMT时间转换到当地时间(北京时间)
  18. thinkpad如何屏蔽bios更新 提示电池_恢复bios出厂默认值
  19. App inventor小画板
  20. Spring逆向生成封装实体类

热门文章

  1. 安装配置MySQL5.7详细教程
  2. 第十一章 面向对象设计
  3. 意外找回CSDN老账号,记录记录新账号备忘
  4. OpenJudge NOI题库 116题
  5. 如何用Visio画出总线(空心的箭头)如何放置粗双向可变箭头
  6. Vue2.0安装教程
  7. Java基础知识——JavaIO
  8. 对抗神经网络对抗攻击_您将如何检测针对神经网络的网络攻击?
  9. 对抗神经网络学习(简单的理解)
  10. Robo 3T显示MongoDB数据时区晚8小时问题