http://zhuoyue360.com/crack/75.html
什么是unidbg就不多说了,大家自行百度。
文章目录
写个demo,搭架子
写个简单的加减法来给unidbg调用。
public native String add(int a,int b);
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_lesson2_MainActivity_add(JNIEnv *env, jobject thiz, jint a, jint b) {
// TODO: implement add()
if(a<0){
a = -a;
}
if(b<0){
b=-b;
}
return a+b;
}
unidbg的基础调用代码
package com.example.lesson2;
import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Module;
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.StringObject;
import com.github.unidbg.linux.android.dvm.VM;
import com.github.unidbg.linux.android.dvm.jni.ProxyDvmObject;
import com.github.unidbg.memory.Memory;
import com.sun.jna.Pointer;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class MainActivity {
// 1. 环境初始化
private final AndroidEmulator emulator;
private final VM vm;
private final Memory memory;
private final Module module;
public MainActivity(){
// 2.1 创建模拟机
emulator = AndroidEmulatorBuilder
.for64Bit()
.addBackendFactory(new DynarmicFactory(true))
.build();
// 2.2 创建memory
memory = emulator.getMemory();
// 2.2 创建Android sdk版本. 支持19和23版
memory.setLibraryResolver(new AndroidResolver(23));
// 2.3 创建vm
vm = emulator.createDalvikVM(new File("unidbg-android/src/test/java/com/example/lesson2/app-debug.apk"));
// 载入so文件 且 初始化,返回的说so加载到虚拟机的一个对象
DalvikModule dalvikModule = vm.loadLibrary(new File("unidbg-android/src/test/java/com/example/lesson2/liblesson2.so"), true);
module = dalvikModule.getModule();
vm.callJNI_OnLoad(emulator,module);
}
public void callAdd(int a,int b){
DvmObject obj = ProxyDvmObject.createObject(vm,this);
int result = obj.callJniMethodInt(emulator,"add(II)I",a,b);
System.out.println(result);
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
MainActivity mainActivity = new MainActivity();
System.out.println("load the vm " + (System.currentTimeMillis() - start) + "ms");
mainActivity.callAdd(1,

本文详细介绍了如何使用Unidbg在Android环境中模拟调用JNI函数,并通过Hookzz库实现对特定函数的Hook,包括获取和修改参数、返回结果。文章通过一个简单的加法示例,演示了在64位ARM架构下,如何将加法函数修改为减法,涉及汇编子程序调用约定和参数传递规则。同时,还展示了使用汇编指令转换网站生成HEX代码以实现Patch。
最低0.47元/天 解锁文章
475

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



