64.隐藏指定模块

news2024/9/21 18:43:47

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:易道云信息技术研究院

上一个内容:63.利用PEB获取模块列表

效果图:

隐藏模块简单实现:

#include <iostream>
#include <Windows.h>
#include <winternl.h>

/**
  _PEB_LDR_DATA原本的结构
    typedef struct _PEB_LDR_DATA {
        BYTE Reserved1[8];
        PVOID Reserved2[3];
        LIST_ENTRY InMemoryOrderModuleList;
    } PEB_LDR_DATA, *PPEB_LDR_DATA;
  下方是通过windbg分析出的 _PEB_LDR_DATA 真实的结构

  typedef struct _PEB_LDR_DATA {
    BOOL Initialized;

    LIST_ENTRY InInitializationOrderModuleList;
    LIST_ENTRY InLoadOrderModuleList;
    LIST_ENTRY InMemoryOrderModuleList;
} PEB_LDR_DATA, * PPEB_LDR_DATA;

*/

/**
  它们的顺序要去windbg看
    LIST_ENTRY InLoadOrderModuleList;
    LIST_ENTRY InMemoryOrderLinks;
    LIST_ENTRY InInitializationOrderModuleList;

    在加载一个模块时首先会分别写入 InLoadOrderModuleList、InMemoryOrderLinks、InInitializationOrderModuleList这三个链表
    也就是这三个链表都会写入模块数据,写入的顺序是:首先发现没有这个模块它是先在 InMemoryOrderLinks加东西
    InMemoryOrderLinks加完以后在给InLoadOrderModuleList加东西,这两个地方加完以后再在 InInitializationOrderModuleList 里增加
    在 INInitializationOrderModuleList 增加完以后会调用dllmain的函数,有时候会遍历这些链表的时候会遍历到链表的点为0的时候
    当遍历到0的时候表示这个dll正在卸载,卸载一个dll模块的时候也是操作的这三个链表,操作的顺序是先去掉 InMemoryOrderLinks这个
    然后InInitializationOrderModuleList去掉然后调用dllmain函数,最后给InLoadOrderModuleList处理掉

    这里的 InLoadOrderModuleList、InMemoryOrderLinks、InInitializationOrderModuleList排序可能是不正确的,加载与卸载的顺序根据位置来就行

*/
typedef struct _LDR_DATA_TABLE_ENTRY {
    LIST_ENTRY InLoadOrderModuleList;
    LIST_ENTRY InMemoryOrderLinks;
    LIST_ENTRY InInitializationOrderModuleList;
    PVOID DllBase;
    PVOID Reserved3[2];
    UNICODE_STRING FullDllName;
    BYTE Reserved4[8];
    PVOID Reserved5[3];
#pragma warning(push)
#pragma warning(disable: 4201) // we'll always use the Microsoft compiler
    union {
        ULONG CheckSum;
        PVOID Reserved6;
    } DUMMYUNIONNAME;
#pragma warning(pop)
    ULONG TimeDateStamp;
} LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY;

int main() {
    PPEB _peb;
    _asm {
        mov eax, fs: [0x30]
        mov _peb, eax
    }
    PPEB_LDR_DATA Pldr = _peb->Ldr;
    PLIST_ENTRY FIRST = &(Pldr->InMemoryOrderModuleList);
    PLIST_ENTRY CURLST = FIRST->Flink;
    PLDR_DATA_TABLE_ENTRY lModule;
    PLDR_DATA_TABLE_ENTRY lDis{};
    int StructDiff = (int)&lDis->InMemoryOrderLinks;

    do {
        lModule = (PLDR_DATA_TABLE_ENTRY)((unsigned)CURLST - StructDiff);
        // std::wcout.imbue(std::locale());
        std::locale::global(std::locale(""));
        std::wcout << L"模块名:" << lModule->FullDllName.Buffer << L" 基址:" << lModule->DllBase << L" 大小:" << lModule->Reserved3 << std::endl;

        if (lModule->DllBase = (LPVOID)0x7A50000) {
            lModule->InLoadOrderModuleList.Blink->Flink = lModule->InLoadOrderModuleList.Flink;
            lModule->InLoadOrderModuleList.Flink->Blink = lModule->InLoadOrderModuleList.Blink;

            lModule->InMemoryOrderLinks.Blink->Flink = lModule->InMemoryOrderLinks.Flink;
            lModule->InMemoryOrderLinks.Flink->Blink = lModule->InMemoryOrderLinks.Blink;

            lModule->InInitializationOrderModuleList.Blink->Flink = lModule->InInitializationOrderModuleList.Flink;
            lModule->InInitializationOrderModuleList.Flink->Blink = lModule->InInitializationOrderModuleList.Blink;
        }

        CURLST = CURLST->Flink;
    } while (FIRST != CURLST);

    while (true);
}

