亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何利用C++R3層斷鏈實現模塊隱藏功能

發布時間:2021-09-28 11:46:46 來源:億速云 閱讀:158 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關如何利用C++R3層斷鏈實現模塊隱藏功能的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一、模塊隱藏的實現原理

  普通API查找模塊實現思路:其通過查詢在R3中的PEB(Process Environment Block 進程環境塊)與TEB(Thread Environment Block 進程環境塊)來找到一個雙向鏈表,通過遍歷雙向鏈表中某一成員(字符串)來查找全部模塊。

  模塊隱藏實現思路:在R3層的模塊隱藏,我們需要做的就是將其該鏈表斷鏈,將某一模塊從這個雙向鏈表中摘除,這樣再調用傳統的API時就會搜索不到。

二、結構體成員詳細介紹

<1> TEB結構體 -- 內存地址為 fs:[0] 處。

使用Windbg的 "dt _TEB"命令來查看TEB結構體

kd> dt _TEB ntdll!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIENT_ID +0x028 ActiveRpcHandle : Ptr32 Void +0x02c ThreadLocalStoragePointer : Ptr32 Void +0x030 ProcessEnvironmentBlock : Ptr32 _PEB +0x034 LastErrorValue : Uint4B

1. 屬性介紹 

  1.1)_NT_TIB:重點兩個屬性,棧頂與棧大小。

   http://www.nirsoft.net/kernel_struct/vista/NT_TIB.html

  1.2) _CLIENT_ID: 存儲該進程ID與當前主線程ID。

  https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-tsts/a11e7129-685b-4535-8d37-21d4596ac057?redirectedfrom=MSDN

  1.3) _PEB:進程環境塊 ,記住其在 TEB 偏移 0x30處即可。

2. 通過olldbg查看該結構體

  2.1) 打開任意進程,在寄存器窗口找到 fs:[0],查看其內存地址。

  2.2) 在內存窗口使用命令 "db 5E7000" 跳轉到該內存,使用地址格式(長型-地址)顯示。

<2> PEB結構體 -- fs:[0x30]

使用 Windbg 指令 dt _PEB 查看 PEB結構體,重點關注最后一個 進程加載信息表。

kd> dt _PEBntdll!_PEB +0x000 InheritedAddressSpace : UChar +0x001 ReadImageFileExecOptions : UChar +0x002 BeingDebugged : UChar +0x003 BitField : UChar +0x003 ImageUsesLargePages : Pos 0, 1 Bit +0x003 IsProtectedProcess : Pos 1, 1 Bit +0x003 IsLegacyProcess : Pos 2, 1 Bit +0x003 IsImageDynamicallyRelocated : Pos 3, 1 Bit +0x003 SkipPatchingUser32Forwarders : Pos 4, 1 Bit +0x003 SpareBits : Pos 5, 3 Bits +0x004 Mutant : Ptr32 Void +0x008 ImageBaseAddress : Ptr32 Void +0x00c Ldr : Ptr32 _PEB_LDR_DATA // PEB_LOADER_DATA 進程加載信息表

1. 查看 _PEB_LDR_DATA 進程加載信息表 的結構體

  1.1)重點關注 0x00c處的指針,其指向 _PEB_LDR_DATA 這個結構體,在這個結構體中 0x00c、0x014、0x01c 分別表示 模塊加載順序 / 加載后在內存中的順序 / 模塊初始化的順序。

kd > dt _PEB_LDR_DATA ntdll!_PEB_LDR_DATA + 0x000 Length : Uint4B + 0x004 Initialized : UChar + 0x008 SsHandle : Ptr32 Void + 0x00c InLoadOrderModuleList : _LIST_ENTRY // 模塊加載順序 + 0x014 InMemoryOrderModuleList : _LIST_ENTRY // 加載后在內存中的順序 + 0x01c InInitializationOrderModuleList : _LIST_ENTRY // 模塊初始化的順序 + 0x024 EntryInProgress : Ptr32 Void + 0x028 ShutdownInProgress : UChar + 0x02c ShutdownThreadId : Ptr32 Void

  2.2)理解其三個成員的順序,其指向_LDR_DATA_TABLE_ENTRY元素中開始的三個成員,而 _LDR_DATA_TABLE_ENTRY 中存儲著就是關于有關模塊信息的元素(比如模塊名等)

kd > dt _LDR_DATA_TABLE_ENTRY ntdll!_LDR_DATA_TABLE_ENTRY + 0x000 InLoadOrderLinks : _LIST_ENTRY    + 0x008 InMemoryOrderLinks : _LIST_ENTRY + 0x010 InInitializationOrderLinks : _LIST_ENTRY + 0x018 DllBase : Ptr32 Void  // 模塊基地址 + 0x01c EntryPoint : Ptr32 Void  // 入口函數(對于 exe 模塊有效) + 0x020 SizeOfImage : Uint4B  // 模塊大小 + 0x024 FullDllName : _UNICODE_STRING  // 完成模塊名稱(帶路徑) + 0x02c BaseDllName : _UNICODE_STRING // 模塊名稱 + 0x034 Flags : Uint4B

