【Inline Hook應用篇】限制開啟檔案選擇對話方塊
阿新 • • 發佈:2018-11-09
- 我們要實現限制程式不允許傳送檔案,可以通過限制“檔案選擇對話方塊”實現。對於檔案選擇對話方塊的限制,基礎點的就是Hook:GetOpenFileName、SHBrowseForFolder,對這兩個API的Hook,可以限制市面上80%的檔案傳送,但對於QQ之類的在XP系統以上就不能成功限制了。具體是因為QQ在選擇檔案傳送的對話方塊,採用COM介面來實現,所以要限制QQ傳送檔案,還需要額外Hook COM介面。COM Hook放在下一篇進行概述,這一篇簡單的實現下GetOpenFileName、SHBrowseForFolder的Hook。
//!<限制檔案選擇對話方塊
InitHook("comdlg32.dll", "GetOpenFileNameA", (DWORD)hook_OpenFileNameA);
InitHook("comdlg32.dll", "GetOpenFileNameW", (DWORD)hook_OpenFileNameW);
BOOL _stdcall hook_OpenFileNameA(LPOPENFILENAME lpofn)
{
BOOL bRet;
PAPIHOOK32_ENTRY phk= g_HookEntry[3];
//恢復API頭8個位元組
RESTORE_OLDADDRESS( phk);
/* 這裡可以新增想要進行的處理過程*/
//真正執行API函式
bRet = ::GetOpenFileNameA( lpofn );
//寫入跳轉語句,繼續Hook
SET_NEWADDRESS( phk);
if (CheckEnabled(g_iAppIndex))
{
if (( NULL == lpofn->lpstrFilter)
|| ( NULL != strstr(lpofn->lpstrFilter, "所有檔案" ))
|| ( NULL != strstr(lpofn->lpstrFilter, "*.*" ))
|| ( NULL != strstr(lpofn->lpstrFilter, "All Files")))
{
return FALSE;
}
}
return bRet;
}
BOOL _stdcall hook_OpenFileNameW(LPOPENFILENAMEW lpofn)
{
BOOL bRet;
PAPIHOOK32_ENTRY phk= g_HookEntry[4];
//恢復API頭8個位元組
RESTORE_OLDADDRESS(phk);
/* 這裡可以新增想要進行的處理過程*/
//真正執行API函式
bRet = ::GetOpenFileNameW(lpofn);
//寫入跳轉語句,繼續Hook
SET_NEWADDRESS(phk);
CErrModule::ShowMsgW(lpofn->lpstrFilter);
if (CheckEnabled(g_iAppIndex))
{
if (( NULL == lpofn->lpstrFilter)
|| ( NULL != wcsstr(lpofn->lpstrFilter, L"所有檔案"))
|| ( NULL != wcsstr(lpofn->lpstrFilter, L"*.*"))
|| ( NULL != wcsstr(lpofn->lpstrFilter, L"All Files")))
{
return FALSE;
}
}
return bRet;
}
//!<限制傳送資料夾
InitHook("shell32.dll", "SHBrowseForFolderW", (DWORD)hook_SHBrowseForFolderW);
LPITEMIDLIST WINAPI hook_SHBrowseForFolderW(LPBROWSEINFOW lpbi)
{
LPITEMIDLIST pList;
PAPIHOOK32_ENTRY phk = g_HookEntry[9];
//恢復API頭8個位元組
RESTORE_OLDADDRESS(phk);
/*這裡可以新增想要進行的處理過程*/
//真正執行API函式
pList = SHBrowseForFolderW(lpbi);
//寫入跳轉語句,繼續Hook
SET_NEWADDRESS(phk);
if (CheckEnabled(g_iAppIndex))
return NULL;
return pList;
}