android native hook简介

news/2024/11/9 9:59:06/

(一)简介

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.ppmy.cn/news/506132.html

相关文章

C++ 教程(20)——基本的输入输出

C 基本的输入输出 C 标准库提供了一组丰富的输入/输出功能&#xff0c;我们将在后续的章节进行介绍。本章将讨论 C 编程中最基本和最常见的 I/O 操作。 C 的 I/O 发生在流中&#xff0c;流是字节序列。如果字节流是从设备&#xff08;如键盘、磁盘驱动器、网络连接等&#xf…

redis高可用集群搭建

redis高可用集群搭建 redis的安装配置允许远程访问重启服务检查服务是否启动架构图开始搭建集群安装ruby创建集群高可用测试redis集群的扩展将7号机添加为新的master节点添加从节点删掉一个slave节点删除master节点 redis的安装 sudo apt-get install redis-server配置允许远程…

安卓禁止录屏和截屏

我们在看一些精彩图片或直播的时候&#xff0c;有时候想要截个屏或者录屏&#xff0c;但是会提示无法抓取屏幕截图&#xff0c;录像也是黑的&#xff0c;那是怎么做到的呢&#xff0c;其实很简单一行代码&#xff1a; getWindow().addFlags(WindowManager.LayoutParams.FLAG_S…

使用adb命令对手机屏幕截图

使用adb命令对手机屏幕截图 使用 screencap 命令&#xff0c;截图保存在 sdcard/01.png adb shell screencap -p /sdcard/01.png 导出 sdcard/01.png 图片 adb pull /sdcard/01.png

Git安装详细教程(win11)

Git安装详细教程&#xff08;win11&#xff09; 一、下载二、安装三、配置 一、下载 官网下载&#xff1a;点击下载 网盘下载&#xff1a;点击下载 二、安装 双击程序运行&#xff0c;点击next 选择安装路径&#xff0c;我安装在了D盘&#xff0c;如下图所示&#xff0c;…

ffmpeg 屏幕抓取

1、在Windows系统使用libavdevice抓取屏幕数据有两种方法&#xff1a;gdigrab和dshow。 &#xff08;1&#xff09;、使用dshow进行屏幕抓取首先要安装&#xff1a;screen capture recorder&#xff0c;下载地址&#xff1a;https://sourceforge.net/projects/screencapturer/…

c++ 抓取桌面屏幕并转为jpg图片

抓取屏幕代码 char* getScreen(unsigned long &jpg_size){ HWND DeskWnd::GetDesktopWindow();//获取桌面窗口句柄RECT DeskRC;::GetClientRect(DeskWnd,&DeskRC);//获取窗口大小HDC DeskDCGetDC(DeskWnd);//获取窗口DCHBITMAP DeskBmp::CreateCompatibleBitmap(DeskD…

利用Windows自带gdi32.dll实现抓取屏幕

internal static void GetScreenShot( ) { //获得当前屏幕的大小 Rectangle rect new Rectangle(); rect Screen.AllScreens[0].WorkingArea; //计算图片的大小&#xff0c;因为图片的长和宽有可能超过目前屏幕的大小 //创建一个以当前屏幕为模板的图象 Control ctl new …