• 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

  • 相关阅读:
    Eclipse 代码模板
    Eclipse 安装插件
    Eclipse 任务管理
    Eclipse 添加书签
    Eclipse 重构菜单
    Eclipse 浏览(Navigate)菜单浏览 Eclipse 工作空间
    Eclipse 查找
    Eclipse 悬浮提示
    Eclipse 快速修复
    Eclipse 内容辅助
  • 原文地址:https://www.cnblogs.com/csnd/p/12061967.html
Copyright © 2020-2023  润新知