lnline Hook初试

先简单说下原理:hook,即野蛮地借用jmp等指令钩住目标函数,修改运行路径使其执行我们自己的代码。方法是在指定进程中的内存里找到目标函数的地址,然后修改其首地址的前几字节为jmp指令,指向我们自己的自定义函数地址。这样,进程执行这个函数的时候,会先执行我们自己的代码,之后可以选择性执行原函数或不执行。

流程:

1.构造跳转指令。

2.在内存中找到欲hook函数地址,并保存欲hook位置处的前5个字节。

3.将构造的跳转指令写入需hook的位置处。

4.当被hook位置被执行时会转到我们的流程执行。

5.如果要执行原来的流程,那么取消hook,也就是还原被修改的字节。

6.执行原来的流程。

7.继续hook住原来的位置。

下面就要见具体代码实现了。这是我第一次接触hook,写得很简单,对MessageBox函数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[5];//函数入口代码
    BYTE m_bNewBytes[5];//Inline代码
};

#endif

ILHook.cpp

#include "ILHook.h"

CILHook::CILHook(){
    m_pfnOrig=NULL;
    ZeroMemory(m_bOldBytes, 5);
    ZeroMemory(m_bNewBytes, 5);
}
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=0;
        ReadProcessMemory(GetCurrentProcess(),m_pfnOrig,m_bOldBytes,5,&dwNum);
        //构造JMP指令
        m_bNewBytes[0]=‘\xe9‘;//jmp Opcode
        //pfnHookFunc是HOOK后的目标地址
        //m_pfnOrig是原来的地址
        //5是指令长度
        *(DWORD*)(m_bNewBytes+1)=(DWORD)pfnHookFunc-(DWORD)m_pfnOrig-5;
        //将构造好的地址写入该地址处
        WriteProcessMemory(GetCurrentProcess(),m_pfnOrig,m_bNewBytes,5,&dwNum);

        bRet=TRUE;
    }
    return bRet;
}

/*
函数名称:UnHook
函数功能:取消函数的挂钩
*/
VOID CILHook::UnHook(){
    if(m_pfnOrig!=0){
        DWORD dwNum=0;
        WriteProcessMemory(GetCurrentProcess(),m_pfnOrig,m_bOldBytes,5,&dwNum);
    }
}

/*
函数名称:ReHook
函数功能:重新对函数进行挂钩
*/
BOOL CILHook::ReHook(){
    BOOL bRet=FALSE;
    if(m_pfnOrig!=0){
        DWORD dwNum=0;
        WriteProcessMemory(GetCurrentProcess(),m_pfnOrig,m_bNewBytes,5,&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 0;
}

int main(){
    MessageBox(NULL,"test","test",MB_OK);

    MsgHook.Hook("User32.dll","MessageBoxA",(PROC)MyMessageBoxA);
    MessageBox(NULL,"test","test",MB_OK);
    MsgHook.UnHook();

    return 0;
}

最后的结果是弹出3个对话框,第一个是正常调用,后两个是跳转到自己的自定义函数里进行两次调用原函数,当然是恢复了hook之后。

这个例子是lnline hook本进程,后面会学习lnline hook非本进程。

时间: 2024-10-17 01:35:38

lnline Hook初试的相关文章

Ubuntu Nginx uwsgi django 初试

/************************************************************************************** * Ubuntu Nginx uwsgi django 初试 * 说明: * 最近打算通过Python搭建一个数据收集的网站,先做一个搭建测试. * * 2016-8-5 深圳 南山平山村 曾剑锋 ***************************************************************

HOOK钩子技术5 SSDT Inline Hook

原理 内联钩子的原理在R3和R0下是相同的,就是不改变SSDT表项,而是改变函数内部前几条指令. 内联钩子的典型伪函数为: 恢复原指令 执行目标操作,或改写参数 执行原函数 返回时重新挂钩 demo #include "stdafx.h" #ifdef __cplusplus extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)

HDU 1689 Just a Hook 线段树区间更新求和

点击打开链接 Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18894    Accepted Submission(s): 9483 Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible

hdu 1698 Just a Hook(线段树,成段更新,懒惰标记)

Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18384    Accepted Submission(s): 9217 Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible thing

svn集成ReviewBoard,让post-commit hook后台运行

代码评审(Code Review)不但可以提高质量,而且还是一个知识共享和指导的极好的手段. 代码评审(CodeReview)一般有两种形式:pre-commit-review,post-commit-review. pre-commit-review是指代码提交到代码库前进行代码评审: post-commit-review是指代码提交到代码库后进行代码评审. ReviewBoard是一个开源的基于web的代码评审工具,支持Subversion,CVS,Git和Mercurial版本控制系统.

gitlab+jenkins+hook代码自动构建发布上线

Gitlab+Jenkins+Hook 1.gitlab和jenkins的安装见: http://www.cnblogs.com/cuishuai/p/7544663.html http://www.cnblogs.com/cuishuai/p/7544775.html 2.gitlab配置 1)创建一个project,并创建一个monkey的分支. 2)对分支进行设置: 点击project->settings->integrations: 1. 2. 3 Webhook,点击test,返回如

android hook 框架 libinject2 简介、编译、运行

简介: libinject 最开始是2011年看雪android安全版版主之一‘古河’大神发布的一份android平台的注入库:  发个Android平台上的注入代码  ,网上很多随后发布的注入代码都是其变种,不过我这几天尝试运行那份代码,发现有些问题,本博运行和分析的代码是另外一位大神的改进版本,在我的环境里运行注入和挂钩都成功了 : Android中的so注入(inject)和挂钩(hook) - For both x86 and arm ,为了表示区别,我把这个项目称为  libinjec

&lt;BEA-000388&gt; &lt;JVM called WLS shutdown hook. The server will force shutdown now&gt;

在生产weblogic部署环境,发现weblogic每隔几个小时就shutdown一次,经过跟踪发现既不是内存问题,也不是数据库连接池问题,更不是访问量过大引起. 查询相关日志,只有以下几句shutdown的日志: <BEA-000388> <JVM called WLS shutdown hook. The server will force shutdown now> <BEA-000396> <Server shutdown has been request

WordPress中函数钩子hook的作用及基本用法

WordPress 的插件机制实际上只的就是这个 Hook 了,它中文被翻译成钩子,允许你参与 WordPress 核心的运行,是一个非常棒的东西,下面我们来详细了解一下它.钩子分类 钩子分为两种,一种叫做动作(action),还有一种叫做过滤器(filter).这两种钩子实现原理基本一样,后边会讲到,使用上的区别在于过滤器有返回值,而动作没有. 动作的理念是让你在一种情况或者一个特别的位置执行一些函数,比如发送一封邮件等:过滤器则是让你修改 WordPress 核心需要用到的一个值,然后 Wo