看流星社区

 找回密码
 注册账号
查看: 2114|回复: 0

驱动杀进程.驱动通信经典例子(VB将进程PID传入驱动)

[复制链接]

该用户从未签到

发表于 2013-5-5 09:39:53 | 显示全部楼层 |阅读模式
有的时候在内核里面获取数据并不是很方便,所以要借助ring3层的东东。。。
这个源码的原理就是:普通ring3层的某些数据,可以通过驱动通信的方式,将ring3的数据传送到驱动内核里面,然后驱动内核里面 再获取出该数据。
以下驱动:涉及到驱动通信,看老郁的视频太慢了,直接用源码实战。exe部分是用 vb6写的。。。。有空再出VC6版。
不过驱动通信部分就是以下这个套路,看过 老郁 的视频的 驱动通信 就会明白了。
还有涉及到驱动通信的话,驱动名称就不能随便修改了,修改了以后就不能通信了
驱动通信 用户层上的VB代码主要就是 调用 DeviceIoControl 函数,所以这一点,也让我想到了,如果要阻止或拦截 某进程发送的驱动控制码,我们可以直接 hook 这个函数就可以拿到控制码,ok,先来看下 这个函数大概介绍 :
VB调用IoControl = DeviceIoControl(hDrvHandle, dwIoControlCode, ByVal lpInBuffer, nInBufferSize, ByVal lpOutBuffer, nOutBufferSize, lDrvRetSize, ByVal 0)

---------------------------------------------------------------------------------
VB声明Declare Function DeviceIoControl Lib "kernel32" Alias "DeviceIoControl" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, lpOverlapped As OVERLAPPED) As Long
说明对设备执行指定的操作(这里所谓的设备 Device ,我的理解就是驱动。。。)
返回值 Long,非零表示成功,零表示失败


参数 类型及说明
hDevice Long,设备句柄("设备"就是"驱动",那么设备句柄就是驱动句柄)
dwIoControlCode Long,应用程序调用驱动程序的控制命令,即 驱动控制码,驱动控制码书上说从0x800起步,不过我好像用了10进制的 10 或 100 也可以 。
lpInBuffer Any,应用程序传递给驱动程序的数据缓冲区地址,缓冲地址:说白了就是就是一个内存地址,不过这个内存地址全是 应用层的数据,比如本贴中的进程PID就是在这个参数上设置的。这个参数就是 应用层  往  驱动层传输数据的纽带。
nInBufferSize Long,应用程序传递给驱动程序的数据缓冲区大小,字节数。一般填写 4字节
lpOutBuffer Any,驱动程序返回给应用程序的数据缓冲区地址,缓冲地址:说白了就是就是一个内存地址,不过这个内存地址上全是 从 驱动层过来的 数据而这个参数就是  驱动层 往 应用层  传输数据的纽带
nOutBufferSize Long,驱动程序返回给应用程序的数据缓冲区大小,字节数。一般填写4字节
lpBytesReturned Long,驱动程序实际返回给应用程序的数据字节数地址。一般填写 0 ,感觉是多余的参数

lpOverlapped OVERLAPPED,这个结构用于重叠操作。针对同步操作,请用ByVal As Long传递零值,一般填写0,感觉是多余的参数
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <ntddk.h>
#define DEVICE_NAME L"\\Device\\myQuDong" //Driver Name
#define LINK_NAME L"\\DosDevices\\\myQuDong"  //Link Name
#define IOCTL_BASE        0x800 //定义常量
#define TEMPLATE_CTL_CODE(i) \
        CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_BASE+i, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_PID TEMPLATE_CTL_CODE(1) //控制码是 0x801

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString);//驱动事件函数声明
NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp);//驱动事件函数声明
NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)//驱动事件函数声明
VOID DriverUnload(PDRIVER_OBJECT pDriverObj);//驱动事件函数声明
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp);//驱动事件函数声明
long Ring0OpenProcess(HANDLE Pid);//自定义函数声明
void TerminateProcess(long hProcess);//自定义函数声明

__declspec(dllimport) NTSTATUS ZwOpenProcess(HANDLE* pProcessHandle, int AccessMask, OBJECT_ATTRIBUTES* pObjectAttributes, CLIENT_ID* pClientId);
//声明内核API函数ZwOpenProcess,用来获取进程句柄的

__declspec(dllimport) NTSTATUS ZwTerminateProcess(ULONG pProcessHandle,int ExitStatus);
//声明内核函数ZwTerminateProcess用来结束进程的

NTSTATUS ZwCreateJobObject(
        OUT PHANDLE  JobHandle,
        IN ACCESS_MASK  DesiredAccess,
        IN POBJECT_ATTRIBUTES  ObjectAttributes);
NTSTATUS ZwAssignProcessToJobObject(
    HANDLE JobHandle,
    HANDLE ProcessHandle
);

