zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 准备 DEX 字节码文件 )

Android文件字节 动态 加载 准备 逆向 Dex
2023-09-14 09:07:29 时间





一、DexClassLoader 构造函数简介



DexClassLoader 构造函数如下 :

    /**
     * 创建一个{@code-DexClassLoader}来查找解释的和本机的
     * 密码解释类可以在包含的一组DEX文件中找到
     * 在Jar或APK文件中。
     *
     * <p>使用指定的字符分隔路径列表
     * {@code path.separator}系统属性,默认为{@code:}。
     *
     * @param dexPath 包含类和
     * 资源,由{@code File.pathSeparator}分隔,其中
     * Android上的默认值为{@code”:“}
     * @param optimizedDirectory 目录,其中包含优化的dex文件
     * 应该是书面的;不能为{@code null}
     * @param librarySearchPath 包含本机
     * 库,由{@code File.pathSeparator}分隔;可能是
     * {@code null}
     * @param parent 父类加载器
     */
    public DexClassLoader(String dexPath, String optimizedDirectory,
                          String librarySearchPath, ClassLoader parent) {
        super(dexPath, new File(optimizedDirectory), librarySearchPath, parent);
    }

源码路径 : /libcore/dalvik/src/main/java/dalvik/system/DexClassLoader.java

DexClassLoader 构造函数 参数 :

  • String dexPath : 要加载的 DEX 或 JAR 格式字节码的路径 ;
  • String optimizedDirectory : 优化目录 , 加载 zip 或 apk 文件 , 需要对 dex 优化生成 odex , 优化后的文件需要存放在该优化目录中 ;
  • String librarySearchPath : 相关函数库搜索路径 , 如果没有引用外部函数库 , 可以设置为 null ;
  • ClassLoader parent : 父节点类加载器 ,




二、准备 DEX 文件



在 Android Studio 工程中 , 创建 Module ,

在这里插入图片描述

并在其中 , 设置一个测试类 , 之后要使用 DexClassLoader 加载该 DEX 字节码文件 ,

package com.example.dex_demo;

import android.util.Log;

/**
 * 测试 DEX 字节码加载并执行
 */
public class DexTest {
    public void test(){
        Log.i("DexTest", "DexTest : Hello World!!!");
    }
}

选择 " 菜单栏 / Build / " 编译程序 , 生成 APK 文件 ;

在这里插入图片描述

编译后的 dex_demo-debug.apk 文件 , 在当前位置解压 , 获取其中的 classes.dex 字节码文件 ;

在这里插入图片描述

将该 DEX 文件拷贝到 主应用的 assets 目录下 ;

在这里插入图片描述