隐藏模块整合进辅助里:也就是它 61.列表重绘 的代码

CWndMain.h文件做出了修改:

#pragma once
#include "afxdialogex.h"
#include "htdHook2.h"
#include "htdModule.h"

// CWndMain 对话框

class CWndMain : public CDialogEx
{
    DECLARE_DYNAMIC(CWndMain)

public:
    CWndMain(CWnd* pParent = nullptr);   // 标准构造函数
    virtual ~CWndMain();

// 对话框数据
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_WNDMAIN };
#endif

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

    DECLARE_MESSAGE_MAP()
public:
    CString wInfo;
    htdHook2 hook;

    afx_msg void OnBnClickedButton1();
    afx_msg void OnBnClickedButton2();
    afx_msg void OnBnClickedButton3();
};

CWndMain.cpp文件做出了修改:

void CWndMain::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    //hook.SetHook((LPVOID)0x41FDB2, Wudi, (LPVOID)0);
    //hook.Init();
    htdModule* p{};
    p->HideDll(L"Dlls.dll");
}

htdModule.cpp文件内容:

#include "pch.h"
#include "htdModule.h"

void htdModule::HideDll(HMODULE _hMod)
{
    PPEB _peb;
    _asm {
        mov eax, fs: [0x30]
        mov _peb, eax
    }
    PPEB_LDR_DATA Pldr = _peb->Ldr;
    PLIST_ENTRY FIRST = &(Pldr->InMemoryOrderModuleList);
    PLIST_ENTRY CURLST = FIRST->Flink;
    PLDR_DATA_TABLE_ENTRY lModule;
    PLDR_DATA_TABLE_ENTRY lDis{};
    int StructDiff = (int)&lDis->InMemoryOrderLinks;

    do {
        lModule = (PLDR_DATA_TABLE_ENTRY)((unsigned)CURLST - StructDiff);
        // std::wcout.imbue(std::locale());

        if (lModule->DllBase == _hMod) {
            lModule->InLoadOrderModuleList.Blink->Flink = lModule->InLoadOrderModuleList.Flink;
            lModule->InLoadOrderModuleList.Flink->Blink = lModule->InLoadOrderModuleList.Blink;

            lModule->InMemoryOrderLinks.Blink->Flink = lModule->InMemoryOrderLinks.Flink;
            lModule->InMemoryOrderLinks.Flink->Blink = lModule->InMemoryOrderLinks.Blink;

            lModule->InInitializationOrderModuleList.Blink->Flink = lModule->InInitializationOrderModuleList.Flink;
            lModule->InInitializationOrderModuleList.Flink->Blink = lModule->InInitializationOrderModuleList.Blink;
        }

        CURLST = CURLST->Flink;
    } while (FIRST != CURLST);
}

void htdModule::HideDll(wchar_t* dllName)
{
    HMODULE hMod = GetModuleHandleW(dllName);
    if (hMod)HideDll(hMod);
}

htdModule.h文件内容:

#include "pch.h"
#include "htdModule.h"

