最近在学习内核编程,记录一下最近的学习笔记。

原理:将当前进程从eprocess结构的链表中删除

无法被! process 0 0 看见

#include "HideProcess.h"

#ifdef WIN64

#define ACTIVEPROCESSLINKS_EPROCESS  0x188
#define IMAGEFILENAME_EPROCESS 0x2e0 //16个字节组成的单字数组
#else #define ACTIVEPROCESSLINKS_EPROCESS 0x088
#define IMAGEFILENAME_EPROCESS 0x174 //16个字节组成的单字数组 #endif NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegisterPath)
{
PDEVICE_OBJECT DeviceObject;
NTSTATUS Status;
int i = ; UNICODE_STRING DeviceName;
UNICODE_STRING LinkName; RtlInitUnicodeString(&DeviceName,DEVICE_NAME);
RtlInitUnicodeString(&LinkName,LINK_NAME); //创建设备对象; Status = IoCreateDevice(DriverObject,,
&DeviceName,FILE_DEVICE_UNKNOWN,,FALSE,&DeviceObject);
if (!NT_SUCCESS(Status))
{
return Status;
} Status = IoCreateSymbolicLink(&LinkName,&DeviceName); for (i = ; i<IRP_MJ_MAXIMUM_FUNCTION; i++)
{
DriverObject->MajorFunction[i] = DefaultPassThrough;
} DriverObject->DriverUnload = UnloadDriver; if (HideProcess("notepad.exe") == FALSE)
{
DbgPrint("No Exist\r\n");
} #ifdef WIN64 DbgPrint("WIN64: HideProcess IS RUNNING!!!");
#else DbgPrint("WIN32: HideProcess SIS RUNNING!!!"); #endif return STATUS_SUCCESS;
} NTSTATUS
DefaultPassThrough(PDEVICE_OBJECT DeviceObject,PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = ;
IoCompleteRequest(Irp,IO_NO_INCREMENT); return STATUS_SUCCESS;
} VOID
UnloadDriver(PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING LinkName;
PDEVICE_OBJECT NextDeviceObject = NULL;
PDEVICE_OBJECT CurrentDeviceObject = NULL;
RtlInitUnicodeString(&LinkName,LINK_NAME); IoDeleteSymbolicLink(&LinkName);
CurrentDeviceObject = DriverObject->DeviceObject;
while (CurrentDeviceObject != NULL)
{ NextDeviceObject = CurrentDeviceObject->NextDevice;
IoDeleteDevice(CurrentDeviceObject);
CurrentDeviceObject = NextDeviceObject;
} DbgPrint("HideProcess IS STOPPED!!!");
} BOOLEAN HideProcess(char* ProcessImageName)
{
//通过进程EProcess (ObjectHeader ObjectBody)
/*
kd> !process 0 0
PROCESS fffffa8031ec9060
SessionId: 1 Cid: 073c Peb: 7fffffdf000 ParentCid: 06f8
DirBase: 7fb21000 ObjectTable: fffff8a001ea3600 HandleCount: 545.
Image: explorer.exe
kd> dt _eprocess fffffa8031ec9060
+0x000 Pcb : _KPROCESS
+0x160 ProcessLock : _EX_PUSH_LOCK
+0x168 CreateTime : _LARGE_INTEGER 0x01d29b23`d17ef664
+0x170 ExitTime : _LARGE_INTEGER 0x0
+0x178 RundownProtect : _EX_RUNDOWN_REF
+0x180 UniqueProcessId : 0x00000000`0000073c Void
+0x188 ActiveProcessLinks : _LIST_ENTRY [ 0xfffffa80`31aeb1e8 - 0xfffffa80`3265da98 ]
+0x198 ProcessQuotaUsage : [2] 0x3dc8
kd> dt _LIST_ENTRY
nt!_LIST_ENTRY
+0x000 Flink : Ptr64 _LIST_ENTRY Next ListEntry
+0x008 Blink : Ptr64 _LIST_ENTRY Previous kd> dt _eprocess 0xfffffa80`31aeb1e8-0x188
nt!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x188 ActiveProcessLinks : _LIST_ENTRY [ 0xfffffa80`31ec84d8 - 0xfffffa80`31ec91e8 ]
+0x2e0 ImageFileName : [15] "vmtoolsd.exe" [空头][System][][][][Explorer][vmtoolsd]
*/
PLIST_ENTRY ListEntry = NULL;
PEPROCESS EProcess = NULL;
PEPROCESS v1 = NULL;
PEPROCESS EmptyEProcess = NULL;
char* ImageFileName = NULL;
EProcess = PsGetCurrentProcess();
if (EProcess == NULL)
{
return FALSE;
}
ImageFileName = (char*)((UINT8*)v1 + IMAGEFILENAME_EPROCESS);
DbgPrint("CurrentImageFileName:%s\r\n", ImageFileName);
v1 = EProcess; //System.exe EProcess
//System.exe 的前一个 实际上是一个空头节点
ListEntry = (PLIST_ENTRY)((UINT8*)EProcess + ACTIVEPROCESSLINKS_EPROCESS); //0x188
EmptyEProcess = (PEPROCESS)(((ULONG_PTR)(ListEntry->Blink)) - ACTIVEPROCESSLINKS_EPROCESS); ListEntry = NULL;
while (v1 != EmptyEProcess) //System!=空头节点
{
ImageFileName = (char*)((UINT8*)v1 + IMAGEFILENAME_EPROCESS); //System.exe Calc.exe
//DbgPrint("ImageFileName:%s\r\n",szImageFileName);
ListEntry = (PLIST_ENTRY)((ULONG_PTR)v1 + ACTIVEPROCESSLINKS_EPROCESS);
if (strstr(ImageFileName, ProcessImageName) != NULL)
{
if (ListEntry != NULL)
{
RemoveEntryList(ListEntry);
break;
}
}
v1 = (PEPROCESS)(((ULONG_PTR)(ListEntry->Flink)) - ACTIVEPROCESSLINKS_EPROCESS); //Calc
}
return TRUE;
}

