JMP、Hook

2023-11-07

  1. #include "stdio.h"  
  2. #include "tchar.h"  
  3. #include "windows.h"  
  4.   
  5.   
  6. //offset=目标地址-(jmp指令起始地址+5)  
  7. //跳转指令解码:[0xe9][offset]  
  8. //  offset:有符号整型,四字节.它等于jmp指令的下一指令地址到目标地址的相对距离  
  9. //  计算公式:  
  10. //  offset=目标地址-(jmp指令起始地址+5)  
  11. //其实还有0xeb等短跳转指令可用的,但用的最多的还是0xe9跳转  
  12.   
  13. BYTE jmp[5]={0};  
  14. BYTE enter[5]={0};  
  15. HANDLE hProcess=NULL;  
  16. DWORD pfnMsgBox=0;  
  17. DWORD dwOld=0;  
  18.   
  19. int WINAPI MessageBoxProxy(IN HWND hWnd, IN LPCSTR lpText, IN LPCSTR lpCaption, IN UINT uType)  
  20. {  
  21.  int ret=0;  
  22.  printf("this is MessageBoxProxy begin!\n");  
  23.  printf("Caption:%s\n",lpCaption);  
  24.  printf("Text:%s\n",lpText);  
  25.   
  26.  memcpy((void*)pfnMsgBox,enter,5);//恢复入口指令  
  27.  FlushInstructionCache(hProcess,(void*)pfnMsgBox,5);  
  28.   
  29.  ret=MessageBox(hWnd,lpText,lpCaption,uType);//调用原函数  
  30.    
  31.  memcpy((void*)pfnMsgBox,jmp,5);//写入跳转指令  
  32.  FlushInstructionCache(hProcess,(void*)pfnMsgBox,5);  
  33.  printf("this is MessageBoxProxy end!\n");  
  34.  return ret;  
  35. }  
  36.   
  37. void SetupHook(void)  
  38. {  
  39.  pfnMsgBox=(DWORD)GetProcAddress(GetModuleHandle(_T("user32.dll")),_T("MessageBoxA"));  
  40.  memcpy(enter,(void*)pfnMsgBox,5);//保存入口指令  
  41.   
  42.  jmp[0]=0xe9;  
  43.  *(int*)&jmp[1]=(int)&MessageBoxProxy-((int)pfnMsgBox+5);  
  44.    
  45.  //写入跳转指令,调用MessageBoxA时会跳到MessageBoxProxy  
  46.  VirtualProtect((void*)pfnMsgBox,5,PAGE_EXECUTE_READWRITE,&dwOld);  
  47.  memcpy((void*)pfnMsgBox,jmp,5);  
  48. }  
  49.   
  50. void RemoveHook(void)  
  51. {  
  52.  DWORD dwtemp;  
  53.  memcpy((void*)pfnMsgBox,enter,5);  
  54.  FlushInstructionCache(hProcess,(void*)pfnMsgBox,5);  
  55.  VirtualProtect((void*)pfnMsgBox,5,dwOld,&dwtemp);  
  56. }  
  57.   
  58. int main(void)  
  59. {  
  60.  hProcess=GetCurrentProcess();  
  61.   
  62.  SetupHook();  
  63.  MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);  
  64.    
  65.  RemoveHook();  
  66.  MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);  
  67.  system("pause");  
  68.  return 0;  
  69. }  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JMP、Hook 的相关文章

  • 基于Python招聘爬虫可视化-招聘数据可视化

    视频展示 基于Python招聘爬虫可视化 项目定制 招聘数据可视化 哔哩哔哩 bilibili
  • C++primer练习12.1.4

    12 14 struct destination 连接的目的地 struct connection 使用连接所需的信息 connection connect destination 打开连接 void disconnect connecti
  • Ext智能提示 - Eclipse 3.2

    Eclipse的Ext 2 0 2智能提示 它提供了非常准确的Ext API提示 如图 下载地址 http www agpad com downloads spket 1 6 12 zip 引用方法 方法來自會員 kittig 1 将下载回
  • 【模拟电路】二极管分类

    1 TVS二极管 瞬态电压抑制器 在电路中 TVS二极管都是反向接在电源端 一旦瞬时电压超过电路正常工作电压后 TVS二极管便发生雪崩效应 提供给瞬时电流一个超低电阻通路 从而使得被保护器件或设备避免受到损毁 图1 图2 找了个网上的图 先
  • 必看!区块链如何推动电商行业的发展?

    区块链技术被认为是第四次工业革命中最具颠覆性的创新技术 世界上还没有见过比区块链技术更强大的技术 它可能会对所有经济部门产生潜在的影响 给它们带来一流的效率 近些年来 区块链技术在金融服务行业 能源行业 物流行业 供应链管理行业 医疗行业等
  • ambari自动化Hadoop部署

    20200922 0 引言 几年前为了处理大量的日志 简单学习了hadoop的内容 之后就在自己的几台破PC上进行了实验 当时安装的方式步骤大致如下 利用expect脚本完成免密登陆 利用clush进行集群管理 比如传输文件 或者文件及命令
  • 软件测试风险清单

    软件测试风险 主要分为 风险评估和风险控制 软件测试风险大致可以从以下几个方面考虑 一 人力 风险评估点 1 人力资源不够 2 测试用例未被完全执行 3 人员流动 测试人员对业务不熟悉 相对应的风险控制 1 按照项目计划 测试计划准备好测试
  • Altium Designer 16 放置PCB禁止布线层步骤

    放置PCB禁止布线层步骤 菜单栏中的Place gt 子菜单项Keepout gt 有几种设置模式一般选用Track 直线绘制 添加以后绘制线图不能超过禁止布线层所圈出的范围
  • 记忆碎片之python线程池、submit()、done()、result()、wait()、as_completed()、map()方法

    大量注释 小白一看就懂的多线程及参数使用 threadpool已经不再是主流 但是对于任务数量不断增加的程序 每有一个任务就生成一个线程 最终会导致线程数量的失控 例如 整站爬虫 假设初始只有一个链接a 那么 这个时候只启动一个线程 运行之
  • Go语言的图灵机

    代码如下 package main import fmt var a 30000 byte prog gt lt gt p pc int func loop inc int for i inc i 0 pc inc switch prog
  • python基础七:元组、字典、以及集合的使用

    1 元组简介 1 1元组的基本概念 元组表现形式tuple 元组是一个不可变序列 一般当我们希望数据不改变时 我们使用元组 其他情况下基本都用列表 使用 创建元素 元组不支持通过序列来修改元素 可以查找 元组不是空元组至少有一个 逗号 当元
  • Java中交集、并集、差集、补集、去重的实现

    一 交集 1 交集的实现 交集 Test public void intersection 向集合中添加元素 ArrayList
  • windows10 系统默认备份后如何还原?

    在控制面板中 如下操作 选着开始系统还原 选着备份的还原文件