void htdModule::HideDll(HMODULE _hMod)
{
    PPEB _peb;
    _asm {
        mov eax, fs: [0x30]
        mov _peb, eax
    }
    PPEB_LDR_DATA Pldr = _peb->Ldr;
    PLIST_ENTRY FIRST = &(Pldr->InMemoryOrderModuleList);
    PLIST_ENTRY CURLST = FIRST->Flink;
    PLDR_DATA_TABLE_ENTRY lModule;
    PLDR_DATA_TABLE_ENTRY lDis{};
    int StructDiff = (int)&lDis->InMemoryOrderLinks;

    do {
        lModule = (PLDR_DATA_TABLE_ENTRY)((unsigned)CURLST - StructDiff);
        // std::wcout.imbue(std::locale());

        if (lModule->DllBase == _hMod) {
            lModule->InLoadOrderModuleList.Blink->Flink = lModule->InLoadOrderModuleList.Flink;
            lModule->InLoadOrderModuleList.Flink->Blink = lModule->InLoadOrderModuleList.Blink;

            lModule->InMemoryOrderLinks.Blink->Flink = lModule->InMemoryOrderLinks.Flink;
            lModule->InMemoryOrderLinks.Flink->Blink = lModule->InMemoryOrderLinks.Blink;

            lModule->InInitializationOrderModuleList.Blink->Flink = lModule->InInitializationOrderModuleList.Flink;
            lModule->InInitializationOrderModuleList.Flink->Blink = lModule->InInitializationOrderModuleList.Blink;
        }

        CURLST = CURLST->Flink;
    } while (FIRST != CURLST);
}

