• 大小: 6KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-10
  • 语言: 其他
  • 标签: api  hook  

资源简介

有错误有错误有错误有错误有错误有错误有错误有错误

资源截图

代码片段和文件信息

#include “StdAfx.h“
#include “APIHook.h“

//////////////////////////////////////////////////////////////  
// APIHook.cpp文件  
#include “stdafx.h“  
#include “APIHook.h“  
#include “Tlhelp32.h“  
  
#include  // 为了调用ImageDirectoryEntryToData函数  
#pragma comment(lib “ImageHlp“)  
  
  
// CAPIHook对象链表的头指针  
CAPIHook* CAPIHook::sm_pHeader = NULL;  
  
CAPIHook::CAPIHook(LPSTR pszModName LPSTR pszFuncName PROC pfnHook BOOL bExcludeAPIHookMod)  
{  
    // 保存这个Hook函数的信息  
    m_bExcludeAPIHookMod = bExcludeAPIHookMod;  
    m_pszModName = pszModName;  
    m_pszFuncName = pszFuncName;  
    m_pfnHook = pfnHook;  
    m_pfnOrig = ::GetProcAddress(::GetModuleHandle(pszModName) pszFuncName);  
  
    // 将此对象添加到链表中  
    m_pNext = sm_pHeader;  
    sm_pHeader = this;  
      
    // 在所有当前已加载的模块中HOOK这个函数  
    ReplaceIATEntryInAllMods(m_pszModName m_pfnOrig m_pfnHook bExcludeAPIHookMod);   
}  
  
CAPIHook::~CAPIHook()  
{  
    // 取消对所有模块中函数的HOOK  
    ReplaceIATEntryInAllMods(m_pszModName m_pfnHook m_pfnOrig m_bExcludeAPIHookMod);  
  
    CAPIHook *p = sm_pHeader;  
  
    // 从链表中移除此对象  
    if(p == this)  
    {  
        sm_pHeader = p->m_pNext;  
    }  
    else  
    {  
        while(p != NULL)  
        {  
            if(p->m_pNext == this)  
            {  
                p->m_pNext = this->m_pNext;  
                break;  
            }  
            p = p->m_pNext;  
        }  
    }  
  
}  
  
void CAPIHook::ReplaceIATEntryInOneMod(LPSTR pszExportMod   
                   PROC pfnCurrent PROC pfnNew HMODULE hModCaller)  
{  
    // 取得模块的导入表(import descriptor)首地址。ImageDirectoryEntryToData函数可以直接返回导入表地址  
    ULONG ulSize;  
    PIMAGE_IMPORT_DEscriptOR pImportDesc = (PIMAGE_IMPORT_DEscriptOR)  
                ::ImageDirectoryEntryToData(hModCaller TRUE   
                    IMAGE_DIRECTORY_ENTRY_IMPORT &ulSize);  
    if(pImportDesc == NULL) // 这个模块没有导入节表  
    {  
        return;  
    }  
  
    // 查找包含pszExportMod模块中函数导入信息的导入表项  
    while(pImportDesc->Name != 0)  
    {  
        LPSTR pszMod = (LPSTR)((DWORD)hModCaller + pImportDesc->Name);  
        if(lstrcmpiA(pszMod pszExportMod) == 0) // 找到  
            break;  
  
        pImportDesc++;  
    }  
    if(pImportDesc->Name == 0) // hModCaller模块没有从pszExportMod模块导入任何函数  
    {  
        return;  
    }  
  
    // 取得调用者的导入地址表(import address table IAT)  
    PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)(pImportDesc->FirstThunk + (DWORD)hModCaller);  
  
    // 查找我们要HOOK的函数,将它的地址用新函数的地址替换掉  
    while(pThunk->u1.Function)  
    {  
        // lpAddr指向的内存保存了函数的地址  
        PDWORD lpAddr = (PDWORD)&(pThunk->u1.Function);  
        if(*lpAddr == (DWORD)pfnCurrent)  
        {  
  
            ::WriteProcessMemory(::GetCurrentProcess()   
                        lpAddr &pfnNew sizeof(DWORD) NULL);  
  
            //::VirtualProtect(lpAddr sizeof(DW

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       6992  2013-06-20 20:19  帖子中的代码\APIHook.cpp

     文件       2111  2013-06-20 20:19  帖子中的代码\APIHook.h

     文件       1883  2013-06-20 12:44  帖子中的代码\HookTerminateProcess.cpp

     文件       5413  2013-06-20 12:50  帖子中的代码\lxh_hookapi_testDlg.cpp

     目录          0  2013-06-20 20:47  帖子中的代码

----------- ---------  ---------- -----  ----

                16399                    5


评论

共有 条评论