【Inline Hook应用篇】限制剪切板(针对文件类型)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fzuim/article/details/81302056
  • 限制剪切板,主要是限制不允许粘贴。我们对这两个系统API进行挂钩:
GetClipboardData和OleGetClipboard

//!<限制剪切板
InitHook("user32.dll", "GetClipboardData", (DWORD)hook_GetClipboardData);
InitHook("ole32.dll", "OleGetClipboard", (DWORD)hook_OleGetClipboard);
HANDLE _stdcall hook_GetClipboardData( UINT uFormat )
{ 
    if (CF_HDROP == uFormat)
    {//如果是文件,直接返回NULL
        return NULL;
    }

    HANDLE hRet;   

    PAPIHOOK32_ENTRY phk = g_HookEntry[1];//我这边是用了全局数组存储InitHook New出来的指针

    //恢复API头8个字节   
    RESTORE_OLDADDRESS(phk);
    /* 这里可以添加想要进行的处理过程*/    
    //真正执行API函数   
    hRet = GetClipboardData( uFormat );    
    //写入跳转语句,继续Hook   
    SET_NEWADDRESS(phk);

    return hRet;
} 
HRESULT _stdcall hook_OleGetClipboard( IDataObject ** ppDataObj )
{ 
    HRESULT hRet;   

    PAPIHOOK32_ENTRY phk= g_HookEntry[2];

    //恢复API头8个字节   
    RESTORE_OLDADDRESS( phk);
    /* 这里可以添加想要进行的处理过程*/    
    //真正执行API函数   
    hRet = OleGetClipboard( ppDataObj );    
    //写入跳转语句,继续Hook   
    SET_NEWADDRESS( phk);

    // 判断是否是文件类型
    FORMATETC cFmt = {(CLIPFORMAT) CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
    HRESULT hTemp = (*ppDataObj)->QueryGetData( &cFmt);
    if ( S_OK == hTemp)
    {
        return CLIPBRD_E_CANT_OPEN ;
    }

    return hRet;
} 

猜你喜欢

转载自blog.csdn.net/fzuim/article/details/81302056