hook api (push xxxx/retn)

#include<windows.h>
#include"LDasm.c"

int   (_stdcall * pMessageBox)(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);


int _stdcall myMessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)
{
    lpText="hello";
    return  ( *pMessageBox)(hWnd,lpText,lpCaption,uType);
}

bool hookapi_p(
             LPCTSTR dll,//dll的名称
             LPCSTR api,//API的名称
             DWORD *lpfunc,//自己函数的地址
             LPVOID *NextHook//NextHook的地址
             )
{
    FARPROC handle;
    PBYTE bytec;
    PDWORD dwordc;
    int pSize;
    unsigned long oldpoint;
   
    handle=GetProcAddress(LoadLibrary(dll),api);
    if(!handle) return 0;
    if (*((PUCHAR)handle)==0xe8) return 0;
    pSize = SizeOfHook_push(handle);

    if (VirtualProtect(handle,pSize,PAGE_EXECUTE_READWRITE,&oldpoint))//开启可写属性
    {
        *NextHook = VirtualAlloc(NULL,0x1000, MEM_COMMIT,PAGE_EXECUTE_READWRITE);    //'申请内存空间
        //将原函数 前pSize个字节复制到NextHook中
        CopyMemory ((PVOID)*NextHook,handle,pSize);                               //读取n字节保存
       
        //再已复制的字节后添加 跳转至 原函数+pSize
        bytec=(PBYTE)(*NextHook);
        *(bytec+pSize)=0xe9;
        dwordc=(PDWORD)((DWORD)*NextHook+pSize+1);
        *(dwordc)=(DWORD)handle-(DWORD)*NextHook-5;
   
        // '保存被Hook API函数的地址
        dwordc=(PDWORD)((DWORD)*NextHook+pSize+5);
        *(dwordc)=(DWORD)handle;  
       
        //将原函数修改为跳转 到指定的函数
        bytec=(PBYTE)(handle);
        *(bytec)=0x68;
        dwordc=(PDWORD)((DWORD)handle+1);
        *(dwordc)=(DWORD)lpfunc;
        *(bytec+5)=0xc3;

        FlushInstructionCache(GetCurrentProcess(), handle, pSize);                 //'确保执行更改
        VirtualProtect(handle, pSize, oldpoint, &oldpoint);                    // '恢复原来的属性
    }
    else
        return 0;
    return 1;
}

bool unhookapi_p(LPVOID *NextHook)//NextHook的地址
{
    BYTE bytec;
    LPVOID lOldAddrs;
    int pSize;
    unsigned long oldpoint;
   

    pSize = SizeOfHook_push(*NextHook);
    if (NextHook)
    {
        bytec=(BYTE)*((PBYTE)*NextHook+pSize);
        if (bytec==0xe9)
        {
            lOldAddrs=(LPVOID)*(PDWORD)((DWORD)*NextHook+pSize+5);
            VirtualProtect(lOldAddrs, pSize, PAGE_EXECUTE_READWRITE, &oldpoint);         // '修改内存属性页为可写
            CopyMemory ((PVOID)lOldAddrs,*NextHook,pSize);
            FlushInstructionCache(GetCurrentProcess(), lOldAddrs, pSize);                 //'确保执行更改
            VirtualProtect(*NextHook, pSize, oldpoint, &oldpoint);                    // '恢复原来的属性
            if(VirtualFree(*NextHook, NULL, MEM_RELEASE))                  // '释放内存空间
               *NextHook = NULL;                                                      //  '把自己函数地址设为NULL    
        }
        else
            return 0;
    }
    else
        return 0;
    return 1;
}


void main()
{
    MessageBoxA(NULL,"1","2",MB_OK);
    hookapi_p("user32.dll","MessageBoxA",(PDWORD)myMessageBox,(LPVOID*)&pMessageBox);
    MessageBoxA(NULL,"4","3",MB_OK);
    unhookapi_p((LPVOID*)&pMessageBox);
    MessageBoxA(NULL,"4","3",MB_OK);
}

/**********************************
连城制作 注意版权哦。
QQ:173661967
**********************************/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值