ring0 进程隐藏实现的更多相关文章

  1. SSDT Hook实现简单的进程隐藏和保护【转载】

    原文链接:http://www.blogfshare.com/ssdthook-hide-protect.html 原文作者:AloneMonkey SSDT Hook实现简单的进程隐藏和保护 Alo ...

  2. 进程隐藏与进程保护(SSDT Hook 实现)(二)

    文章目录:                   1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ri ...

  3. Windows2003 内核级进程隐藏、侦测技术

    论文关键字: 内核 拦截 活动进程链表 系统服务派遣表 线程调度链 驱动程序简介    论文摘要:信息对抗是目前计算机发展的一个重要的方向,为了更好的防御,必须去深入的了解敌人进攻的招式.信息对抗促使 ...

  4. Linux下进程隐藏的方法及其对抗

    零.背景 在应急响应中,经常碰到ps命令和top命令查不到恶意进程(异常进程)的情况,会对应急响应造成很大的影响.轻则浪费时间,重则排查不出问题,让黑客逍遥法外.所以这篇博客研究学习如何对抗linux ...

  5. CRUX下实现进程隐藏(1)

    想必能找到这里的都是被吴一民的操作系统大作业坑过的学弟学妹了,当初我也是千辛万苦才把这个作业完成了,本着服务后辈的宗旨,尽量让学弟学妹少走弯路,我会把实现的大概思路记录下来.本系列一共三篇文章,分别实 ...

  6. CRUX下实现进程隐藏(2)

    前面我们介绍了如何修改/proc目录读取函数的方法实现进程隐藏.这篇博文将介绍另一种方法—— 劫持系统调用实现进程隐藏. 其基本原理是:加载一个内核模块(LKM),通过劫持系统调用sys_getden ...

  7. CRUX下实现进程隐藏(3)

    通过一个内核模块拦截文件系统的回调函数来实现进程隐藏. VFS(Virtual File System)是Linux在实际文件系统(如ext3,ext4,vfat等)上抽象出的一个文件系统模型,简单来 ...

  8. 进程隐藏与进程保护(SSDT Hook 实现)(三)

    文章目录: 1. 引子: 2. 获取当前系统下所有进程: 3. 服务管理(安装,启动,停止,卸载): 4. 应用程序和内核程序通信: 5. 小结: 1. 引子: 关于这个 SSDT Hook 实现进程 ...

  9. linux进程隐藏手段及对抗方法

    1.命令替换 实现方法 替换系统中常见的进程查看工具(比如ps.top.lsof)的二进制程序 对抗方法 使用stat命令查看文件状态并且使用md5sum命令查看文件hash,从干净的系统上拷贝这些工 ...

随机推荐

  1. C语言中的定义与声明

    什么是定义?什么是声明?它们有何区别? 举个例子: 1 2 A)int i; B)extern int i;(关于extern,后面解释) 哪个是定义?哪个是声明?或者都是定义或者都是声明?我所教过的 ...

  2. Margarite and the best present

    Little girl Margarita is a big fan of competitive programming. She especially loves problems about a ...

  3. hdu2066一个人的旅行(disjkstra)

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  4. js遍历table和gridview

    //遍历table var tableObj = document.getElementById("tableName");var str = "";for(v ...

  5. pip install keras==1.2.1

    [该方法仅适用于压缩包中含有setup.py的情况] 先从GitHub上找到想要下载的历史版本,右键复制链接地址. 然后执行命令: pip install https://github.com/ker ...

  6. 缺少Packages?不妨在这里找

    一个很全的网站(Linux全平台,rpm,dpkg等) Packages Search

  7. Google Zxing 生成二维码

    Net Zxing 源码地址 http://zxingnet.codeplex.com/ github 地址 https://github.com/zxing/zxing 新建一个Winform 项目 ...

  8. cookie使用举例(添加购物车商品_移除购物车商品)

    之前介绍过cookie和session的原理和区别.下面举例说明一下cookie在实际项目中的使用.使用cookie实现购物车功能: 1.往购物车添加商品 2.从购物车里移除商品 主要是要点是:以产品 ...

  9. linux 测试远程主机端口

    检测远程端口是否打开 常用telnet 110.101.101.101 80方式测试远程主机端口是否打开. 除此之外还可以使用: 方法1.nmap ip -p port 测试端口 nmap ip 显示 ...

  10. css内容整理2

    10.6.css伪类.伪元素 伪类用于向某些选择器添加特殊效果:伪元素用于将特殊的效果添加达到某选择器. 区别:伪类的效果可通过添加一个实际的类达到,用::伪元素效果则需要添加一个实际的元素,用:: ...