void htdModule::HideDll(wchar_t* dllName)
{
    HMODULE hMod = GetModuleHandleW(dllName);
    if (hMod)HideDll(hMod);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苍穹外卖浏览器前端界面修改

背景&#xff1a; 客户原始方案是期望做一个Spring Boot Vue的饿了么系统&#xff0c;但时间上太仓促&#xff0c;所以建议选择开源的苍穹外码目作为作业提交。 客户接受了建议的方案后&#xff0c;期望对前端页面做一些个性化的定制修改。 过程&#xff1a; 苍穹外卖简单介…

【C++进阶】C++11特性(上)

1、统一列表初始化 1.1 {}初始化 C98的特性用{}统一初始化数组或结构体。 //{}初始化 struct Point {int _x;int _y; }; int main() {int array1[] { 1, 2, 3, 4, 5 };int array2[5] { 0 };Point p { 1, 2 };return 0; } C11则扩大其特性&#xff0c;可以不带进行初始化&…

【SQL 新手教程 2/20】关系模型 -- 主键

&#x1f497; 关系数据库建立在关系模型上⭐ 关系模型本质上就是若干个存储数据的二维表 记录 (Record)&#xff1a; 表的每一行称为记录&#xff08;Record&#xff09;&#xff0c;记录是一个逻辑意义上的数据 字段 (Column)&#xff1a;表的每一列称为字段&#xff08;Colu…

基于STM32F103的FreeRTOS系列(四)·FreeRTOS资料获取以及简介

目录 1. FreeRTOS简介 1.1 FreeRTOS介绍 1.2 为何选择FreeRTOS 1.3 FreeRTOS资料获取 1.3.1 官网下载 1.3.2 Github下载 1.3.3 托管网站下载 1.4 FreeRTOS的编程风格 1.4.1 数据类型 1.4.2 变量名 1.4.3 函数名 1.4.4 宏 1. FreeRTOS简介 1.1 Free…

IEC104转BACnet网关:实现电力监控与楼宇自动化的无缝对接

在电力监控和楼宇自控领域&#xff0c;IEC104和BACnet作为两种重要的通信协议扮演着重要的角色。随着不同系统之间的数据交换与集成需求的不断增长&#xff0c;深圳市钡铼技术有限公司推出IEC104转BACnet网关来实现这两种协议之间的无缝转换&#xff0c;助力电力监控和楼宇自控…

如何知道一个字段在selenium中是否可编辑?

这篇文章将检查我们如何使用Java检查selenium webdriver中的字段是否可编辑。 我们如何知道我们是否可以编辑字段&#xff1f;“readonly”属性控制字段的可编辑性。如果元素上存在“readonly”属性&#xff0c;则无法编辑或操作该元素或字段。 因此&#xff0c;如果我们找到一…

3.5-RNN文本生成

1语言模型生成文本的顺序 前面我们已经能够实现使用下图的LSTM网络进行语言建模&#xff1b; 对于一个已经在语料库上学习好的LSTM模型&#xff1b;如果语料库就只是you say goobye and i say hello&#xff1b;那么当把单词i输入到模型中&#xff0c;Time xxx层的第一个LSTM…

⌈ 传知代码 ⌋ 深度学习革新音乐转录

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

SpringBoot上传文件大小超出范围捕获异常

文件上传中&#xff0c;可以限定文件大小&#xff0c;防止用户上传过大的文件&#xff0c;但是出现异常会报错&#xff0c;不够优雅 这里做异常捕获&#xff0c;然后自定义提示文字&#xff0c;可以更加优雅的解决文件上传超出限制报异常 /*** 上传文件超出大小限制异常 适用于…

微信公众号获取用户openid(PHP版,snsapi_base模式)

微信公众号获取用户openid的接口有2个&#xff1a;snsapi_base、snsapi_userinfo 详情见微信公众号开发文档&#xff1a;https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 本文介绍用PHP方式调用snsapi_base接口获取微信用户…

Godot入门 02玩家1.0版

添加Node2D节点&#xff0c;重命名Game 创建玩家场景&#xff0c;添加CharacterBody2D节点 添加AnimatedSprite2D节点 从精灵表中添加帧 选择文件 设置成8*8 图片边缘模糊改为清晰 设置加载后自动播放&#xff0c;动画循环 。动画速度10FPS&#xff0c;修改动画名称idle。 拖动…

Spark实时(六):Output Sinks案例演示

文章目录 Output Sinks案例演示 一、​​​​​​​File sink 二、​​​​​​​​​​​​​​Memory Sink 三、​​​​​​​​​​​​​​Foreach Sink 1、​​​​​​​foreachBatch 2、​​​​​​​​​​​​​​foreach Output Sinks案例演示 当我们对流式…

HarmonyOS NEXT星河版零基础入门到实战

文章目录 一、HarmonyOS NEXT介绍学习内容1、鸿蒙APP开发2、能力套件开发3、全场景开发适合人群 持续更新中✒️总结 一、HarmonyOS NEXT介绍 放弃安卓框架之后&#xff0c;HarmonyOS NEXT成为真正独立于安卓、iOS的操作系统&#xff0c;堪称是一场史无前例的脱胎换骨。在其众多…

模拟依赖关系和 AI 是Vue.js测试的下一个前沿领域

Vue.js 是一个流行的 JavaScript 框架&#xff0c;因此&#xff0c;确保其组件按预期工作至关重要&#xff1a;有效&#xff0c;更重要的是&#xff0c;可靠。模拟依赖项是最有效的测试方法之一&#xff0c;我们将在本文中发现。 模拟依赖项的必要性 模拟依赖项是一种对测试施加…

大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

亚信安慧AntDB-M负载均衡

负载均衡是分布式系统中常用的技术&#xff0c;主要是将工作任务均衡分布到系统的各个资源点上&#xff0c;可以充分利用系统资源。 AntDB-M分布式内存数据库节点角色可以分为管理节点(MN)、计算节点(CN)和数据节点(DN)三种。管理节点收到客户端连接请求后&#xff0c;会经由负…

【学习记录】锚框

主要解释程序代码&#xff0c;具体解析在代码中进行标注 锚框&#xff0c;具体看见网址https://zh-v2.d2l.ai/chapter_computer-vision/anchor.html#iou 对应程序解析&#xff1a;https://fkjkkll.github.io/2021/11/23/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8BSSD/#more 目录…

数据结构:(1)线性表

一、基本概念 概念&#xff1a;零个或多个数据元素的有限序列 元素之间是有顺序了。如果存在多个元素&#xff0c;第一个元素无前驱&#xff0c;最后一个没有后继&#xff0c;其他的元素只有一个前驱和一个后继。 当线性表元素的个数n&#xff08;n>0&am…

UE4 UnrealPak加密功能(配置AES encrypt key)

本文的重点在于如何使用UnrealPak的加密功能&#xff0c;以及相关的UE4源代码学习。本文参考了&#xff1a;https://www.cnblogs.com/shiroe/p/14803859.html 。 设置密钥 在编辑、项目设置中找到下面栏目&#xff0c;并点击“生成新的加密密钥”&#xff0c;就可以为Unreal P…

K210视觉识别模块学习笔记7:多线程多模型编程识别

今日开始学习K210视觉识别模块: 图形化操作函数 亚博智能 K210视觉识别模块...... 固件库: canmv_yahboom_v2.1.1.bin 训练网站: 嘉楠开发者社区 今日学习使用多线程、多模型来识别各种物体 这里先提前说一下本文这次测试实验的结果吧&#xff1a;结果是不太成…