SSDT HOOK 記憶體寫保護

2021-07-13 11:43:35 字數 3467 閱讀 3202

有些人說不去掉也不會藍屏,照樣能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盤被寫保護 今...