关于安全:Unidbg使用指南一

一、指标[]

除了AndroidNativeEmu咱们还有一个抉择 Unidbg 来实现模仿执行so,

GitHub链接

https://github.com/zhkl0228/unidbg

特色

  • 模仿JNI调用API,以便能够调用JNI_OnLoad。
  • 反对JavaVM,JNIEnv。
  • 模仿syscalls调用。
  • 反对ARM32和ARM64。
  • 基于HookZz实现的inline hook。
  • 基于xHook实现的import hook。
  • 反对 iOS fishhook 、 substrate 、 whale hook。
  • 反对简略的控制台调试器,gdb,IDA android调试器服务器,指令跟踪,内存读/写跟踪。
  • 反对iOS objc和Swift运行时。

好吧,看上去很弱小的样子,咱们来跑个Demo

二、步骤[]

先把IDEA配置好(java大佬疏忽这一步)

奋飞不会java开发,所以装好IDEA就开始急不可待的导入unidbg工程开始编译:

Tip:

IDEA导入unidbg工程参见 https://code.newban.cn/151.html

  1. 报错 Error:(5, 24) java: 程序包io.kaitai.struct不存在

好吧,装一个 brew install kaitai-struct-compiler

  1. 持续报错 Error:(3, 34) java: 程序包org.apache.commons.logging不存在

    行吧,下载一个 commons-logging-1.2.jar

  2. 还报错? 不对劲,大神不可能这么难为凡人,肯定是哪出了问题??

google之,原来是Maven没有配置好。搞他

Tip:

Maven配置参见 https://zhuanlan.zhihu.com/p/28133184

搞定Maven之后如果还报错,那是因为依赖包没有下载下来,须要 reload 一下,静静的等依赖包下载完,反正奋飞是花了十多分钟。

好了,这次完满编译过来了

执行so中的stringFromJNI函数

  • 在unidbg-android目录下新建fenfei文件夹,把libnative-lib.so文件放进去

sofile

  • 在unidbg-android/src/test/java/com下新建fenfei/testbase文件夹,而后新建个java类MainActivity

  • 开始写代码了
public class MainActivity {
    public static void main(String[] args) {
        MainActivity mainActivity = new MainActivity();
        mainActivity.stringFromJNI();
    }

    private final AndroidEmulator emulator;
    private final VM vm;
    private DvmClass cNative;

    private MainActivity() {
        emulator = new AndroidARMEmulator();
        Memory memory = emulator.getMemory();
        // 设置 sdk版本 23
        LibraryResolver resolver = new AndroidResolver(23);
        memory.setLibraryResolver(resolver);

        //创立DalvikVM,能够载入apk,也能够为null
        vm = emulator.createDalvikVM(null);
        // 是否打印日志
        vm.setVerbose(false);

        // System.out.println(getPath());
        // 载入要执行的 so
        DalvikModule dm = vm.loadLibrary(new File(getPath() + "/fenfei/libnative-lib.so"), false);
        dm.callJNI_OnLoad(emulator);
    }

    private void stringFromJNI() {
        // Jni调用的类
        cNative = vm.resolveClass("com/fenfei/myndk/MainActivity");
        DvmObject<?> strRc = cNative.callStaticJniMethodObject(emulator,"stringFromJNI()Ljava/lang/String;");

        System.out.println("call stringFromJNI rc = " + strRc.getValue());
    }

    public String getPath()
    {
        String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
        if(System.getProperty("os.name").contains("dows"))
        {
            path = path.substring(1,path.length());
        }
        if(path.contains("jar"))
        {
            // System.out.println("jar = " + path);
            path = path.substring(0,path.lastIndexOf("."));
            return path.substring(0,path.lastIndexOf("/"));
        }

        // System.out.println(path);
        // path.replace("target/classes/", "");
        return path.replace("/target/test-classes/", "");
    }
} 

跑一下,胜利输入,出工

call stringFromJNI rc = Hello from C++ 

慢着!李老板又出场了,

奋飞呀,调用so你得给我一个可执行程序呀,总不能让我老板的机器上也装个IDEA来陪你玩吧?

打包成jar包

  1. File → Project Structure …​ 而后抉择 Artifacts, 点加号 Add

  1. jar → From modules with dependencies…​ 而后如下配置, 别忘了勾上 Include tests

createjar

  1. OK了,Build → Build Artifacts 编译胜利之后就在 unidbg-0.9.0/out/artifacts/unidbg_parent_jar 目录下生成了一堆依赖jar包和unidbg-parent.jar 咱们把要载入的 fenfei/libnative-lib.so 放到和 unidbg-parent.jar同级目录

泡一下,胜利输入,手工。 (致力的字都不会打了)

fenfeideMacBook-Pro:unidbg_parent_jar fenfei$ java -jar unidbg-parent.jar
call stringFromJNI rc = Hello from C++ 

三、总结[]

学好java,走遍天下都不怕

╮(‵▽′)╭ 工夫就应该节约在美妙的代码上

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理