unidbg初识

unidbg初识

Unidbg 是一个开源的动态二进制分析工具,基于 Unicorn 引擎,专注于模拟执行 Android 和 iOS 的原生库(主要是 .so 文件)。它允许在无需真实设备或完整运行 APK 的情况下,调用和分析 JNI(Java Native Interface)方法,特别适合逆向工程、算法分析和安全研究。

快速上手

环境准备:
下载 Unidbg 源码:git clone https://github.com/zhkl0228/unidbg
使用 IntelliJ IDEA 打开项目,配置 Maven 依赖。
推荐 Java 8 或更高版本。
基本代码示例(加载 .so 文件并调用函数):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Module;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.DalvikModule;
import com.github.unidbg.memory.Memory;

public class SimpleTest {
public static void main(String[] args) {
// 创建模拟器
AndroidEmulator emulator = AndroidEmulatorBuilder.for32Bit().build();
Memory memory = emulator.getMemory();
memory.setLibraryResolver(new AndroidResolver(23));

// 加载 .so 文件
DalvikModule dm = emulator.createDalvikVM().loadLibrary(new File("path/to/libexample.so"), false);
Module module = dm.getModule();

// 调用 JNI_OnLoad 或其他函数
dm.callJNI_OnLoad(emulator);

// 关闭模拟器
emulator.close();
}
}

运行:
确保 .so 文件路径正确。
运行代码,观察输出结果。

通用模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.nb.demo;

import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Module;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.linux.android.dvm.jni.ProxyClassFactory;
import com.github.unidbg.memory.Memory;

import java.io.File;

public class CheZhiying extends AbstractJni {
public static AndroidEmulator emulator;
public static Memory memory;
public static VM vm;
public static DalvikModule dm;
public static Module module;

//初始化设备的构造方法
public CheZhiying() {

// 1.创建设备(32位或64位模拟器), 具体看so文件在哪个目录。 在armeabi-v7a就选择32位
// 这个名字可以随便写,一般写成app的包名
emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.che168.autotradercloud").build();

// 2.获取内存对象(可以操作内存)
memory = emulator.getMemory();

// 3.设置安卓sdk版本(只支持19、23)
memory.setLibraryResolver(new AndroidResolver(23));

// 4.创建虚拟机(运行安卓代码需要虚拟机,就想运行py代码需要python解释器一样)
vm = emulator.createDalvikVM(new File("apks/che/che3.32.1.apk"));
//vm.setJni(this); // 后期补环境会用,把要补的环境,写在当前这个类中,执行这个代码即可,但是必须继承AbstractJni
//vm.setVerbose(true); //是否展示调用过程的细节

// 5.加载so文件
DalvikModule dm = vm.loadLibrary(new File("apks/che/libnative-lib.so"), false);
//dm.callJNI_OnLoad(emulator); // jni开发动态注册,会执行JNI_OnLoad,如果是动态注册,需要执行一下这个,如果静态注册,这个不需要执行,车智赢案例是静态注册

// 6.dm代表so文件,dm.getModule()得到module对象,基于module对象可以访问so中的成员。
module = dm.getModule(); // 把so文件加载到内存后,后期可以获取基地址,偏移量等,该变量代指so文件

}

// 调用得到签名的核心方法
public void sign() {
//1.找到java中,jni类的native类

//2.找到类中的方法

//3.执行这个方法传入参数

//4. 得到结果

}

// 主运行函数
public static void main(String[] args) {
CheZhiying che=new CheZhiying();
che.sign();
}
}