android native hook简介

news2024/12/25 12:45:24

(一)简介

android中的 native Hook是一个吸引人的技术点,诱使和带来很多特别精彩的想法和体验,在调试和其他场景中有很多应用。

本文代码基本都来自github上的源码,只做了适当的编辑和修改,主要是为了验证和测试,基本技术细节未变。

关于具体的技术细节,本文不做阐述,有想法的人和行动派总是在实践中找到自我和快感,所有的技术细节,请自行探讨。

工程代码:点击下载

(二)测试

64位hooktest文件源码:

#include <stdio.h>

#include "And64InlineHook.h"

typedef int (*ptr_old_puts)(const char *);

ptr_old_puts old_puts = 0;

int new_puts(const char *string)
{
    return old_puts("inlineHook success");
}




int hook()
{
    A64HookFunction((void*const)puts,(void*const)new_puts,(void **)&old_puts);

    return 0;
}


int main()
{
    puts("test");
    hook();
    puts("test");

    return 0;
}

32位hooktest代码:

#include <stdio.h>
#include <errno.h>

#include "inlineHook.h"

int (*old_puts)(const char *) = NULL;

int new_puts(const char *string)
{
    return old_puts("inlineHook 32 success");
}

int hook()
{
    if (registerInlineHook((uint32_t) puts, (uint32_t) new_puts, (uint32_t **) &old_puts) != ELE7EN_OK) {
        printf("registerInlineHook error:%d\r\n",errno);
        return -1;
    }
    if (inlineHook((uint32_t) puts) != ELE7EN_OK) {
        printf("inlineHook error:%d\r\n",errno);
        return -1;
    }

    printf("hook ok\r\n");

    return 0;
}

int unHook()
{
    if (inlineUnHook((uint32_t) puts) != ELE7EN_OK) {
        printf("inlineUnHook error:%d\r\n",errno);
        return -1;
    }

    return 0;
}

int main()
{
    puts("test0");
    getchar();
    hook();
    puts("test1");
    getchar();
    unHook();
    puts("test2");
}

测试步骤:

  1. adb push hooktest /data/local/tmp
  2. 切换到adb shell,cd /data/local/tmp后,执行chmod 777 ./hooktest
  3. ./hooktest

注意细节:

  1. 先执行puts在再hook,是因为linux上的延迟记载,若函数没有调用,执行hook时可能因为找不到puts函数而失败
  2. . old_puts是函数指针,也就是说是它是一个二级指针

32位hook测试结果截图:
在这里插入图片描述
64位hook测试输出截图:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/672032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决VMware虚拟机和Windows主机不在同一网段无法连接问题

解决VMware虚拟机和Windows主机不在同一网段无法连接问题 由于自己平时需要频繁更换虚拟机网段&#xff0c;有时候在Windows主机使用Xshell等SSH工具无法连接&#xff0c;还需要配置Windows主机的网段&#xff0c;需要将它们的网段配置到同一网段内&#xff0c;才能使SSH连接成…

Pillow库 三分钟带你了解最基础的使用

努力是为了不平庸~ 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰 目录 一、Pillow库是什么 二、以下是 Pillow 的一些主要作用和使用方法的概述&#xff1a; 三、学习使用 Pillow&#xff0c;一个强大的 Python …

python综合实践-利用Python turtle模块画樱花丛

目录 一、方法步骤 二、代码实现 三、代码解释 四、优化代码 五、Python turtle模块介绍 六、Python turtle模块使用方法 创建画布和画笔对象 控制画笔移动和旋转 控制画笔外观 绘制基本图形 控制画布参数 这段代码使用Python turtle模块&#xff0c;利用递归的方式绘…

前端实现消息推送、即时通信、SSE、WebSocket、http简介

信息推送 服务端主动向客户端推送消息&#xff0c;使客户端能够即时接收到信息。 场景 页面接收到点赞&#xff0c;消息提醒聊天功能弹幕功能实时更新数据功能 实现即时通讯方式 短轮询 浏览器&#xff08;客户端&#xff09;每隔一段时间向服务器发送http请求&#xff0c;…

leetcode47. 全排列 II(回溯算法-java)

全排列 II leetcode47. 全排列 II题目描述解题思路代码演示 回溯算法专题 leetcode47. 全排列 II 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/permutations-ii 题目描述 给定一个可包含重复数字的序列 nums &#xf…

Vulnhub: Corrosion靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.130 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.130 目录爆破 blog-post目录下存在两个目录 对archives目录中的randylogs.php进行测试发现存在文件包含 wfuzz -c -w /op…

POI设置日期类型时间约束createDateConstraint不生效了

背景 在使用 POI 导出 excel 时间类型加入时间约束时&#xff0c;发生了使用 Excel 打开无法正确使用时间约束的问题&#xff0c;但是在 永中Office 打开可以使用 关键词 helper.createDateConstraint&#xff0c;POI设置时间约束 设置时间约束的代码如下 该代码是有问题的&…

浏览器渲染流程

