lnline Hook初试
简单解释下hook:
这是我第一次接触hook,写得很简单,对MessageBox函数hook一下下。
下面实验的原理:在指定进程中的内存里找到目标函数的地址,然后修改其首地址的前几字节为jmp指令,指向我们自己的自定义函数地址。这样,进程执行这个函数的时候,会先执行我们自己的代码,之后可以选择性执行原函数或不执行。
流程:
1.构造跳转指令。
2.在内存中找到欲hook函数地址,并保存欲hook位置处的前5个字节。
3.将构造的跳转指令写入需hook的位置处。
4.当被hook位置被执行时会转到我们的流程执行。
5.如果要执行原来的流程,那么取消hook,也就是还原被修改的字节。
6.执行原来的流程。
7.继续hook住原来的位置。
下面就要见具体代码实现了。我们来把hook封装一下。
ILHook.h
#ifndef __ILHOOK_H_1_
#define __ILHOOK_H_1_ #include <Windows.h> class CILHook{
public:
CILHook();
~CILHook();
BOOL Hook(LPSTR pszModuleName, LPSTR pszFuncName, PROC pfnHookFunc);
VOID UnHook();
BOOL ReHook(); private:
PROC m_pfnOrig;//函数地址
BYTE m_bOldBytes[];//函数入口代码
BYTE m_bNewBytes[];//Inline代码
}; #endif
ILHook.cpp
#include "ILHook.h"
CILHook::CILHook(){
m_pfnOrig=NULL;
ZeroMemory(m_bOldBytes, );
ZeroMemory(m_bNewBytes, );
}
CILHook::~CILHook(){
UnHook();
}
/*
函数名称:Hook
函数功能:对指定模块中的函数进行挂钩
参数说明:
pszModuleName:模块名称
pszFuncName:函数名称
pfnHookFunc:钩子函数
*/
BOOL CILHook::Hook(LPSTR pszModuleName,LPSTR pszFuncName,PROC pfnHookFunc){
BOOL bRet=FALSE;
//获取指定模块中函数的地址
m_pfnOrig=(PROC)GetProcAddress(GetModuleHandle(pszModuleName),pszFuncName);
if(m_pfnOrig!=NULL){
//保存该地址处5个字节的内容
DWORD dwNum=;
ReadProcessMemory(GetCurrentProcess(),m_pfnOrig,m_bOldBytes,,&dwNum);
//构造JMP指令
m_bNewBytes[]='\xe9';//jmp Opcode
//pfnHookFunc是HOOK后的目标地址
//m_pfnOrig是原来的地址
//5是指令长度
*(DWORD*)(m_bNewBytes+)=(DWORD)pfnHookFunc-(DWORD)m_pfnOrig-;
//将构造好的地址写入该地址处
WriteProcessMemory(GetCurrentProcess(),m_pfnOrig,m_bNewBytes,,&dwNum);
bRet=TRUE;
}
return bRet;
}
/*
函数名称:UnHook
函数功能:取消函数的挂钩
*/
VOID CILHook::UnHook(){
if(m_pfnOrig!=){
DWORD dwNum=;
WriteProcessMemory(GetCurrentProcess(),m_pfnOrig,m_bOldBytes,,&dwNum);
}
}
/*
函数名称:ReHook
函数功能:重新对函数进行挂钩
*/
BOOL CILHook::ReHook(){
BOOL bRet=FALSE;
if(m_pfnOrig!=){
DWORD dwNum=;
WriteProcessMemory(GetCurrentProcess(),m_pfnOrig,m_bNewBytes,,&dwNum);
bRet=TRUE;
}
return bRet;
}
test.cpp
#include "ILHook.h"
CILHook MsgHook;
int WINAPI MyMessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType){
MsgHook.UnHook();
MessageBox(hWnd,"Hook",lpCaption,uType);
MessageBox(hWnd,lpText,lpCaption,uType);
MsgHook.ReHook();
return ;
}
int main(){
MessageBox(NULL,"test","test",MB_OK);
MsgHook.Hook("User32.dll","MessageBoxA",(PROC)MyMessageBoxA);
MessageBox(NULL,"test","test",MB_OK);
MsgHook.UnHook();
return ;
}
最后的结果是弹出3个对话框,第一个是正常调用,后两个是跳转到自己的自定义函数里进行两次调用原函数,当然是恢复了hook之后。
这个例子是lnline hook本进程,后面会学习lnline hook非本进程。
lnline Hook初试的更多相关文章
- svnserver hook python
在使用中可能会遇到的错误排除 :1.Error: svn: 解析"D:\www\test"出错,或svn: E020024: Error resolving case of 'D: ...
- Android Hook技术
原文:http://blog.csdn.net/u011068702/article/details/53208825 附:Android Hook 全面入侵监听器 第一步.先爆项目demo照片,代码 ...
- Frida HOOK微信实现骰子作弊
由于微信摇骰子的功能在本地进行随机后在发送,所以存在可以hook掉判断骰子数的方法进行修改作弊. 1.frida实现hook java层函数1)写个用来测试的demo,当我们点击按钮的时候会弹出窗口显 ...
- java的关闭钩子(Shutdown Hook)
Runtime.getRuntime().addShutdownHook(shutdownHook); 这个方法的含义说明: 这个方法的意思就是在jvm中增加一个关闭的钩子,当jv ...
- IDT HOOK思路整理
IDT(中断描述符表)分为IRQ(真正的硬件中断)和软件中断(又叫异常). HOOK的思路为,替换键盘中断处理的函数地址为自己的函数地址.这样在键盘驱动和过滤驱动之前就可以截获键盘输入. 思路确定之后 ...
- Android Hook 借助Xposed
主要就是使用到了Xposed中的两个比较重要的方法,handleLoadPackage获取包加载时候的回调并拿到其对应的classLoader:findAndHookMethod对指定类的方法进行Ho ...
- caffe初试(一)happynear的caffe-windows版本的配置及遇到的问题
之前已经配置过一次caffe环境了: Caffe初试(一)win7_64bit+VS2013+Opencv2.4.10+CUDA6.5配置Caffe环境 但其中也提到,编译时,用到了cuda6.5,但 ...
- iOS App 无代码入侵的方法hook
继续Objective-C runtime的研究 最近公司项目在做用户行为分析 于是App端在某些页面切换,交互操作的时候需要给统计系统发送一条消息 在几十个Controller 的项目里,一个一个地 ...
- Hook机制里登场的角色
稍有接触过 WordPress 主题或插件制作修改的朋友,对 WordPress 的Hook机制应该不陌生,但通常刚接触WordPress Hook 的新手,对其运作原理可能会有点混乱或模糊.本文针对 ...
随机推荐
- matlab 中的function定义. 用最简单的例子说明.
function y=myfunction(a,b)其中a,b是输入函数的参数,y是函数返回的值.当需要返回多个值时,可以将y看作一个数组,或者直接将函数的开头写成如function [x,y]=my ...
- phoenix 使用activerecord模式框架ecto 访问数据库
备注: 需要先安装mysql 以及phoenix 框架,测试使用的是docker 进行安装,具可以参考代码 1. 创建项目 mix phx.new first --database mys ...
- Service Mesh 了解
是什么 Service Mesh是专用的基础设施层. 轻量级高性能网络代理. 提供安全的.快速的.可靠地服务间通讯. 与实际应用部署一起但对应用是透明的 作用 提供熔断机制(circuit-break ...
- caffemodel的读取与修改
直接撸代码~ import caffe import numpy as np caffe.set_mode_cpu() net = caffe.Net('myprototxt.prototxt', ' ...
- GPS数据包格式解析
四种定位系统:1.美国的全球定位系统(Global Positioning System,GPS)2.俄罗斯的格罗拉斯(Global Nabigation Satellite System,GLONA ...
- 1、Docker学习笔记
Docker是一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.它是一个开发的平台,用来为开发者和系统管理员构建.发布和运行分布式应 ...
- Bitcoin 涉及到的数据结构和算法分析
Bitcoin 2008 年中本聪提出 Bitcoin 的概念. 2009 年项目上线. 所有 coin 由 mining 产生,一共 2100 万枚.通过调整 difficulty, 确保每隔10m ...
- Java-Runoob-高级教程:Java 数据结构
ylbtech-Java-Runoob-高级教程:Java 数据结构 1.返回顶部 1. Java 数据结构 Java工具包提供了强大的数据结构.在Java中的数据结构主要包括以下几种接口和类: 枚举 ...
- Oracle清理大表,降水位
背景:一张表的清理机制存在问题,导致该表的数据一直在增加,该表水位已很高,需要对该表的数据进行清理并降水位. 1.1 迁移前准备 步骤一.新建表 p_transaction_bak. oracle@l ...
- MySQL重启端口被占用处理
1,查看日志的ERROR 2018-05-23T01:26:59.230382Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set. 201 ...