版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
unidbg 简介
unidbg 是一个基于 Java 的 Android 动态分析框架,专注于模拟 Android 应用中的 native 代码。以下是它的主要功能:
-
支持对so的加载;
-
支持对JNI接口函数的模拟调用;
-
支持常见syscalls的模拟调用;
-
支持ARM32和ARM64。
-
支持Android以及iOS
-
基于HookZz实现的inline hook
-
xHook实现的hook
-
iOS fishhook,substrate、whale hook等
-
支持gdb、IDA远程调试等高级功能。
-
…
Unidgb 项目地址:https://github.com/zhkl0228/unidbg
unidbg 底层引擎
unidbg 的 CPU 指令模拟主要由 dynarmic 和 unicorn 驱动。
dynarmic 是专注于 ARM 架构的模拟器,虽然它和 unicorn 都提供 ARM 模拟功能,但它们的设计目标和性能特点不同。unicorn 更加通用,而 dynarmic 则更注重效率。
-
dynarmic 项目地址:https://github.com/yuzu-mirror/dynarmic
-
Unicorn 项目地址:https://github.com/unicorn-engine/unicorn
dynarmic 与 unicorn 效率对比
clone unidbg 源码到本地并导入 IDEA,在 unidbg-android/src/test/java/com/kanxue/test2

MainActivity.java 中示例代码实现了爆破 so 中 test 函数 flag 参数(已知 so 中 test 函数参数为一个字符串,该字符串长度为3且仅包含大小写字母),如果 flag 正确函数会返回 true,通过不断调用该 jni 函数测试所有字母组合直到得到正确结果。
package com.kanxue.test2;
import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.LibraryResolver;
import com.github.unidbg.arm.backend.DynarmicFactory;
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.linux.android.dvm.DvmObject;
import com.github.unidbg.linux.android.dvm.VM;
import com.github.unidbg.linux.android.dvm.jni.ProxyDvmObject;
import com.github.unidbg.memory.Memory;
import java.io.File;
/**
* <a href="https://bbs.pediy.com/thread-263345.htm">CrackMe</a>
*/
public class MainActivity {
public static void main(String[] args) {
long start = System.currentTimeMillis();
MainActivity mainActivity = new MainActivity();
System.out.println("load offset=" + (System.currentTimeMillis() - start) + "ms");
mainActivity.crack();
}
private final AndroidEmulator emulator;
private final VM vm;
private MainActivity() {
emulator = AndroidEmulatorBuilder
.for32Bit()
.addBackendFactory(new DynarmicFactory(true))
.build();
Memory memory = emulator.getMemory();
LibraryResolver resolver = new AndroidResolver(23);
memory.setLibraryResolver(resolver);
vm = emulator.createDalvikVM();
vm.setVerbose(false);
DalvikModule dm = vm.loadLibrary(new File("unidbg-android/src/test/resources/example_binaries/armeabi-v7a/libnative-lib.so"), false);
dm.callJNI_OnLoad(emulator);
}
private static final char[] LETTERS = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
};
private void crack() {
DvmObject<?> obj = ProxyDvmObject.createObject(vm, this);

最低0.47元/天 解锁文章
1677

被折叠的 条评论
为什么被折叠?



