簡單實現登錄檔受保護部分的唯讀

2021-05-24 07:22:28 字數 2398 閱讀 9515

登錄檔是windows系統十分關鍵的部分,通過設定登錄檔專案,可以很好的配置優化計算機,當然也可以給計算機帶來無法想象的災難,我們來看一段關於登錄檔唯讀設定的**……

最近看wrk,發現登錄檔操作類函式都有類似下面的**段:

if (mode == usermode)  else  else 

obdereferenceobject((pvoid)keybody); } }

其中cmiskcbreadonly是實現保護的關鍵。定義如下:

#define cmiskcbreadonly(kcb) ((kcb)->extflags & cm_kcb_read_only_key)

#define cm_kcb_read_only_key 0x0080 // this kcb is read-only all write operations onto it are denied.

很簡單吧,看來實現保護只需要設定一下keycontrolblock裡的extflags就可以了。在win2003下keycontrolblock型別定義如下:

lkd> dt _cm_key_control_block

+0x000 refcount : uint4b

+0x004 extflags : pos 0, 8 bits // 設定這裡

+0x004 privatealloc : pos 8, 1 bit

+0x004 delete : pos 9, 1 bit

+0x004 delayedcloseindex : pos 10, 12 bits

+0x004 totallevels : pos 22, 10 bits

+0x008 keyhash : _cm_key_hash

+0x008 convkey : uint4b

+0x00c nexthash : ptr32 _cm_key_hash

+0x010 keyhive : ptr32 _hhive

+0x014 keycell : uint4b

+0x018 parentkcb : ptr32 _cm_key_control_block

+0x01c nameblock : ptr32 _cm_name_control_block

+0x020 cachedsecurity : ptr32 _cm_key_security_cache

+0x024 valuecache : _cached_child_list

+0x02c indexhint : ptr32 _cm_index_hint_block

+0x02c hashkey : uint4b

+0x02c subkeycount : uint4b

+0x030 keybodylisthead : _list_entry

+0x030 freelistentry : _list_entry

+0x038 keybodyarray : [4] ptr32 _cm_key_body

+0x048 delaycloseentry : ptr32 void

+0x050 kcblastwritetime : _large_integer

+0x058 kcbmaxnamelen : uint2b

+0x05a kcbmaxvaluenamelen : uint2b

+0x05c kcbmaxvaluedatalen : uint4b

+0x060 kcbuserflags : pos 0, 4 bits

+0x060 kcbvirtcontrolflags : pos 4, 4 bits

+0x060 kcbdebug : pos 8, 8 bits

+0x060 flags : pos 16, 16 bits

實現的**片段如下:

#pragma pack(1)

typedef struct _cm_key_body  cm_key_body, *pcm_key_body;

#pragma pack()

ntstatus driverentry(in pdriver_object driverobject, in punicode_string registrypath)

keycontrolblock = keybody->keycontrolblock;

// // try to protect the key

// *(pulong)((ulong)keycontrolblock + 0x4) |= 0x0080; // 0x14

obdereferenceobject(keybody);

zwclose(hkey);

return status_success; }

最後很掃興的說,這種方法不適用於window2000

AHK 簡單實現的登錄檔定位指令碼

noenv sendmode input notrayicon singleinstance ignore inputbox newlastkey,登錄檔自動定位工具,請輸入要定位到的路徑,800 120 if errorlevel 1 ifwinexist 登錄檔編輯器 ahk class reg...

一種登錄檔沙箱的思路 實現

在作業系統中,我們對乙個物件 檔案 登錄檔鍵等 的操作存在 建立 開啟 關閉 修改 刪除 和 查詢 等。這些操作的源便是那個物件,重定向 思路就是針對這個物件 作手腳 說得通俗點,就是通過 狸貓換太子 的方式達到欺騙上層的目的。以後有什麼操作,我們便是對這個 狸貓 去作,從而達到保護 太子 的目的。...

使用登錄檔實現開機自啟動的注意點

使用登錄檔項實現開機自啟動時,需要在值後面加個空格1。d download feiq.exe 1 值需要用雙引號引起來防止路徑中有空格導致的錯誤。hkey local machine用於計算機上的所有使用者。hkey current user適用當前登入的使用者。hkey local machine...