0
点赞
收藏
分享

微信扫一扫

R3抹掉加载的DLL

Raow1 2022-07-27 阅读 31

R3抹掉加载的DLL

    原理类似于获取Kernel32.dll加载地址,知道这个东西也是在看获取Kernel32.dll地址的时候在网上搜索学习资料,无意中看到的这个东西。这个挺有用,结合着HiJack的话效果会不错。思路是这样:

FS--->TEB--->PEB---> PEB_LDR_DATA.InInitialzationOrderModuleList

    得到的这个链表里面存的都是加载的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)

R3抹掉加载的DLL_flink

R3抹掉加载的DLL_ico_02

 

R3抹掉加载的DLL_ico_03

宋孖健,13



举报

相关推荐

0 条评论