R3抹掉加载的DLL
生活随笔
收集整理的這篇文章主要介紹了
R3抹掉加载的DLL
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
R3抹掉加載的DLL
? ? 原理類似于獲取Kernel32.dll加載地址,知道這個東西也是在看獲取Kernel32.dll地址的時候在網上搜索學習資料,無意中看到的這個東西。這個挺有用,結合著HiJack的話效果會不錯。思路是這樣:
FS--->TEB--->PEB--->?PEB_LDR_DATA.InInitialzationOrderModuleList
(細節偏移,以及結構定義我之間整理過,在這?http://blog.csdn.net/u013761036/article/details/71006302??就不重復整理了。)
????得到的這個鏈表里面存的都是加載的dll相關,獲取Kernel32是直接把相關地址返回去,而隱藏相關dll就是把相關要隱藏的dll從鏈里面摘除就行了,R0里隱藏內核模塊(.sys)以及R0隱藏進程(DKOM)都是這個思路,找到相關鏈表,摘除要隱藏模塊就行了。
代碼如下(為了省事,有些地方直接用匯編寫了,不然還要定義一堆結構體,雖然邏輯看著清晰,但是代碼太多,沒必要):
?
#include "stdafx.h" #include <windows.h>typedef struct _UNICODE_STRING { // UNICODE_STRING structure USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING; typedef UNICODE_STRING *PUNICODE_STRING;//每個模塊信息的LDR_MODULE部分 typedef struct _LDR_MODULE { LIST_ENTRY InLoadOrderModuleList; LIST_ENTRY InMemoryOrderModuleList; LIST_ENTRY InInitializationOrderModuleList; PVOID BaseAddress; PVOID EntryPoint; ULONG SizeOfImage; UNICODE_STRING FullDllName; UNICODE_STRING BaseDllName; ULONG Flags; SHORT LoadCount; SHORT TlsIndex; LIST_ENTRY HashTableEntry; ULONG TimeDateStamp; } LDR_MODULE, *PLDR_MODULE;PLDR_MODULE Get_ldr_InLoadOrderModuleList_Flink() { PLDR_MODULE FirstModule = 0; __asm { mov ebx, fs:[0x30] //得到peb結構體的地址 mov ebx, [ebx + 0xc] //得到Ldr結構體的地址 mov ebx, [ebx + 0xc] //得到ldr.InLoadOrderModuleList.Flink 第一個模塊,當前進程 mov FirstModule, ebx } return FirstModule; }VOID HideModule(HMODULE hLibrary) { PLDR_MODULE FirstModule = Get_ldr_InLoadOrderModuleList_Flink(); PLDR_MODULE GurrentModule = NULL; GurrentModule = FirstModule;while (!(GurrentModule->BaseAddress == hLibrary)) { GurrentModule = (PLDR_MODULE)(GurrentModule->InLoadOrderModuleList.Blink); if (GurrentModule == FirstModule) break; } if (GurrentModule->BaseAddress != hLibrary) { return; }//Dll解除鏈接 ((PLDR_MODULE)(GurrentModule->InLoadOrderModuleList.Flink))->InLoadOrderModuleList.Blink = GurrentModule->InLoadOrderModuleList.Blink; ((PLDR_MODULE)(GurrentModule->InLoadOrderModuleList.Blink))->InLoadOrderModuleList.Flink = GurrentModule->InLoadOrderModuleList.Flink; memset(GurrentModule->FullDllName.Buffer, 0, GurrentModule->FullDllName.Length); memset(GurrentModule, 0, sizeof(PLDR_MODULE)); }int main() { HMODULE hdAsdDll = LoadLibrary(L"C:\\Users\\Administrator\\Desktop\\asd.dll"); MessageBox(NULL, L"Hi_1", L"Tit", MB_OK); HideModule(hdAsdDll); MessageBox(NULL ,L"Hi_2" ,L"Tit" ,MB_OK); return 0; }?
測試代碼和測試效果如下(用的API?Monitor)
?
宋孖健,13
總結
以上是生活随笔為你收集整理的R3抹掉加载的DLL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R3获取kernel32地址
- 下一篇: HTTP自定义Header-(SOCKE