• 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++ 语法方面很不熟悉。

    然后

  • 相关阅读:
    js获取触发事件的元素
    js获取触发事件的元素
    jQuery动态显示和隐藏datagrid中的某一列的方法
    jQuery动态显示和隐藏datagrid中的某一列的方法
    在控制器“xxxx”上找不到与该请求匹配的操作
    在控制器“xxxx”上找不到与该请求匹配的操作
    配置virtualbox使得openstackn controller可以连接外网
    配置mysql远程访问
    fuel部完高可用环境后vip__public无法启动从而导致创建虚机时无法创建virtualInterface.
    VMWare/VirtualBox三种网络模式及NAT/host-only模式设置上网与主机互联通信
  • 原文地址:https://www.cnblogs.com/yueyue184/p/2476666.html
Copyright © 2020-2023  润新知