随机推荐

  • UVA12166 Equilibrium Mobile

    VJ传送门 一道思维题 刚开始看的时候没什么思路 在博客园上参考了大佬的解析 在这里总结一下 一 分析 这道题要求让天平平衡所需要的最小改动次数 至少有一个不变 我们可以先选定一个不变的基准 然后改变其他的秤砣 得到以此为基准的天平的总重量
  • 大数据毕业设计 opencv指纹识别系统 - python 图像识别

    文章目录 0 前言 1 课题背景 2 效果展示 3 具体实现 3 1 图像对比过滤 3 2 图像二值化 3 3 图像侵蚀细化 3 4 图像增强 3 5 特征点检测 4 OpenCV 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升
  • 使用Map报错:错误 C2678 二进制“<”: 没有找到接受“const _Ty”类型的左操作数的运算符(或没有可接受的转换)

    在 C 中 使用Map时出现了这个问题 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C2678 二进制 lt 没有找到接受 const Ty 类型的左操作数的运算符 或没有可接受的转换 QtWidgetsApplication1
  • pwn新手安装Ubuntu16.0.4踩雷

    为了能够实现更好的打pwn的目的 在大佬的建议下 将pwn环境换成了Ubuntu16 0 4 但是在安装的过程中产生了许多问题 导致重装过不知道多少遍虚拟机 这里写篇记录一下 防止忘记233333 步骤链接 27条消息 Pwn环境配置 三
  • java基础

    1 1 关键字与保留字 关键字 keyword 的定义和特点 gt 定义 被Java语言赋予了特殊含义 用做专门用途的字符串 单词 gt 特点 关键字中所有字母都为小写 gt 官方地址 https docs oracle com javas
  • .NET Core中使用Redis和Memcached的序列化问题

    为什么get set不直接操作对象 而需要序列化 是因为可以提高对数据库操作的执行效率 学习网址https www cnblogs com catcher1994 p 8543711 html
  • Rider 使用

    下载地址 http www jetbrains com rider fromMenu 破解 https www iteblog com archives 1542 html http idea iteblog com key php 使用
  • 约瑟夫环问题(单循环链表实现)

    用单循环链表解决约瑟夫环问题 大致思路 1 利用尾插法建立一个循环链表 建表成功后删除头结点 2 核心算法 生成一个work指针 每走到约定的step 1的位置时停止 利用pdel指针标记后继结点 循环释放pdel 直到work work
  • java数组(二)

    数组 Arrays 数组是一种数据结构 它是一组相同类型的元素的集合 该集合中的每个元素都通过一个索引访问 在Java中 数组是一个对象 它可以存储在堆上或栈上 具体取决于它如何创建 数组可以是单维数组或多维数组 数组是一个固定长度的数据结
  • C++(基础入门笔记)

    1搭建环境 include
  • TCP/IP/UDP/RTP/RTCP协议

    IP 指定目的地址和源地址 Version 版本号 四个字节 IHL IP Header Length IP头长度 Total Length 总的长度 总的长度减去IP头长度 数据长度 Identification Flags Fragme
  • linux OSI七层模型、TCP/IP协议栈及每层结构大揭秘

    学习Linux 就算是像小编我这样的小萌新 也知道OSI模型 什么 你不知道 好吧 这篇秘籍拿走 不谢 一 两个协议 1 OSI 协议模型 7层 国际协议 PDU 协议数据单元对等层次之间传递的数据单位 OSI协议 7层 国际协议 PDU
  • 伺服控制-canopen

    通迅中断参数设 1 中断 停止 伺服驱动 电机停转 开启抱死动作 1 配置 opration 2 设置 3速度模式 3 设置 伺服松轴 4 设置 伺服使能 运行 1 使能 true 2 启用 true 停止 1 使能 false 2 松轴
  • Linux下安装Nginx服务并设置开机自启动

    目录 一 安装Nginx 二 开机自启动服务配置 一 安装Nginx 系统平台 CentOS Linux release 7 9 2009 Core 64位 Nginx安装版本 liunx 64位 nginx 1 20 2 tar gz 安
  • VSCode进行Lua调试

    1 安装EmmyLua 2 添加配置 3 开始调试 要选择要调试的进程就可以了
  • Docker中快速搭建SFTP

    1 拉docker镜像 docker pull atmoz sftp 2 初始化 创建容器 docker run name internalsftp p 22 22 d atmoz sftp anonymous hello123 opt U
  • 震惊~Signal <XXX> missing in the sensitivity list is added for synthesis purposes在verilog中警告的解决方法

    你是否还在为秃头而烦恼 你是否还在通宵为了赶项目而焦急 朋友 你不是 一个人 看看吧 下面是这个bug的描述 WARNING HDLCompiler 91 F FPGA Doc AD test uart v Line 56 Signal
  • java通过JDBC连接mysql8.0数据库,并对数据库中的表进行增删改查操作

    目录 一 JDBC简介 二 添加依赖 三 JDBC操作数据库的步骤 四 JDBC操作数据库 增删改查 一 新增数据 二 删除数据 三 修改数据 四 查询数据 五 多表连接查询 一 JDBC简介 Java数据库连接 Java Database
  • vue-cli配置sass,使用全局sass变量

    vue cli创建vue2 0项目 安装sass步骤 创建vue2 0项目 vue init webpack 项目名 安装sass步骤 npm install node sass 4 14 1 npm install sass loader
  • JMP、Hook

    include stdio h include tchar h include windows h offset 目标地址 jmp指令起始地址 5 跳转指令解码 0xe9 offset offset 有符号整型 四字节 它等于jmp指令的下