roysue 发表于 2021-9-7 15:20

Unidbg文档更新(一)


- (#04unidbg文档更新一)
- [下载Unidbg源码](#下载unidbg源码)
- [快速使用步骤](#快速使用步骤)
- [创建AndroidEmulator实例](#创建androidemulator实例)
- [使用AndroidEmulator](#使用androidemulator)
- (#memory操作)
- (#vm操作)

### 下载Unidbg源码
(https://github.com/zhkl0228/unidbg)
将Unidbg的源码导入Idea中。在unidbg-android模块中的src/test目录下,包含了几个Demo,您可以尝试将Demo运行起来,即可看到Unidbg的效果

### 快速使用步骤

```java
//1.创建Android模拟器实例
AndroidEmulator emulator = AndroidEmulatorBuilder
                .for32Bit()
                .addBackendFactory(new DynarmicFactory(true))
                .build();

//2.获取操作内存的接口               
Memory memory = emulator.getMemory();

//3.设置Android SDK 版本
memory.setLibraryResolver(new AndroidResolver(23));

//4.创建虚拟机
VM vm = emulator.createDalvikVM();

//5.加载ELF文件
DalvikModule dm = vm.loadLibrary(new File("你的ELF文件路径名"), false);

//6.调用JNI_OnLoad
dm.callJNI_OnLoad(emulator);

//此时ELF将加载到内存,可以对其做任意操作
//7.执行JNI方法
DvmObject<?> obj = ProxyDvmObject.createObject(vm, this);
boolean result = obj.callJniMethodBoolean(emulator, "jnitest(Ljava/lang/String;)Z", str);
```

### 创建AndroidEmulator实例
使用AndroidEmulatorBuilder可以来帮助你快速创建一个AndroidEmulator的实例。
```java
AndroidEmulator emulator = AndroidEmulatorBuilder
                //指定32位CPU
                .for32Bit()
                //添加后端,推荐使用Dynarmic,运行速度快,但并不支持某些新特性
                .addBackendFactory(new DynarmicFactory(true))
                //指定进程名,推荐以安卓包名做进程名
                .setProcessName("com.github.unidbg")
                //设置根路径
                .setRootDir(new File("target/rootfs/default"))
                //生成AndroidEmulator实例
                .build();
```

### 使用AndroidEmulator

当我们使用AndroidEmulatorBuilder帮助我们构造了一个AndroidEmulator实例之后,我们就可以直接来操作这个实例

```java
//获取内存操作接口
Memory memory = emulator.getMemory();
//获取进程pid
int pid = emulator.getPid();
//创建虚拟机
VM dalvikVM = emulator.createDalvikVM();
//创建虚拟机并指定APK文件
VM dalvikVM = emulator.createDalvikVM(new File("apk file path"));
//获取已创建的虚拟机
VM dalvikVM = emulator.getDalvikVM();
//显示当前寄存器状态 可指定寄存器
emulator.showRegs();
//获取后端CPU
Backend backend = emulator.getBackend();
//获取进程名
String processName = emulator.getProcessName();
//获取寄存器
RegisterContext context = emulator.getContext();
//Trace读内存
emulator.traceRead(1,0);
//Trace写内润
emulator.traceWrite(1,0);
//Trace汇编
emulator.traceCode(1,0);
//是否正在运行
boolean running = emulator.isRunning();
```

### Memory操作

```java
Memory memory = emulator.getMemory();
//指定Android SDK 版本,目前支持19和23两个版本
memory.setLibraryResolver(new AndroidResolver(23));

//拿到一个指针,指向内存地址,通过该指针可操作内存
UnidbgPointer pointer = memory.pointer(0x4000000);

//获取当前内存映射情况
Collection<MemoryMap> memoryMap = memory.getMemoryMap();

//根据模块名来拿到某个模块
Module module = memory.findModule("module name");

//根据地址拿到某个模块
Module module = memory.findModuleByAddress(0x40000000);
```

### VM操作

```java
//推荐指定APK文件,Unidbg会自动做许多固定的操作
VM vm = emulator.createDalvikVM(new File("apk file path"));

//是否输出JNI运行日志
vm.setVerbose(true);

//加载SO模块 参数二设置是否自动调用init函数
DalvikModule dalvikModule = vm.loadLibrary(new File("so file path"), true);

//设置JNI交互接口 参数需实现Jni接口,推荐使用this继承AbstractJni
vm.setJni(this);

//获取JNIEnv指针,可作为参数传递
Pointer jniEnv = vm.getJNIEnv();

//获取JavaVM指针,可作为参数传递
Pointer javaVM = vm.getJavaVM();

//调用JNI_OnLoad函数
vm.callJNI_OnLoad(emulator,dalvikModule.getModule());

//向VM添加全局对象,返回该对象的hash值
int hash = vm.addGlobalObject(dvmObj);

//获取虚拟机中的对象,参数为该对象的hash值
DvmObject<?> object = vm.getObject(hash);
```
文档持续更新中....

xixicoco 发表于 2021-9-8 00:07

肉姐牛逼,

guangzisam 发表于 2021-9-8 14:19

在pc端 模拟执行 so文件中的函数

hongvs 发表于 2021-9-9 09:02

肉姐牛逼的很,

guigu001 发表于 2021-10-1 09:55

肉姐yyds
页: [1]
查看完整版本: Unidbg文档更新(一)