Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

技术学习来源:火哥(QQ:471194425)

内存在0环的两种内存隐藏方式(基于VAD树)

一、通过 _MMVAD.StartingVpn与_MMVAD.EndingVpn等值来隐藏内存。

  这种方法找到需要隐藏的VAD结点,使 _MMVAD.StartingVpn=_MMVAD.EndingVpn,这样就能达到隐藏的效果

  在 》》VAD树的属性及其遍历 《《 中,在遍历每个结点下,直接 pVad.StartingVpn = pVad.EndingVpn即可。

  1)隐藏前的效果

    

  2)隐藏后的效果

    

二、通过将两个VAD结点融合达到隐藏效果

  我们需要找到 宿主结点p1 与 被隐藏结点p2,将p2融合进p1中,此时就会显示p1的段属性从而忽视p2的段属性。

  比如扫描内存时,恶意代码必然可执行 EXECUTE,但是我们隐藏在READ之类段中,往往可以规避掉扫描。

  实现方法 p1.EndingVpn = p2.EndingPvn

1) 实验代码 test.exe

 // test.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <stdlib.h>
int main()
{
LPVOID p1 = VirtualAlloc(NULL, 0x10000, MEM_COMMIT, PAGE_READWRITE);
LPVOID p2 = VirtualAlloc(NULL, 0x10000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
printf("p1 = %x / p2 = %x", p1, p2);
system("pause");
}

2) 驱动代码

 #include <ntddk.h>

 //---------------------//
// MMVAD结构体简单定义 //
//---------------------//
typedef struct _MMVAD {
ULONG StartingVpn;
ULONG EndingVpn;
struct _MMVAD * Parent;
struct _MMVAD * LeftChild;
struct _MMVAD * RightChild;
}MMVAD,*PMMVAD; VOID Unload(IN PDRIVER_OBJECT pDriverObject) {
DbgPrint("Driver UnLoad!");
} //-----------//
// 遍历VAD树 //
//-----------//
PMMVAD vad_enum(PMMVAD pVad,ULONG target_StartingVpn) { //---------------------------//
// 遍历目标VAD,并返回其指针 //
//---------------------------//
if (pVad) {
if (target_StartingVpn == pVad->StartingVpn) {
_asm int
return pVad;
}
else {
if (pVad->LeftChild) {
PMMVAD p1 = vad_enum(pVad->LeftChild, target_StartingVpn);
// 如果结点不为空,则直接返回就好。
// 否则继续判断其右子树结点。
if (p1)
return p1;
}
if (pVad->RightChild) {
PMMVAD p2 = vad_enum(pVad->RightChild, target_StartingVpn);
if (p2)
return p2;
}
return NULL;
}
}
return NULL;
} //-------------------------------------------------------------//
// 在内核中进程遍历的原理就是先获取系统进程EPROCESS结构 //
// 然后依照其链表来获取其他的进程 //
// 依次遍历出来 //
//-------------------------------------------------------------//
NTSTATUS process_enum() { PEPROCESS pEprocess = NULL; // 得到系统进程地址
PEPROCESS pFirstEprocess = NULL;
ULONG ulProcessName = ; // 字符串指针,指向进程名称
ULONG ulProcessID = ; // 进程ID
ANSI_STRING target_str; // 带检测进程的名称
ANSI_STRING ansi_string; //
ULONG VadRoot; //----------------------------//
// 得到当前系统进程的EPROCESS //
//----------------------------//
pEprocess = PsGetCurrentProcess();
if (pEprocess == NULL) {
DbgPrint("获取当前系统进程EPROCESS错误..");
return STATUS_SUCCESS;
}
DbgPrint("pEprocess addr is %x0x8\r\n", pEprocess);
pFirstEprocess = pEprocess; while (pEprocess) { ulProcessName = (ULONG)pEprocess + 0x174;
ulProcessID = *(ULONG*)((ULONG)pEprocess + 0x84);
VadRoot = *(ULONG*)((ULONG)pEprocess + 0x11c); //--------------------------------------//
// 将目标进程与当前进程的进程名进行对比 //
//--------------------------------------//
RtlInitAnsiString(&ansi_string, (PCSTR)ulProcessName);
RtlInitAnsiString(&target_str, "test.exe");
if (RtlEqualString(&ansi_string, &target_str, TRUE)) {
DbgPrint("检测到进程字符串,%x", ulProcessID); PMMVAD p1 = vad_enum((PMMVAD)VadRoot,0x3a0); // 遍历第一个结点
PMMVAD p2 = vad_enum((PMMVAD)VadRoot, 0x3b0); // 遍历找到第二个结点
_asm int
if(p1 && p2)
p1->EndingVpn = p2->EndingVpn; // 将第二个结点完全隐藏起来 return STATUS_SUCCESS;
}
pEprocess = (PEPROCESS)(*(ULONG*)((ULONG)pEprocess + 0x88) - 0x88);
if (pEprocess == pFirstEprocess || *(ULONG*)((ULONG)pEprocess + 0x84) <= ) {
DbgPrint("遍历结束!未检测到进程ID!\r\n");
break;
}
}
return STATUS_SUCCESS;
} NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING registeryPat) {
DbgPrint("Driver Loaded!");
pDriverObject->DriverUnload = Unload;
process_enum();
return STATUS_SUCCESS;
}

