1. 程式人生 > >【Inline Hook應用篇】限制開啟檔案選擇對話方塊

【Inline Hook應用篇】限制開啟檔案選擇對話方塊

  • 我們要實現限制程式不允許傳送檔案,可以通過限制“檔案選擇對話方塊”實現。對於檔案選擇對話方塊的限制,基礎點的就是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;
}