概述

众所周知,Android应用开发完成后,除了使用Google官方的混淆外,还需要使用一些第三方的安全软件的加壳处理,比较出名的有腾讯乐固、360加固和爱加密等。我之前所在的公司,就是使用爱加密进行加壳处理的。

虽然加密后,让软件的安全性更高了,但并不是无懈可击,一些反加固技术和脱壳技术应运而生。今天要说的就是腾讯乐固、360加固一键脱壳。

工程,经过加固后的apk,通过dex2jar反编译效果是下面这样的:

腾讯乐固加固:

360加固

可以发现,经过加固处理由,反编译是无法直接获取到源码的,代码的结构如下图所示:

工具

要对Android的apk文件进行脱壳,需要使用的软件有:

  • FDex2
  • VirtualXposed
    不过,需要说明的是,此技术在Android9.0及以上版本是行不通的,并且VirtualXposed有软件版本限制。

FDex2

下载地址:
链接: https://pan.baidu.com/s/10ZfD2MSfukuLdxvUZIAyjA 提取码: asu1

VirtualXposed

VirtualXposed:无需root手机即可使用Xposed框架
下载链接:
https://vxposed.com/

脱壳

首先,将VirtualXposed、FDex2和需要脱壳的应用都安装到手机上。然后,启动VirtualXposed,并在VirtualXposed中安装FDex2。

然后,在VirtualXposed中选择模块管理激活FDex2。

在VirtualXposed中安装要脱壳的应用,具体和上面的步骤一样。然后,启动VirtualXposed中的FDex2,并配置要脱壳的应用。

在VirtualXposed中运行要脱壳的应用,脱壳后的dex文件如下图:

然后,使用adb pull命令将脱壳后的dex文件导出到电脑。

adb pull /data/user/0/iv.va.exposed/virtual/data/user/0/{packageName}

最后,再通过dex2jar对 脱壳的dex进行反编译。

FDex2核心代码