3)隐藏效果

关于VAD的两种内存隐藏方式的更多相关文章

  1. Linux共享库两种加载方式简述

      Linux共享库两种加载方式简述  动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...

  2. redis笔记之两种持久化备份方式(RDB & AOF)

    Redis支持的两种持久化备份方式(RDB & AOF) redis支持两种持久化方式,一种是RDB,一种是AOF. RDB是根据指定的规则定时将内存中的数据备份到硬盘上,AOF是在每次执行命 ...

  3. Nginx使用的php-fpm的两种进程管理方式及优化

    PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5. ...

  4. (总结)Nginx使用的php-fpm的两种进程管理方式及优化

    PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5. ...

  5. Idea集成SpringBoot实现两种热部署方式(亲测有效)

    即将介绍的两种热部署方式: 1.SpringLoaded 2.DevTools 区别: SpringLoader:SpringLoader 在部署项目时使用的是热部署的方式. DevTools:Dev ...

  6. day17跨文件夹导入模块,模块的两种被执行方式,包,直接使用包中模块,包的管理

    复习 ''' 1.模块 -- 一系列功能的集合体,用文件来管理一系列有联系的功能,该文件我们称之为模块,文件名就是模块名 -- import | from...import 来导入模块,从而使用模块中 ...

  7. Windows Azure VM的两种shut down 方式

    今天在调查Azure的价格时,发现下面的语句,来自http://azure.microsoft.com/en-us/pricing/details/virtual-machines/ * If my ...

  8. android环境下两种md5加密方式

    在平时开发过程中,MD5加密是一个比较常用的算法,最常见的使用场景就是在帐号注册时,用户输入的密码经md5加密后,传输至服务器保存起来.虽然md5加密经常用,但是md5的加密原理我还真说不上来,对md ...

  9. Form表单中method=post/get两种数据传输的方式的区别

    Form提供了两种数据传输的方式——get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响.虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一 ...

随机推荐

  1. css重点知识和bug解决方法

    1.图片向下撑大3像素问题 在一个盒子里面放一张图片,默认情况下,图片会向下撑大3像素,有以下几种解决方法: 1.1 给图片添加display:block: 1.2 给图片添加 float:left: ...

  2. 在Mac上Python多版本切换

    1.安装Homebrewhttps://brew.sh/index_zh-cn.html 2.通过brew安装pyenv1)命令行输入:$ brew install pyenv(如果一直卡在Updat ...

  3. Dubbo简介与基本概念

    场景 分布式系统的发展演变以及RPC简介: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103555049 Dubbo简介 Ap ...

  4. Charles抓包iPhone注意点以及SSL Proxying enabled for this host

    0.介绍Charles 抓包 Charles是一款很强大的抓包工具,现在记录下来分享给大家.常用的有以下几款功能: 1.支持配置抓取定向地址的网络请求 打开charles,打开Proxy->Re ...

  5. sqoop 安装与使用

    Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的 ...

  6. .Net Core HTTP Error 500.0 - ANCM In-Process Handler Load Failure 发布后启动错误处理

    方法1: 应用池高级配置 - 启动32位应用程序 - 设置为True 方法2: web.config <aspNetCore processPath="%LAUNCHER_PATH%& ...

  7. C语言笔记 03_常量&存储类

    常量 常量是固定值,在程序执行期间不会改变.这些固定的值,又叫做字面量. 常量可以是任何的基本数据类型,比如整数常量.浮点常量.字符常量,或字符串字面值,也有枚举常量. 整数常量 整数常量可以是十进制 ...

  8. Key Management: Hardcoded Encryption key 密钥管理:硬编码加密密钥

  9. 如何修改CAD字体颜色?试试这种方法

    CAD中编辑图纸的时候,使用的CAD制图软件来进行绘制,图纸中的CAD字体颜色都是默认的颜色,这样不方便进行查看.这个时候就需要修改CAD字体颜色了,那么如何修改CAD字体颜色呢?具体要怎么来进行操作 ...

  10. HTML入门(列表、表单、常用表单控件、浮动框架、iframe、 摘要与细节、度量标签)

    一.列表 1.作用:默认显示方式为从上到下的显示数据 2.列表的组成 列表类型和列表项 3.列表的分类:有序列表   无序列表   自定义列表 无序列表语法为ul>li, 语法:ul代表列表,l ...