API HOOK(MessageBoxA)

笔记,非专业,只为自己看得懂,用语不专业。

API HOOK

HOOK 5字节。

新地址-老地址-5= HEX,     HEX是倒过来显示的。    

比如

00411082 > /E9 590B0000 JMP 00411BE0

 0B59

直接上代码。

// HookTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"



int MyMessageBoxA(
                  HWND hWdn,
                  LPCTSTR lpText,
                  LPCTSTR lpCaption,
                  UINT uType)
{
    char *txt="";
    _asm
    {
        RETN 2;
    }
    //Sleep();
    return 0;
}
//ULONG OldFunAddr;


void My_Hook(ULONG OldFunAddr,ULONG NewFunAddr,int CodeLen);

ULONG My_GetApiAddress(char *lpDllName,char *lpFunName);
int _tmain(int argc, _TCHAR* argv[])
{
    char *dllName="user32.dll";
    char *lpfunName="MessageBoxA";
    
    ULONG NewFuncAddr=(ULONG)MyMessageBoxA;

    MessageBoxA(NULL,"坐等HOOK","坐等HOOK title ",MB_YESNO);
    ULONG     OldFunAddr=My_GetApiAddress(dllName,lpfunName);
    if (OldFunAddr==NULL)
    {
        return NULL;
    }
    My_Hook(OldFunAddr,NewFuncAddr,5);

    MessageBoxA(NULL,"关闭句柄","坐等HOOK title ",MB_YESNO);

    //printf("1");
    //return 0;
}

BYTE hook_code[5] = {0xe9, 0, 0, 0, 0};//存放跳转到MyMessageBoxA的HEX
BYTE jmp_org_code[5] = {0xe9, 0, 0, 0, 0};//存放跳转到原起始地址后5字节的指令


BYTE m_lpJmpCode[5]={0x90,0x90,0x90,0x90,0x90};


void My_Hook(ULONG OldFunAddr,ULONG NewFunAddr,int CodeLen)
{
    //if (IsBadReadPtr((void *)OldFunAddr,CodeLen))
    //{

    //}    
    BYTE JmpMyCode[5]={0};

    ULONG m_oldFunAddr=OldFunAddr;
    ULONG m_NewFunAddr=NewFunAddr;

    INT m_CodeLen=CodeLen;
    
    DWORD lpflOldProtect =NULL; 
    HANDLE hprocss=GetCurrentProcess();

    VirtualProtectEx(hprocss,(LPVOID )m_oldFunAddr,5,PAGE_EXECUTE_READWRITE,&lpflOldProtect); //旧地址    
    *((ULONG*)(hook_code+1))=m_NewFunAddr-m_oldFunAddr-5;//计算HEX 地址。
    memcpy((LPVOID)m_oldFunAddr,hook_code,5);//用无类型指针 把 HEX拷贝过去。
    VirtualProtectEx(hprocss,(LPVOID)m_oldFunAddr,5,lpflOldProtect,&lpflOldProtect);//修改回来。

    CloseHandle(hprocss);
}



ULONG My_GetApiAddress(char *lpDllName,char *lpFunName)
{
    FARPROC fun;
    HMODULE dll;
    UINT m_oldFunAdd;

    dll =GetModuleHandleA(lpDllName);//获取DLL 模块句柄
    if (dll==0)
    {
        dll=LoadLibraryA(lpDllName);
        printf("LoadLibraryA \r\n");
    }
    if (dll==0)
    {
        return NULL;
    }
    fun=GetProcAddress(dll,lpFunName);
    m_oldFunAdd=(ULONG)fun;
    printf("GetProcAddress \r\n");
    printf("%s     Address:%d \r\n",lpFunName,m_oldFunAdd);
    
    return m_oldFunAdd;
}

刚开始学习C++ 语法方面很不熟悉。

然后

原文地址:https://www.cnblogs.com/yueyue184/p/2476666.html