package com.ppma.xposed;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Method;import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XSharedPreferences;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;public class MainHook implements IXposedHookLoadPackage {XSharedPreferences xsp;Class Dex;Method Dex_getBytes;Method getDex;String packagename;public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {xsp = new XSharedPreferences("com.ppma.appinfo", "User");xsp.makeWorldReadable();xsp.reload();initRefect();packagename = xsp.getString("packagename", null);XposedBridge.log("设定包名:"+packagename);if ((!lpparam.packageName.equals(packagename))||packagename==null) {XposedBridge.log("当前程序包名与设定不一致或者包名为空");return;}XposedBridge.log("目标包名:"+lpparam.packageName);String str = "java.lang.ClassLoader";String str2 = "loadClass";XposedHelpers.findAndHookMethod(str, lpparam.classLoader, str2, String.class, Boolean.TYPE, new XC_MethodHook() {protected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);Class cls = (Class) param.getResult();if (cls == null) {//XposedBridge.log("cls == null");return;}String name = cls.getName();XposedBridge.log("当前类名:" + name);byte[] bArr = (byte[]) Dex_getBytes.invoke(getDex.invoke(cls, new Object[0]), new Object[0]);if (bArr == null) {XposedBridge.log("数据为空:返回");return;}XposedBridge.log("开始写数据");String dex_path = "/data/data/" + packagename + "/" + packagename + "_" + bArr.length + ".dex";XposedBridge.log(dex_path);File file = new File(dex_path);if (file.exists()) return;writeByte(bArr, file.getAbsolutePath());}} );}public void initRefect() {try {Dex = Class.forName("com.android.dex.Dex");Dex_getBytes = Dex.getDeclaredMethod("getBytes", new Class[0]);getDex = Class.forName("java.lang.Class").getDeclaredMethod("getDex", new Class[0]);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();}}public  void writeByte(byte[] bArr, String str) {try {OutputStream outputStream = new FileOutputStream(str);outputStream.write(bArr);outputStream.close();} catch (IOException e) {e.printStackTrace();XposedBridge.log("文件写出失败");}}
}

通过Hook ClassLoader的loadClass方法,反射调用getDex方法取得Dex(com.android.dex.Dex类对象),再将里面的dex写出,这就是Hook的原理。

Android APK脱壳相关推荐

  1. Android APK脱壳--腾讯乐固、360加固一键脱壳 亲测可用

    日期:2019年8月28日 设备:win木木模拟器2.2.16 脱壳教程:https://www.jianshu.com/p/138c9de2c987 adb连接木木模拟器教程:https://www ...

  2. Android APK反编译及逆向工程

    一. 分析已经打好的apk. 首先来简单的说明下Apk文件本质上其实是一个zip包.我们直接进行解压就能看到其中的目录. 1. 目录说明 AndroidManifest.xml:应用的全局配置文件 c ...

  3. Android APK加壳技术方案----代码实现

    本文章由Jack_Jia编写,转载请注明出处. 文章链接:http://blog.csdn.net/jiazhijun/article/details/8746917 作者:Jack_Jia    邮 ...

  4. Apk脱壳圣战之---脱掉“梆梆加固”的保护壳

    一.前言 现如今Android用户的安全意识不是很强,又有一些恶意开发者利用应用的名字吸引眼球,包装一个恶意锁机收费的应用,在用户被骗的安装应用之后,立马手机锁机,需要付费方可解锁.这样的恶意软件是非 ...

  5. APK脱壳之—如何脱掉“梆梆加固”的保护壳

    一.前言 现如今Android用户的安全意识不是很强,又有一些恶意开发者利用应用的名字吸引眼球,包装一个恶意锁机收费的应用,在用户被骗的安装应用之后,立马手机锁机,需要付费方可解锁.这样的恶意软件是非 ...

  6. Apk脱壳圣战之—如何脱掉“梆梆加固”的保护壳

    一.前言 现如今Android用户的安全意识不是很强,又有一些恶意开发者利用应用的名字吸引眼球,包装一个恶意锁机收费的应用,在用户被骗的安装应用之后,立马手机锁机,需要付费方可解锁.这样的恶意软件是非 ...

  7. Apk脱壳圣战之---如何脱掉“梆梆加固”的保护壳

    一.前言 现如今Android用户的安全意识不是很强,又有一些恶意开发者利用应用的名字吸引眼球,包装一个恶意锁机收费的应用,在用户被骗的安装应用之后,立马手机锁机,需要付费方可解锁.这样的恶意软件是非 ...

  8. 电子数据取证之Android APK分析

    都是比较基础的知识,目的是做学习记录,有不足之处欢迎指正. 一.Android APK概念 APK (Android application package)指 Android 应用程序包,是 And ...

  9. 小七新Android逆向,小七Android逆向脱壳课程

    [视频目录] [小七新Android逆向脱壳课程]脱壳1.Java环境配置与各种逆向工具安装配置介绍 [小七新Android逆向脱壳课程]脱壳2.Android手机端配置及必要软件安装 [小七新And ...

最新文章

  1. Opengl_20 _复习变换矩阵+复习光源+两个模型使用不同的shader
  2. SAP UI5 CreateBindingContext 方法的实现逻辑
  3. c++中使用libxml2读取xml文件【转】
  4. 信号问题可根除,苹果新款 iPhone 将搭载高通基带?
  5. jQuery checkbox全选问题
  6. 155.PHP中“==”运算符的安全问题
  7. 中国人工智能学会通讯——一种基于众包的交互式数据修复方法 3 给定质量约束下的交互式算法...
  8. 9行python代码批量修改window屏保图文件
  9. 小米Pad退出开发者模式
  10. PL3369C-ASEMI原边电源IC芯片PL3369C
  11. 英伟达、AMD显卡纷纷告急,PC DIY市场的落日黄昏
  12. netty--关于NIO和OIO
  13. layui 表格数据源_「WPS办公助手」表格数据录入太慢?这个好用的技巧,轻松帮你搞定...
  14. 网络爬虫笔记—Selenium
  15. iOS版本最新分布概况
  16. (七)《数电》——CMOS与TTL门电路
  17. 基于ns2和ns3进行AODV协议改进仿真
  18. 搭建Janus的HTTPS环境
  19. 计算机网络——传输层の选择题整理
  20. 算法题21 最快过桥问题

热门文章

  1. winodws系统使用的那点事(2)-如何开启管理员账户
  2. 火线魔盒服务器不稳定,火线魔盒怎么使用?火线魔盒使用教程
  3. 反正切函数的求解 math.atan2
  4. 智慧农业众筹,共享农场土地租赁,认养小程序源码开发有好处吗?
  5. 三、超高频RFID标准及规范
  6. 复习篇15章:量子论基础
  7. Prometheus+Grafana+企业微信机器人告警
  8. 距离公式——欧式(L2)、曼哈顿(L1)切比雪夫、夹角余弦
  9. 老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化
  10. 探偵ガリレオー転写る2