iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >unicornHook原生hook
  • 821
分享到

unicornHook原生hook

androidjava开发语言 2023-08-19 06:08:01 821人浏览 安东尼
摘要

都知道unidbg是基于unicorn开发的; hook_add_new 第一个参数是Hook回调,我们这里选择CodeHook,它是逐条Hook,参数2是起始地址,参数3是结束地址,参数4一般填null。这意味着从起始地址到终止地址这个范

都知道unidbg是基于unicorn开发的;

hook_add_new 第一个参数是Hook回调,我们这里选择CodeHook,它是逐条Hook,参数2是起始地址,参数3是结束地址,参数4一般填null。这意味着从起始地址到终止地址这个范围内的每条指令,我们都可以在其执行前处理它。
这一点的优点我很喜欢

package com.hookInUnidbg;import com.GitHub.unidbg.AndroidEmulator;import com.github.unidbg.Emulator;import com.github.unidbg.Module;import com.github.unidbg.arm.backend.Backend;import com.github.unidbg.arm.backend.UnHook;import com.github.unidbg.arm.context.ReGISterContext;import com.github.unidbg.debugger.BreakPointCallback;import com.github.unidbg.linux.android.AndroidEmulatorBuilder;import com.github.unidbg.linux.android.AndroidResolver;import com.github.unidbg.linux.android.dvm.*;import com.github.unidbg.memory.Memory;import com.github.unidbg.utils.Inspector;import keystone.Keystone;import keystone.KeystoneArchitecture;import keystone.KeystoneEncoded;import keystone.KeystoneMode;import unicorn.ArmConst;import com.github.unidbg.arm.backend.CodeHook;import unicorn.Unicorn;import java.io.File;public class crackDemo {    private final AndroidEmulator emulator;    private final VM vm;    private final Module module;    crackDemo() {        // 创建模拟器实例        emulator = AndroidEmulatorBuilder.for32Bit().build();        // 模拟器的内存操作接口        final Memory memory = emulator.getMemory();        // 设置系统类库解析        memory.setLibraryResolver(new AndroidResolver(23));        // 创建Android虚拟机        vm = emulator.createDalvikVM(new File("unidbg-android/src/test/java/com/hookInUnidbg/app-debug.apk"));        // 加载so到虚拟内存        DalvikModule dm = vm.loadLibrary("hookinunidbg", true);        // 加载好的 libhookinunidbg.so对应为一个模块        module = dm.getModule();        // debug//        emulator.attach().addBreakPoint(module.findSymbolByName("base64_encode").getAddress());        // 执行JNIOnLoad(如果有的话)        dm.callJNI_OnLoad(emulator);    }    public void unicornHook(){        emulator.getBackend().hook_add_new(new CodeHook() {            final RegisterContext registerContext = emulator.getContext();            @Override // com.github.unidbg.arm.backend.Detachable            public void hook(Backend backend, long address, int size, Object user) {                if(address == module.base + 0x8A0){                    int r0 = registerContext.getIntByReg(ArmConst.UC_ARM_REG_R0);                    System.out.println("0x8A0 r0:"+Integer.toHexString(r0));                }                if(address == module.base + 0x8A2){                    int r2 = registerContext.getIntByReg(ArmConst.UC_ARM_REG_R2);                    System.out.println("0x8A2 r2:"+Integer.toHexString(r2));                }                if(address == module.base + 0x8A4){                    int r4 = registerContext.getIntByReg(ArmConst.UC_ARM_REG_R4);                    System.out.println("0x8A4 r4:"+Integer.toHexString(r4));                }            }            @Override // com.github.unidbg.arm.backend.Detachable            public void onAttach(UnHook unHook) {            }            @Override // com.github.unidbg.arm.backend.Detachable            public void detach() {            }        }, module.base + 0x8A0, module.base + 0x8C2, null);    }    public void hook(){        int patchCode = 0x4FF00000; // movs r0,0        emulator.getMemory().pointer(module.base + 0x8CA).setInt(0,patchCode);//        try (Keystone keystone = new Keystone(KeystoneArchitecture.Arm, KeystoneMode.ArmThumb)) {//            KeystoneEncoded encoded = keystone.assemble("mov r0,0");//            byte[] patchCode = encoded.getMachineCode();//            emulator.getMemory().pointer(module.base + 0x8CA).write(0, patchCode, 0, patchCode.length);//        }//        emulator.attach().addBreakPoint(module, 0x8CA, new BreakPointCallback() {//            RegisterContext registerContext = emulator.getContext();//            @Override//            public boolean onHit(Emulator emulator, long address) {//                System.out.println("nop这里的调用");//                emulator.getBackend().reg_write(ArmConst.UC_ARM_REG_PC, registerContext.getPCPointer().peer + 4 + 1);//                emulator.getBackend().reg_write(ArmConst.UC_ARM_REG_R0, 0);//                return true;//            }//        });    }    public void call(){        DvmClass dvmClass = vm.resolveClass("com/example/hookinunidbg/MainActivity");        String methodSign = "call()V";        DvmObject<?> dvmObject = dvmClass.newObject(null);        dvmObject.callJniMethodObject(emulator, methodSign);    }    public static void main(String[] args) {        crackDemo mydemo = new crackDemo();        mydemo.hook();        mydemo.call();    }}

来源地址:https://blog.csdn.net/weixin_38927522/article/details/128224931

--结束END--

本文标题: unicornHook原生hook

本文链接: https://www.lsjlt.com/news/375065.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • unicornHook原生hook
    都知道unidbg是基于unicorn开发的; hook_add_new 第一个参数是Hook回调,我们这里选择CodeHook,它是逐条Hook,参数2是起始地址,参数3是结束地址,参数4一般填null。这意味着从起始地址到终止地址这个范...
    99+
    2023-08-19
    android java 开发语言
  • useEvent降低Hooks负担的原生Hook分析
    这篇文章主要讲解了“useEvent降低Hooks负担的原生Hook分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“useEvent降低Hooks负担的原生Hook分析”吧!没有 useE...
    99+
    2023-07-02
  • useEvent显著降低Hooks负担的原生Hook
    目录前言没有 useEvent 的时候通过 useCallback 返回一个 memoized 回调函数。小 useEvent 来给他整个活这是咋做到的先回顾几个Hook相关知识点:...
    99+
    2024-04-02
  • React官方团队完善原生Hook闭包陷阱
    目录正文useEventuseEvent的实现与开源Hooks的差异总结正文 我们知道,Hooks使用时存在所谓的闭包陷阱,考虑如下代码: function Chat() { c...
    99+
    2024-04-02
  • python学习之路--hook(钩子原
    ** 什么是钩子 ** 之前有转一篇关于回调函数的文章http://blog.csdn.net/Mybigkid/article/details/67644490 钩子函数、注册函数、回调函数,...
    99+
    2023-01-31
    钩子 之路 python
  • vue3 hook自动导入原理解析
    目录1. vue3 自动导入2. API 的 自动引入Ⅰ、使用前后对比Ⅱ、安装三方件Ⅲ、配置三方件3. 组件的自动引入Ⅰ、使用前后对比Ⅱ、安装三方件Ⅲ、配置三方件1. vue3 自动...
    99+
    2024-04-02
  • React函数组件hook原理及构建hook链表算法详情
    目录写在前面的小结Demofiberhook 链表hook 对象及其属性介绍useState Hook 对象useRef HookuseEffect、useLayoutEffect ...
    99+
    2024-04-02
  • Python中hook的实现原理是什么
    在Python中,hook(钩子)是一种机制,允许开发者在特定事件(例如函数调用、异常发生等)发生时插入自定义的代码进行处理。实现原...
    99+
    2023-09-26
    Python
  • Android Root方法原理解析及Hook(四) GingerBreak
    GingerBreak是一种用于Android设备的Root方法,它利用了Android系统中的漏洞来获取Root权限。在本文中,我...
    99+
    2023-09-09
    Android
  • Hook(钩子技术)基本知识讲解,原理
    钩子技术是一种在计算机编程中常用的技术,它允许程序拦截并修改特定事件的发生顺序或结果。通过使用钩子,开发人员可以在事件发生前或发生后...
    99+
    2023-09-21
    Hook
  • 云原生已来,云原生是什么?
    前言Internet 改变了人们生活、工作、学习和娱乐的方式。技术发展日新月异,云计算市场风起“云”涌,从最初的物理机到虚拟机(裸金属) ,再到容器(Container),而互联网架构也从集中式架构到分布式架构 ,再到云原生架构。如今 “云...
    99+
    2023-06-05
  • PHP原生类
    什么是php原生类 原生类就是php内置类,不用定义php自带的类,即不需要在当前脚本写出,但也可以实例化的类 我们可以通过脚本找一下php原生类 这个反序列化没有任何可以直接利用的魔法函数,只有一个wakeup可以进入 ech...
    99+
    2023-09-05
    php 开发语言
  • Swift Hook的虚函数表的使用原理是什么
    这篇文章主要介绍“Swift Hook的虚函数表的使用原理是什么”,在日常操作中,相信很多人在Swift Hook的虚函数表的使用原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • 原生JS生成九宫格
    原生JS生成九宫格图片并且实现图片互换,供大家参考,具体内容如下 解题思路 涉及知识点,请 1、熟练利用js做出html样式2、对onmousedown,onmousemove,on...
    99+
    2024-04-02
  • app原生开发和非原生开发的区别
    一、开发语言不同 原生开发:原生应用开发指的是使用像Java(安卓)、Swift或Objective-C(iOS)这样的语言来进行开发。这些语言是由各自的操作系统开发商提供的,开发出的应用程序能够更好地利用系统的资源和功能。 非...
    99+
    2023-10-29
    区别 app
  • jquery是原生吗
    本篇内容介绍了“jquery是原生吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • js原生方法被覆盖如何重新赋值原生
    这篇文章给大家分享的是有关js原生方法被覆盖如何重新赋值原生的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。实现原理js的原生方法被覆盖掉以后,如果你还没让原生方法又从新指向一个新...
    99+
    2024-04-02
  • 原生JS怎么生成九宫格
    本篇内容介绍了“原生JS怎么生成九宫格”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!解题思路涉及知识点,请熟练利用js做出html样式2、对...
    99+
    2023-07-02
  • 解析原生JS getComputedStyle
    目录getComputedStyle 与getPropertyValueIE 下的 currentStyle与getAttributestyle 与getComputedStyleg...
    99+
    2024-04-02
  • Golang原生rpc的原理是什么
    这篇文章主要讲解了“Golang原生rpc的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang原生rpc的原理是什么”吧!创建rpc接口,需要几个条件方法的类型是可输出的方...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作