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 的新手,对其运作原理可能会有点混乱或模糊.本文针对 ...
随机推荐
- check sub-string in the string
if "blah" not in somestring: continue
- REX-Ray 了解
REX-Ray 是一个 EMC {code} 团队领导的开源项目,为 Docker.Mesos 及其他容器运行环境提供持续的存储访问.其设计旨在囊括通用存储.虚拟化和云平台,提供高级的存储功能. 当前 ...
- python自动发送邮件
Python 的 smtplib 模块提供了发送电子邮件的功能.测试报告出来后,然后就把报告发送到邮箱. 一.先来看简单的列子 使用QQ邮箱发送邮件,使用的是授权码,需要先到QQ邮箱申请授权码. 邮箱 ...
- WaitHandle学习笔记
信号量与互斥体 互斥体(Mutex)是操作系统中一种独占访问共享资源的机制.它像一把所锁,哪个线程获取到互斥体的控制权,则可以访问共享的资源,或者执行处于受保护的代码.而其他的线程如果也想获取控制权, ...
- NFS搭建与配置
NFS应用场景是:A,B,C三台机器上需要保证被访问到的文件是一样的,A共享数据出来,B和C分别去挂载A共享的数据目录,从而B和C访问到的数据和A上的一致性 172.131.1.135 服务器端 1 ...
- ubuntu 进入单用户模式
进入单用户模式: 按shift进入 1.开机到grub时,用上下键移到第二行的恢复模式,按e(注意不是回车) 即Ubuntu,With Linux 3.2.0-23-generic(recovery ...
- 以Linux下的测试程序说明递归型互斥量和普通互斥量的区别
先贴代码和测试结果 // Mutex.h: 对pthread的互斥量的RAII包装 #ifndef _MUTEX_H_ #define _MUTEX_H_ #include <stdio.h&g ...
- Java垃圾回收原理
无意中在网络上找到了这篇介绍垃圾回收机制的文章,好文!转一下: 垃圾回收器是如何工作的?我现在就简单的介绍一下 首先要明确几点: Java是在堆上为对象分配空间的 垃圾回收器只跟内存有关,什么IO啊, ...
- Struts2的fliter与interceptor
struts2 fliter与interceptor的区别 1.拦截器是基于java反射机制的,而过滤器是基于函数回调的.2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器.3 ...
- [转]加密经验集 => C#
下载地址 代码摘自 C#高级编程(第7版) 第579页 不对称加密