最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用C++ R3層斷鏈實現(xiàn)模塊隱藏功能

 更新時間:2019年10月15日 09:56:44   作者:OneTrainee  
在R3層的模塊隱藏,我們需要做的就是將其該鏈表斷鏈,將某一模塊從這個雙向鏈表中摘除,這樣再調(diào)用傳統(tǒng)的API時就會搜索不到。本文重點給大家介紹利用C++ R3層斷鏈實現(xiàn)模塊隱藏功能,感興趣的朋友一起看看吧

一、模塊隱藏的實現(xiàn)原理

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

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

二、結(jié)構(gòu)體成員詳細介紹

<1> TEB結(jié)構(gòu)體 -- 內(nèi)存地址為 fs:[0] 處。

使用Windbg的 "dt _TEB"命令來查看TEB結(jié)構(gòu)體

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:進程環(huán)境塊 ,記住其在 TEB 偏移 0x30處即可。

2. 通過olldbg查看該結(jié)構(gòu)體

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

    

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

    

<2> PEB結(jié)構(gòu)體 -- fs:[0x30]

使用 Windbg 指令 dt _PEB 查看 PEB結(jié)構(gòu)體,重點關(guān)注最后一個 進程加載信息表。

kd> dt _PEB
ntdll!_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 進程加載信息表 的結(jié)構(gòu)體

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

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 // 加載后在內(nèi)存中的順序
 + 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 中存儲著就是關(guān)于有關(guān)模塊信息的元素(比如模塊名等)

 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  // 入口函數(shù)(對于 exe 模塊有效)
 + 0x020 SizeOfImage : Uint4B  // 模塊大小
 + 0x024 FullDllName : _UNICODE_STRING  // 完成模塊名稱(帶路徑)
 + 0x02c BaseDllName : _UNICODE_STRING // 模塊名稱
 + 0x034 Flags : Uint4B

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

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

  2.2) 在其0x00c處發(fā)現(xiàn)InLoadOrderModuleList成員,其指向的是一個_LDR_DATA_TABLE_ENTRY 結(jié)構(gòu)體。

    

  2.3) 跳轉(zhuǎn)到 _LDR_DATA_TABLE_ENTRY 結(jié)構(gòu)體,從0x0c開始依次是三個 _LIST_ENTRY 結(jié)構(gòu)體,該結(jié)構(gòu)體雙向鏈表存儲著兩個地址。

    

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

    

  2.5)通過開頭 _LIST_ENTRY結(jié)構(gòu)體可以遍歷前一個模塊的內(nèi)容和下一個模塊的內(nèi)容。

    

三、利用C++斷鏈來實現(xiàn)模塊隱藏

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

// 隱藏模塊.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
//
#include "pch.h"
#include <iostream>
#include <Windows.h>
/* 所需要的結(jié)構(gòu)體
1. _LDR_DATA_TABLE_ENTRY 鏈表指向數(shù)據(jù)
2. _PEB_LDR_DATA 表示其 PEB0x處指向的數(shù)據(jù)表
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; // +0x24
typedef 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();
}

總結(jié)

以上所述是小編給大家介紹的利用C++ R3層斷鏈實現(xiàn)模塊隱藏功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • C++設(shè)計模式中的觀察者模式一起來看看

    C++設(shè)計模式中的觀察者模式一起來看看

    這篇文章主要為大家詳細介紹了C++觀察者模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++未定義行為(undefined behavior)

    C++未定義行為(undefined behavior)

    對于未定義行為,C++標準沒有明確規(guī)定編譯器們應(yīng)該怎么做,那么執(zhí)行的結(jié)果就是不可預(yù)料的。下面我們來詳細探討下
    2017-02-02
  • 7種排序算法的實現(xiàn)示例

    7種排序算法的實現(xiàn)示例

    這篇文章主要介紹了7種排序算法的實現(xiàn)示例,需要的朋友可以參考下
    2014-05-05
  • C++實現(xiàn)頁面的緩沖區(qū)管理器

    C++實現(xiàn)頁面的緩沖區(qū)管理器

    這篇文章主要介紹了C++實現(xiàn)頁面的緩沖區(qū)管理器,文章圍繞主題展開詳細的內(nèi)容介紹具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • c++實現(xiàn)新年煙花效果完整代碼

    c++實現(xiàn)新年煙花效果完整代碼

    這篇文章主要給大家介紹了關(guān)于c++實現(xiàn)新年煙花效果的相關(guān)資料,文中給出了詳細完整代碼,適合初學(xué)C語言/C++的小伙伴學(xué)習(xí)研究,需要的朋友可以參考下
    2023-11-11
  • C++設(shè)計模式編程中proxy代理模式的使用實例

    C++設(shè)計模式編程中proxy代理模式的使用實例

    這篇文章主要介紹了C++設(shè)計模式編程中proxy代理模式的使用實例解析,代理模式可以被歸類為結(jié)構(gòu)型的設(shè)計模式,代理模式主張為對象提供一種代理以控制對這個對象的訪問,需要的朋友可以參考下
    2016-03-03
  • C語言深入講解棧與堆和靜態(tài)存儲區(qū)的使用

    C語言深入講解棧與堆和靜態(tài)存儲區(qū)的使用

    對大多數(shù)C 語言初學(xué)者來說,堆棧卻是一個很模糊的概念。堆棧是一種數(shù)據(jù)結(jié)構(gòu),一個在程序運行時用于存放的地方,相信這可能是很多初學(xué)者共同的認識,靜態(tài)存儲區(qū)即內(nèi)存在程序編譯的時候就已經(jīng)分配好,這塊內(nèi)存在程序的整個運行期間都存在
    2022-04-04
  • C語言實現(xiàn)貪吃蛇小游戲

    C語言實現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • c++訪問修飾符與繼承關(guān)系詳解

    c++訪問修飾符與繼承關(guān)系詳解

    C++提供了三個修飾符來限定類成員的被訪問權(quán)限,分別是public、protected、private,通過限定訪問權(quán)限,可以達到程序編寫者想要解決的安全問題和權(quán)限問題,本文給大家介紹c++訪問修飾符與繼承關(guān)系,感興趣的朋友一起看看吧
    2023-10-10
  • C語言實現(xiàn)的PNPoly算法代碼例子

    C語言實現(xiàn)的PNPoly算法代碼例子

    這篇文章主要介紹了C語言實現(xiàn)的PNPoly算法代碼例子,PNPoly算法j是判斷一個坐標點是否在不規(guī)則多邊形內(nèi)部的算法,需要的朋友可以參考下
    2014-07-07

最新評論

股票| 皮山县| 衡阳县| 南京市| 华宁县| 榕江县| 沅江市| 建湖县| 崇左市| 金昌市| 兴化市| 镇安县| 泰顺县| 当阳市| 义马市| 台前县| 惠来县| 栖霞市| 温州市| 中方县| 林甸县| 兰西县| 房产| 车险| 黔东| 平陆县| 清河县| 密云县| 东辽县| 沽源县| 新源县| 蕉岭县| 青阳县| 丽水市| 米易县| 正镶白旗| 庆云县| 英超| 平阴县| 兴业县| 巩留县|