【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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值