NTSTATUS ZwTerminateJobObject(
    HANDLE JobHandle,
    NTSTATUS ExitStatus
);
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
        NTSTATUS status = STATUS_SUCCESS;
        UNICODE_STRING ustrLinkName;
        UNICODE_STRING ustrDevName;   
        PDEVICE_OBJECT pDevObj;

        DbgPrint("Drv DriverEntry: %S\n",pRegistryString->Buffer);

        // Create dispatch points for device control, create, close.
        pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
        pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
        pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
        pDriverObj->DriverUnload = DriverUnload;

        RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);//1

        status = IoCreateDevice(pDriverObj, //创建设备
                0,
                &ustrDevName,
                FILE_DEVICE_UNKNOWN,
                0,
                FALSE,
                &pDevObj);

        DbgPrint("Drv Device Name %S",ustrDevName.Buffer);//打印出设备名称

        if(!NT_SUCCESS(status))
        {
                DbgPrint("Drv IoCreateDevice = 0x%x\n", status); //设备句柄
                return status;
        }
        RtlInitUnicodeString(&ustrLinkName, LINK_NAME);//字符串处理
        status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);  //4


        if(!NT_SUCCESS(status))
        {
                DbgPrint("Drv IoCreateSymbolicLink = 0x%x\n", status);
                IoDeleteDevice(pDevObj);  
                return status;
        }

        DbgPrint("Drv SymbolicLink:%S",ustrLinkName.Buffer);//打印出字符
        return STATUS_SUCCESS;
}

NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
        NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
        PIO_STACK_LOCATION pIrpStack;
        ULONG uIoControlCode;
        PVOID pIoBuffer;
        ULONG uInSize;
        ULONG uOutSize;
        long hProcess;

        pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
        uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
        pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
        uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
        uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;

        switch(uIoControlCode)
        {
        case IOCTL_PID:///////如果控制码等于 0x801 ,那么就执行以下的代码。
                {
                        DbgPrint("ProcessID:%d",*(HANDLE *)pIoBuffer);//打印出从应用层传来的进程PID
                        hProcess=Ring0OpenProcess(*(HANDLE *)pIoBuffer);//依据进程PID获取进程句柄
                        DbgPrint("ProcessHandle:%d",hProcess);//打印出进程句柄
                        //ZwTerminateProcess(hProcess,0);//其实用这个函数也可以直接结束进程的。
                        TerminateProcess(hProcess);//用自定义函数来结束进程
                        status = STATUS_SUCCESS;//返回状态
                        break;//注意一定要写上这句,否则就蓝给你看。
                }
        }

        if(status == STATUS_SUCCESS)
                pIrp->IoStatus.Information = uOutSize;
        else
                pIrp->IoStatus.Information = 0;

        pIrp->IoStatus.Status = status;
        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
        return status;
}

VOID DriverUnload(PDRIVER_OBJECT pDriverObj)
{
        UNICODE_STRING strLink;
        RtlInitUnicodeString(&strLink, LINK_NAME);
        IoDeleteSymbolicLink(&strLink);
        IoDeleteDevice(pDriverObj->DeviceObject);
        DbgPrint("Driver Unloaded\n");
}

NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
        pIrp->IoStatus.Status = STATUS_SUCCESS;
        pIrp->IoStatus.Information = 0;
        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
        DbgPrint("Driver IRP_MJ_CREATE\n");
        return STATUS_SUCCESS;
}

NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
        pIrp->IoStatus.Status = STATUS_SUCCESS;
        pIrp->IoStatus.Information = 0;
        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
        DbgPrint("Driver IRP_MJ_CLOSEE\n");
        return STATUS_SUCCESS;
}

long Ring0OpenProcess(HANDLE Pid)//依据进程PID 来 获取进程句柄
{
        ULONG ProcessHandle=0;
        CLIENT_ID objCid;
        OBJECT_ATTRIBUTES objOa;
        ///////////////////////////////////////
        RtlZeroMemory(&objOa,sizeof(OBJECT_ATTRIBUTES));
        RtlZeroMemory(&objCid,sizeof(CLIENT_ID));
        ////////////////////////////////////
    objOa.Length = sizeof(objOa);
    objCid.UniqueProcess = (HANDLE)Pid;//进程pid
        ZwOpenProcess (&(HANDLE)ProcessHandle, 0x1F0FFF, &objOa, &objCid);//  ZwOpenProcess获取进程句柄
        //////////////////////
    return ProcessHandle;
}

void TerminateProcess(long hProcess)//依据进程句柄  来 结束进程
{
    OBJECT_ATTRIBUTES objOa;
    NTSTATUS st;
    HANDLE hJob;
    //////////////////////////////
    RtlZeroMemory(&objOa,sizeof(OBJECT_ATTRIBUTES));
    ///////////////////////////////////////
    objOa.Length = sizeof (OBJECT_ATTRIBUTES);
    st = ZwCreateJobObject(&hJob, 0, &objOa);
    if (NT_SUCCESS (st))
    {
                ZwAssignProcessToJobObject(hJob, (HANDLE)hProcess);
                ZwTerminateJobObject((HANDLE)hJob,0);
        ZwClose (hJob);
        ZwClose ((HANDLE)hProcess);
    }
}

http://pan.baidu.com/share/link?shareid=518869&uk=3895950538
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-14 11:22

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表