【Inline Hook應用篇】限制剪下板(針對檔案型別)
阿新 • • 發佈:2018-11-09
- 限制剪下板,主要是限制不允許貼上。我們對這兩個系統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;
}