1. 程式人生 > >【Inline Hook應用篇】限制剪下板(針對檔案型別)

【Inline Hook應用篇】限制剪下板(針對檔案型別)

  • 限制剪下板,主要是限制不允許貼上。我們對這兩個系統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; }