2. 使用olldbg來查看查找首先加載模塊的模塊名稱(TEB->PEB-> InLoadOrderModuleList -> BaseDllName)

  2.1)接之前TEB內容查找到PEB的所在位置 fs:[0x30]。

  2.2) 在其0x00c處發現InLoadOrderModuleList成員,其指向的是一個_LDR_DATA_TABLE_ENTRY 結構體。

  2.3) 跳轉到 _LDR_DATA_TABLE_ENTRY 結構體,從0x0c開始依次是三個 _LIST_ENTRY 結構體,該結構體雙向鏈表存儲著兩個地址。

  2.4)選中第一個進入,在其偏移0x02c處(UNICODE結構體占四字),可以查看字符串名稱。

  2.5)通過開頭 _LIST_ENTRY結構體可以遍歷前一個模塊的內容和下一個模塊的內容。

三、利用C++斷鏈來實現模塊隱藏

  如果你看懂上面分析,則源代碼非常好理解。

// 隱藏模塊.cpp : 此文件包含 "main" 函數。程序執行將在此處開始并結束。//#include "pch.h"#include <iostream>#include <Windows.h>/* 所需要的結構體1. _LDR_DATA_TABLE_ENTRY 鏈表指向數據2. _PEB_LDR_DATA 表示其 PEB0x處指向的數據表3. _LIST_ENTRY 指針指向的鏈表*/typedef struct _LSA_UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer;}UNICODE_STRING, *PUNICODE_STRING;typedef struct _PEB_LDR_DATA{ DWORD Length; // +0x00 bool Initialized; // +0x04 PVOID SsHandle; // +0x08 LIST_ENTRY InLoadOrderModuleList; // +0x0c LIST_ENTRY InMemoryOrderModuleList; // +0x14 LIST_ENTRY InInitializationOrderModuleList;// +0x1c} PEB_LDR_DATA, *PPEB_LDR_DATA; // +0x24typedef struct _LDR_MODULE{ LIST_ENTRY InLoadOrderModuleList; LIST_ENTRY InMemoryOrderModuleList; LIST_ENTRY InInitializationOrderModuleList; void* BaseAddress; void* EntryPoint; ULONG SizeOfImage; UNICODE_STRING FullDllName; UNICODE_STRING BaseDllName; ULONG Flags; SHORT LoadCount; SHORT TlsIndex; HANDLE SectionHandle; ULONG CheckSum; ULONG TimeDateStamp;} LDR_MODULE, *PLDR_MODULE;//所謂模塊句柄,即該模塊的入口地址void hide_module(char* szDllName){ HMODULE hMod = GetModuleHandleA(szDllName); PLIST_ENTRY Head, Cur; PPEB_LDR_DATA ldr; PLDR_MODULE ldm; __asm { mov eax, fs:[0x30] mov ecx, [eax + 0x0c] //Ldr  mov ldr, ecx } Head = &(ldr->InLoadOrderModuleList); Cur = Head->Flink; do { ldm = CONTAINING_RECORD(Cur, LDR_MODULE, InLoadOrderModuleList); if (hMod == ldm->BaseAddress) { // 三個鏈表同時給斷掉 ldm->InLoadOrderModuleList.Blink->Flink = ldm->InLoadOrderModuleList.Flink; ldm->InLoadOrderModuleList.Flink->Blink = ldm->InLoadOrderModuleList.Blink; // ldm->InInitializationOrderModuleList.Blink->Flink = ldm->InInitializationOrderModuleList.Flink; ldm->InInitializationOrderModuleList.Flink->Blink = ldm->InInitializationOrderModuleList.Blink; // ldm->InMemoryOrderModuleList.Blink->Flink = ldm->InMemoryOrderModuleList.Flink; ldm->InMemoryOrderModuleList.Flink->Blink = ldm->InMemoryOrderModuleList.Blink; break; } Cur = Cur->Flink; } while (Head != Cur);}int main(){ // 通過模塊名,來獲取模塊句柄 printf("****按任意鍵隱藏模塊*****"); getchar(); hide_module((char*)"kernel32.dll"); printf("****隱藏模塊完成*****"); getchar(); getchar();}

感謝各位的閱讀!關于“如何利用C++R3層斷鏈實現模塊隱藏功能”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

岑巩县| 沂水县| 高尔夫| 北流市| 宣威市| 蓝田县| 兰考县| 朝阳市| 秦皇岛市| 集安市| 全椒县| 正定县| 遵义县| 宿州市| 洞口县| 秦安县| 长海县| 竹溪县| 永昌县| 芜湖市| 邵阳县| 武平县| 贵溪市| 京山县| 怀远县| 清流县| 清丰县| 巴林右旗| 鲁山县| 阿拉善右旗| 平南县| 普安县| 岱山县| 扎鲁特旗| 定西市| 长顺县| 涡阳县| 日喀则市| 黄梅县| 湾仔区| 从化市|