使用Unidbg进行Hook和Patch

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

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,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值