自己编写一个简单的so,利用unidbg跑起来

新建项目

新建一个c++项目
修改CMakeLists.txt

add_library(test SHARED
        # List C/C++ source files with relative paths to this CMakeLists.txt.
        test.c)

target_link_libraries(test
        # List libraries link to the target library
        android
        log)

修改加载的库

    static {
        System.loadLibrary("test");
    }

声明两个native方法

    public native String stringFromJNI();

新建一个test.c源文件,实现方法

#include <jni.h>

JNIEXPORT jstring JNICALL
Java_com_example_unidbgtest_MainActivity_stringFromJNI(JNIEnv *env, jobject thiz) {
    // TODO: implement stringFromJNI()
    char* hello = "Hello from C++";
    return (*env)->NewStringUTF(env,hello);
}

运行,可以正常运行

Build

Build Apk,然后把so从apk中拖出来
在unidbg中找一个目录把so放进去
然后新建一个类

package com.example.unidbgtest;

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.linux.android.dvm.DvmClass;
import com.github.unidbg.linux.android.dvm.DvmObject;
import com.github.unidbg.linux.android.dvm.VM;
import com.github.unidbg.linux.android.dvm.wrapper.DvmInteger;
import com.github.unidbg.memory.Memory;

import java.io.File;
import java.io.IOException;

public class unidbgtest {
    private final VM vm;
    private final DvmClass dvmClass;
    private final AndroidEmulator emulator;
    private Memory memory;
    private String process = "com.example.unidbgtest";
    private String className = "com/example/unidbgtest/MainActivity";
    private Module module;

    public unidbgtest(){
        // 创建设备
        emulator = AndroidEmulatorBuilder.for64Bit().setProcessName(process).build();
        // 获取内存对象
        memory = emulator.getMemory();
        // 设置Android Sdk版本
        memory.setLibraryResolver(new AndroidResolver(23));
        // 创建虚拟机
        vm = emulator.createDalvikVM(new File("apks/libtest.so"));
        vm.setVerbose(true);

        DalvikModule dm = vm.loadLibrary(new File("unidbg-android/src/test/java/com/example/unidbgtest/apks/libtest.so"), true);
        dm.callJNI_OnLoad(emulator);
        module = dm.getModule();
        dvmClass = vm.resolveClass(className);
    }

    public static void main(String[] args) throws IOException {
        unidbgtest unidbgtest01 = new unidbgtest();
        unidbgtest01.start();
        unidbgtest01.stop();
    }

    private void start(){
        DvmObject<?> result = dvmClass.callStaticJniMethodObject(emulator, "stringFromJNI()Ljava/lang/String");
        System.out.println("result=" + result);
    }
    private void stop() throws IOException {
        emulator.close();
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值