-
-
[原创]Unidbg文档更新(一)
-
2021-9-7 15:28
12921
-
Unidbg文档更新(一)
下载Unidbg源码
https://github.com/zhkl0228/unidbg
将Unidbg的源码导入Idea中。在unidbg-android模块中的src/test目录下,包含了几个Demo,您可以尝试将Demo运行起来,即可看到Unidbg的效果
快速使用步骤
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 | / / 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的实例。
1 2 3 4 5 6 7 8 9 10 11 | 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实例之后,我们就可以直接来操作这个实例
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 | / / 获取内存操作接口
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操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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操作
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 | / / 推荐指定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 );
|
文档持续更新中....
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课