解析HTML&#xff0c;生成DOM树&#xff0c;解析CSS&#xff0c;生成CSSOM树 将DOM树和CSSOM树结合&#xff0c;生成渲染树(Render Tree) Layout(回流):根据生成的渲染树&#xff0c;进行回流(Layout)&#xff0c;得到节点的几何信息&#xff08;位置&#xff0c;大小&#x…

MySQL实战解析底层---为什么我的MySQL会“抖“一下

目录 前言 SQL语句为什么变“慢”了 InnoDB刷脏页的控制策略 前言 一条SQL语句&#xff0c;正常执行的时候特别快&#xff0c;但是有时也不知道怎么回事&#xff0c;它就会变得特别慢&#xff0c;并且这样的场景很难复现&#xff0c;它不只随机&#xff0c;而且持续时间还很…

STM32挂载SD卡基于Fatfs文件系统读取文件信息

STM32挂载SD卡基于Fatfs文件系统读取文件信息 &#x1f516;本例程基于正点原子标准库修改而来。 &#x1f4cd;FatFs 相关API函数网站&#xff1a;http://elm-chan.org/fsw/ff/00index_e.html &#x1f334;分别测试了SD卡模块以及Mini SD卡模块。 &#x1f33f;STM32f1单片…

代码随想录二刷day29 | 回溯之 491.递增子序列 46.全排列 47.全排列 II

day29 491.递增子序列回溯三部曲 46.全排列回溯三部曲 47.全排列 II 491.递增子序列 题目链接 解题思路&#xff1a; 回溯三部曲 递归函数参数 本题求子序列&#xff0c;很明显一个元素不能重复使用&#xff0c;所以需要startIndex&#xff0c;调整下一层递归的起始位置。…

【Python 基础篇】Python各种运算符详解

文章目录 引言一、算术运算符二、比较运算符三、逻辑运算符四、赋值运算符总结 引言 在 Python 编程中&#xff0c;运算符是用于执行各种数学和逻辑操作的特殊符号。它们使我们能够对变量和值进行各种计算和比较。本篇博客将深入探讨 Python 中的常见运算符&#xff0c;并通过…

【如何将多个类似 DDR-dataset.zip.010 文件文件合并成一个zip文件,然后解压】

如何将多个类似 DDR-dataset.zip.010 文件文件合并成一个zip文件&#xff0c;然后解压 问题描述 DDR-dataset.zip.01、DDR-dataset.zip.02、DDR-dataset.zip.03、…、DDR-dataset.zip.010&#xff0c;如何将他们合并到一起并解压&#xff1f; 解决方法 Windows 系统 在Windo…

原生Jdbc获取库、表、字段

文章目录 一、简介1、概述2、Jdbc获取连接3、执行器 二、获取链接1、获取链接2、关闭连接3、Statement4、PrepatedStatement5、 ResultSet6、ResultSetMetaData 三、执行SQL2.1 增/删/改2.2 查询 四、获取库、表结构1、获取Catalog2、获取库列表3、获取表名4、获取字段 一、简介…

为什么本地部署的低代码平台更有优势?

编者按&#xff1a;快速发展的企业需要跟上不断变化的市场趋势。在这种环境下&#xff0c;低代码开发平台可以成为企业快速进入市场的利器。低代码开发的优势可以影响新软件的交付速度&#xff0c;而可视化开发是推动这种无与伦比的速度的关键功能。私有化部署方案和源码交付机…

27-2BP_Adaboost强分类器公司财务预管建模——强分类器和弱分类器(附matlab程序)

1.简述 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类。其主要步骤为&#xff1a;首先给出弱学习算法和样本空间&#xff08;x,y&#xff09;&#xff0c;从样本空间中找出m组训练数据&#xff0c;每组训练数据的权重都是1/m。然后用弱学习算法迭代运算T次&am…

SIP协议学习笔记

SIP 协议(Session initialization Protocol)会话发起协议 是IETF制定的多媒体通信协议&#xff0c;是一个基于文本的应用层控制协议&#xff0c;用于建立&#xff0c;修改和终止IP网上的双方或多方的多媒体会话,支持代理、重定向、登记定位用户等功能 支持用户的移动&#xff…

Packet Tracer - 使用思科 IOS 配置 DHCP

Packet Tracer - 使用思科 IOS 配置 DHCP 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 R1 G0/0 192.168.10.1 255.255.255.0 不适用 S0/0/0 10.1.1.1 255.255.255.252 不适用 R2 G0/0 192.168.20.1 255.255.255.0 不适用 G0/1 已分配 DHCP 已分配 …

python安装/卸载模块方法步骤详解(附详细图解)

在日常工作中会需要安装或者卸载Python模块.于是我整理了一下,下面这篇文章主要给大家介绍了关于python安装/卸载模块的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下 以pygame模块举例 1&#xff0c;通过pycharm导入 &#xff08;1&#xff09;直接点击install …

Redis 2023面试5题(三)

一、Redis集群数据hash分片算法是怎么回事&#xff1f; Redis集群数据hash分片算法是一种将数据分散存储在不同的节点上来实现的机制。具体来说&#xff0c;Redis集群将数据分成16384个槽位&#xff0c;每个槽位对应一个节点。当需要访问某个key时&#xff0c;Redis会根据key的…