成人在线你懂的-成人在线免费小视频-成人在线免费网站-成人在线免费视频观看-日韩精品国产一区二区-日韩精品国产一区

掃一掃
關(guān)注微信公眾號(hào)

防止全局鉤子的入侵
2006-02-16   

Windows消息鉤子一般都很熟悉了。它的用處很多,耳熟能詳?shù)木陀小面I盤(pán)鉤子獲取目標(biāo)進(jìn)程的鍵盤(pán)輸入,從而獲得各類(lèi)密碼以達(dá)到不可告人的目的。朋友想讓他的軟件不被別人的全局鉤子監(jiān)視,有沒(méi)有辦法實(shí)現(xiàn)呢?答案是肯定的,不過(guò)缺陷也是有的。

首先簡(jiǎn)單看看全局鉤子如何注入別的進(jìn)程。

消息鉤子是由Win32子系統(tǒng)提供,其核心部分通過(guò)NtUserSetWindowsHookEx為用戶(hù)提供了設(shè)置消息鉤子的系統(tǒng)服務(wù),用戶(hù)通過(guò)它注冊(cè)全局鉤子。當(dāng)系統(tǒng)獲取某些事件,比如用戶(hù)按鍵,鍵盤(pán)driver將掃描碼等傳入win32k的KeyEvent處理函數(shù),處理函數(shù)判斷有無(wú)相應(yīng)hook,有則callhook。此時(shí),系統(tǒng)取得Hook對(duì)象信息,若目標(biāo)進(jìn)程沒(méi)有裝載對(duì)應(yīng)的Dll,則裝載之(利用KeUserModeCallback“調(diào)用”用戶(hù)例程,它與Apc調(diào)用不同,它是仿制中斷返回環(huán)境,其調(diào)用是“立即”性質(zhì)的)。

進(jìn)入用戶(hù)態(tài)的KiUserCallbackDispatcher后,KiUserCallbackDispatcher根據(jù)傳遞的數(shù)據(jù)獲取所需調(diào)用的函數(shù)、參數(shù)等,隨后調(diào)用。針對(duì)上面的例子,為裝載hook dll,得到調(diào)用的是LoadLibraryExW,隨后進(jìn)入LdrLoadDll,裝載完畢后返回,后面的步驟就不敘述了。

從上面的討論我們可以得出一個(gè)最簡(jiǎn)單的防侵入方案:在加載hook dll之前hook相應(yīng)api使得加載失敗,不過(guò)有一個(gè)缺陷:系統(tǒng)并不會(huì)因?yàn)橐淮蔚氖《艞墸看斡邢a(chǎn)生欲call hook時(shí)系統(tǒng)都會(huì)試圖在你的進(jìn)程加載dll,這對(duì)于性能有些微影響,不過(guò)應(yīng)該感覺(jué)不到。剩下一個(gè)問(wèn)題就是不是所有的LoadLibraryExW都應(yīng)攔截,這個(gè)容易解決,比如判斷返回地址。下面給出一個(gè)例子片斷,可以添加一些判斷使得某些允許加載的hook dll被加載。

這里hook api使用了微軟的detours庫(kù),可自行修改。

以下內(nèi)容為程序代碼:

typedef HMODULE (__stdcall *LOADLIB)(
LPCWSTR lpwLibFileName,
HANDLE hFile,
DWORD dwFlags);

extern "C" {
DETOUR_TRAMPOLINE(HMODULE __stdcall Real_LoadLibraryExW(
LPCWSTR lpwLibFileName,
HANDLE hFile,
DWORD dwFlags),
LoadLibraryExW);
}

ULONG user32 = 0;

HMODULE __stdcall Mine_LoadLibraryExW(
LPCWSTR lpwLibFileName,
HANDLE hFile,
DWORD dwFlags)
{
ULONG addr;

_asm mov eax, [ebp+4]
_asm mov addr, eax

if ((user32 & 0xFFFF0000) == (addr & 0xFFFF0000))
{
return 0;
}

HMODULE res = (LOADLIB(Real_LoadLibraryExW)) (
lpwLibFileName,
hFile,
dwFlags);

return res;
}

BOOL ProcessAttach()
{
DetourFunctionWithTrampoline((PBYTE)Real_LoadLibraryExW,
(PBYTE)Mine_LoadLibraryExW);
return TRUE;
}

BOOL ProcessDetach()
{
DetourRemove((PBYTE)Real_LoadLibraryExW,
(PBYTE)Mine_LoadLibraryExW);
return TRUE;
}

CAnti_HookApp::CAnti_HookApp() //在使用用戶(hù)界面服務(wù)前調(diào)用ProcessAttach
{
user32 = (ULONG)GetModuleHandle("User32.dll");
ProcessAttach();


熱詞搜索:

上一篇:還我清靜:垃圾郵件防治終極攻略(1)
下一篇:雙機(jī)熱備份VS單機(jī)容錯(cuò)

分享到: 收藏
主站蜘蛛池模板: 香港之夜完整版在线观看高清| 电影《la follia》| 工会基层组织选举工作条例| 徐情| 三年片大全电影| 吴承轩主演的电视剧| 消失的客人| 贝子鸟的叫声大全| 影片《边境》| 赛虎| 帅克| 陈宝莲徐锦江夜半2普通话| 辐射避难所掉脑袋问题答案 | 跟班服务| 变形金刚1免费完整版在线观看| 我的神我要赞美你| 木偶人| 乔什布洛林| 六一儿童节幕后换演出服| 科特·柯本| 我的公公电影| 毛骨悚然撞鬼经| 水怪电影| 米奇888| 张振铎| 假如爱有天意| 张猛龙魏碑字帖大全| 电影《无主之城》| 试看60秒做受小视频| 超在线视频| 三年电影| chinesehd国语话对白| 老片.经典.hd.videos| 郑丽身高一米几| 寻宝电影| 老片.经典.hd.videos| 斯科| 3844开关电源电路图| 二年级写玩具的作文| 陈慧娴个人资料| 四 电影|