版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fzuim/article/details/81318792
- 我们要实现限制程序不允许发送文件,可以通过限制“文件选择对话框”实现。对于文件选择对话框的限制,基础点的就是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;
}