有些人說不去掉也不會藍屏,照樣能hook成功
確實,我當時也是這樣過。。。
不過拿給別人機器一測試就藍了
網上找到了mj給出的答案:
當使用大頁面對映核心檔案時,**段和資料段在一塊兒,所以頁必須是可寫的,這種情況下直接改是沒有問題的
hkey_local_machine\system\currentcontrolset\control\session manager\memory management下面增加兩個dword值'largepageminimum" = 0xffffffff, "enforcewriteprotection" = 1,重啟,重新跑自己的驅動。。。
win2k上ram超過127m,winxp和win server 2003上ram超過255m,記憶體管理器會使用大頁面(x86上4m,ia64和x86-64上16m)來對映ntoskrnl.exe,這樣由於**和資料可能駐留在同乙個頁面,所以**寫保護是被禁止的。以上兩個登錄檔修改項,第乙個指明了當記憶體數量達到多少時使用大頁面來對映ntoskrnl,設定成0xffffffff就是相當於無限大,因此不會使用大頁面。第二個開啟**寫保護。
一般去掉寫保護有三種方法:
1.更改登錄檔(需要重啟)
hklm/system/currentcontrolset/control/session manger/
memory management/enforcewriteprotection=0
與hklm/system/currentcontrolset/control/session manger/
memory management/disablepagingexecutive=1
2.修改控制暫存器cr0
就是把cr0中的wp(寫保護)位設定為0,就可以禁止記憶體保護了。
[cpp]view plain
copy
//取消記憶體保護
_asm
//重新開啟記憶體保護
下面的寫法是否存在bug呢???
_asm
正確的方法應該是:首先要儲存cr0資料,然後關閉記憶體寫保護;最後使用儲存的cr0資料恢復cr0暫存器資料
3.利用mdl(memory descriptor list)來繞過寫保護
我們可以在mdl中描述一段記憶體,包括記憶體段的起始位置、所擁有的程序、位元組數、記憶體段的標誌等等。
[cpp]view plain
copy
//mdl reference defined in ntddk.h
typedef struct
_mdlmdl,*pmdl;
//mdl flags
#define mdl_pages_locked 0x0002
#define mdl_source_is_nonpaged_pool 0x0004
#define mdl_allocated_fixed_size 0x0008
#define mdl_partial 0x0010
#define mdl_io_page_read 0x0040
#define mdl_write_operation 0x0080
#define mdl_lock_held 0x0200
#define mdl_physical_view 0x0400
#define mdl_io_space 0x0800
#define mdl_network_header 0x1000
#define mdl_allocated_must_succeed 0x4000
[cpp]view plain
copy
//宣告
#pragma pack(1)
typedef struct
servicedescriptorentryssdt_entry;
#pragma pack()
_declspec(dllimport
) ssdt_entry keservicedescriptortable;
pmdl g_pmdlsystemcall;
pvoid
//儲存原始的系統呼叫位址,對映到我們的域中,來改變mdl的保護
g_pmdlsystemcall = mmcreatemdl(null,
keservicedescriptortable,
servicetablebase,
keservciedescriptortable.numberofservice*4);
if(!g_pmdlsystemcall)
return status_unsuccessful;
mmbuildmdlfornonpagedpool(g_pmdlsystemcall);
//改變mdl的標誌
g_pmdlsystemcall->mdlflags = g_pmdlsystemcall->mdlflags |
下面列出幾個對ssdt hook比較有用的幾個巨集。
[cpp]view plain
copy
#define hook_index(function2hook) *(pulong)((puchar)function2hook + 1)
#define hook(functionname, newpointer2function, oldpointer2function ) /
oldpointer2function = (pvoid
) interlockedexchange( (
plong
) &newsystemcalltable[hook_index(functionname)], (
long
) newpointer2function)
#define unhook(functionname, oldpointer2function) /
interlockedexchange( (plong
) &newsystemcalltable[hook_index(functionname)], (
long
) oldpointer2function)
#define unhook(functionname, oldpointer2function) /
interlockedexchange( (plong
) &newsystemcalltable[hook_index(functionname)], (
long
) oldpointer2function)
關於SSDT HOOK取消記憶體寫保護的問題
有些人說不去掉也不會藍屏,照樣能hook成功 確實,我當時也是這樣過。不過拿給別人機器一測試就藍了 網上找到了mj給出的答案 當使用大頁面對映核心檔案時,段和資料段在一塊兒,所以頁必須是可寫的,這種情況下直接改是沒有問題的 hkey local machine system currentcontr...
SSDT HOOK實現程序保護
灰狐 ssdt hook已經是很老的技術了,但對新手來說還是有一些嚼頭的。根據常規的做法,我們應該掛鉤 zwterminateprocess函式,不過這個函式僅有兩個引數,其中乙個是程序控制代碼,它指定了需要被結束的程序。由於我們不能直接從程序控制代碼獲取有關程序的一些資訊,這就使得一些 懶惰 的傢...
U盤寫保護恢復
問題 使用u盤時,常出現無法寫入提示寫保護,以下為問題 u盤被寫保護,如何解開?沒有寫保護開關,在幾台機子上都試了 還是被寫保護 用了pmtd還是不行.u盤被寫保護了。我開啟u盤裡面沒有什麼按鍵。我有個1g的u盤 標是sony的 不知道怎麼弄的被寫保護了 不能格式化怎麼辦啊 求助啊 u盤被寫保護 今...