Hook技术2 内存中修改模块开头代码为跳转语句

转载 2012年03月01日 09:41:54
 
 分类: Hook技术心得2008-08-31 19:50 241人阅读 评论(0) 收藏 举报

这种霸道的技术,一般不推荐使用,除非无奈之下,不妨可以试试。

原理也很简单,要导入一个Dll,把它在内存中的代码,前几代改为

JUMP 我的函数地址

然后,在我的里,再把他的几行代码改回去,把我自己的事做完之后,再调用它,也可以不调用。最后它返回后,又将它的前几行代码改为JUMP。

原理非常简单:

下面给出一个封装好的类:

//////////////////////////////////////////////////////////

// ULHook.h

 

#ifndef __ULHOOK_H__

#define __ULHOOK_H__

 

#include <windows.h>

 

class CULHook

{

public:

     CULHook(LPSTR pszModName, LPSTR pszFuncName, PROC pfnHook);

     ~CULHook();

     // 取消挂钩

     void Unhook();

     // 重新挂钩

     void Rehook();

protected:

     PROC m_pfnOrig;                 // 目标API函数的地址

     BYTE m_btNewBytes[8];       // 新构建的个字节

     BYTE m_btOldBytes[8];       // 原来个字节

     HMODULE m_hModule;

};

 

#endif // __ULHOOK_H__

 

///////////////////////////////////////////

// ULHook.cpp文件

 

 

#include "ULHook.h"

 

 

CULHook::CULHook(LPSTR pszModName, LPSTR pszFuncName, PROC pfnHook)

{

 

     // jmp eax == 0xFF, 0xE0

     // 生成新的执行代码

     BYTE btNewBytes[8] = { 0xB8, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xE0, 0x00 };

     memcpy(m_btNewBytes, btNewBytes, 8);

     *(DWORD *)(m_btNewBytes + 1) = (DWORD)pfnHook;

 

     // 加载指定模块,取得API函数地址

     m_hModule = ::LoadLibrary(pszModName);

     if(m_hModule == NULL)

     {

         m_pfnOrig = NULL;

         return;

     }

     m_pfnOrig = ::GetProcAddress(m_hModule, pszFuncName);

 

 

     // 修改原API函数执行代码的前个字节,使它跳向我们的函数

     if(m_pfnOrig != NULL)

     {

         DWORD dwOldProtect;

         MEMORY_BASIC_INFORMATION    mbi;

         ::VirtualQuery( m_pfnOrig, &mbi, sizeof(mbi) );

         ::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect);

 

         // 保存原来的执行代码

         memcpy(m_btOldBytes, m_pfnOrig, 8);

         // 写入新的执行代码

         ::WriteProcessMemory(::GetCurrentProcess(), (void *)m_pfnOrig,

                            m_btNewBytes, sizeof(DWORD)*2, NULL);

    

         ::VirtualProtect(m_pfnOrig, 8, mbi.Protect, 0);

     }

}

 

CULHook::~CULHook()

{

     Unhook();

     if(m_hModule != NULL)

         ::FreeLibrary(m_hModule);

}

 

void CULHook::Unhook()

{

     if(m_pfnOrig != NULL)

     {

         DWORD dwOldProtect;

         MEMORY_BASIC_INFORMATION    mbi;

         ::VirtualQuery(m_pfnOrig, &mbi, sizeof(mbi));

         ::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect);

 

         // 写入原来的执行代码

         ::WriteProcessMemory(::GetCurrentProcess(), (void *)m_pfnOrig,

                            m_btOldBytes, sizeof(DWORD)*2, NULL);

    

         ::VirtualProtect(m_pfnOrig, 8, mbi.Protect, 0);

     }

}

 

void CULHook::Rehook()

{

     // 修改原API函数执行代码的前个字节,使它跳向我们的函数

     if(m_pfnOrig != NULL)

     {

         DWORD dwOldProtect;

         MEMORY_BASIC_INFORMATION    mbi;

         ::VirtualQuery( m_pfnOrig, &mbi, sizeof(mbi) );

         ::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect);

 

         // 写入新的执行代码

         ::WriteProcessMemory(::GetCurrentProcess(), (void *)m_pfnOrig,

                            m_btNewBytes, sizeof(DWORD)*2, NULL);

    

         ::VirtualProtect(m_pfnOrig, 8, mbi.Protect, 0);

     }

}

HOOK 几种实现方式区别

Hook简介 微软的MSDN中,对Hook的解释为: A hook is a point in the system message-handling mechanism where an appl...
  • shenjianxz
  • shenjianxz
  • 2016-08-30 13:06:11
  • 9482

Inline Hook 之(监视任意函数)

原文转自:http://blog.csdn.net/masefee/article/details/6326634 前面已经写过两次inline hook的博文了,第一篇为:《C/C++ H...
  • hpp24
  • hpp24
  • 2016-09-12 15:08:23
  • 1696

游戏修改器制作教程六:hook的各种姿势

在第二章介绍了hook机制,本章要自己实现hook,实现调用某个函数时我们能截获、修改、取消这次调用...
  • xfgryujk
  • xfgryujk
  • 2015-12-18 11:33:22
  • 4231

HOOK API入门之Hook自己程序的MessageBoxW

说到HOOK,我看了很多的资料和教程,无奈就是学不会HOOK,不懂是我的理解能力差,还是你们说的 不够明白,直到我看了以下这篇文章,终于学会了HOOK: http://blog.sina.com.cn...
  • friendan
  • friendan
  • 2013-10-01 20:12:39
  • 36109

Inline Hook 之(监视任意函数)

前面已经写过两次inline hook的博文了,第一篇为:《C/C++ HOOK API(原理深入剖析之-LoadLibraryA)》,这篇博文的方法是通过修改任意函数的前面N个字节,实现跳转并进入到...
  • masefee
  • masefee
  • 2011-04-15 21:05:00
  • 30394

WINDOWS下的各类HOOK

1、HOOK SERVICE TABLE:HOOK SSDT 这种方法对于拦截 NATIVE API 来说用的比较多。 SSDT hook,一句话——Windows把需要调用的内核API地址全都存在...
  • whatday
  • whatday
  • 2013-07-29 12:04:48
  • 2456

补丁模块(带源码)InlinePatch,Hook,内存DLL注入等等

  • 2015年09月24日 13:07
  • 545KB
  • 下载

分享补丁模块(带源码)InlinePatch,Hook,内存DLL注入 都有哦

这个模块是我使用易语言时写补丁最常用的一个模块(当然很多也是抄的),一开始我觉得bug肯定会很多,放出去肯定又会坑很多人,后来我发现坑坑更健康,当你明白一个东西的优缺点之后,你才会更好的选择你所需要的...
  • sunflover454
  • sunflover454
  • 2015-09-24 12:59:29
  • 3550

Hook技术之API拦截(API Hook)

Inline Hook就是修改
  • bobopeng
  • bobopeng
  • 2014-06-02 22:23:05
  • 7294

hook

我们hook的就是第18行(0042EC7B)那句代码,setHookBytes构建了一个5字节的call语句,0xe8为CALL指令的机器码,后面4个字节是CALL的偏移量(目标地址 - 当前地址 ...
  • linuxheik
  • linuxheik
  • 2015-10-19 19:20:00
  • 448
收藏助手
不良信息举报
您举报文章:Hook技术2 内存中修改模块开头代码为跳转语句
举报原因:
原因补充:

(最多只允许输入30个字)