欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

R3抹掉加载的DLL

发布时间:2025/6/17 编程问答 11 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。