找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7402|回复: 7

[半原创]山寨版NtSystemDebugControl(8)(9) - MySystemDebugControl

 火.. [复制链接]

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-7-15 17:46:27 | 显示全部楼层 |阅读模式
这个可以干什么就不多说了,自己琢磨吧。。。
======
核心驱动代码:
#include <ntddk.h>

#define DEVICE_NAME L"\\Device\\MySystemDebugControl" //Driver Name
#define LINK_NAME L"\\DosDevices\\MySystemDebugControl"  //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_SET_ADDRESS TEMPLATE_CTL_CODE(1)
#define IOCTL_ReadKernelMemory TEMPLATE_CTL_CODE(2)
#define IOCTL_WriteKernelMemory TEMPLATE_CTL_CODE(3)
#define IOCTL_GetEmptySubAddress TEMPLATE_CTL_CODE(4)
#define IOCTL_ClearEmptySub TEMPLATE_CTL_CODE(5)
#define IOCTL_CallEmptySub TEMPLATE_CTL_CODE(6)

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);

static KIRQL OldIrql;
ULONG EmptySubAddr=0;
VOID WpOffAndToDpcLevel();
VOID WpOn();
VOID EmptySub();
NTSTATUS ReadKernelMemory(PVOID Address, ULONG Size, PVOID OutBuffer);
NTSTATUS WriteKernelMemory(PVOID Address, ULONG Size, PVOID InBuffer);

PVOID AddressSet = 0;

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);

    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);  
    if(!NT_SUCCESS(status))
    {
        DbgPrint("Drv IoCreateSymbolicLink = 0x%x\n", status);
        IoDeleteDevice(pDevObj);  
        return status;
    }

    DbgPrint("Drv SymbolicLink:%S",ustrLinkName.Buffer);
    EmptySubAddr=(ULONG)EmptySub;
    DbgPrint("EmptySub Address=%x",EmptySubAddr);
    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;
   
    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_SET_ADDRESS:
        {
            __try
            {
               
                AddressSet = *(PVOID *)pIoBuffer;
                DbgPrint("Add:%d",AddressSet);
                status = STATUS_SUCCESS;
            }
            __except (EXCEPTION_EXECUTE_HANDLER)
            {
                status = GetExceptionCode();
                break;
            }
        }break;
        //读内核内存
        case IOCTL_ReadKernelMemory:
        {   
            DbgPrint("Read Add:%d",AddressSet);
            status = ReadKernelMemory(AddressSet, uOutSize, pIoBuffer);
            AddressSet = 0;
            break;
        }
        //写内核内存
        case IOCTL_WriteKernelMemory:
        {
            DbgPrint("Write Add:%d",AddressSet);
            status = WriteKernelMemory(AddressSet, uInSize, pIoBuffer);
            AddressSet = 0;
            break;
        }
        //得到空函数地址
        case IOCTL_GetEmptySubAddress:
        {
            EmptySubAddr=(ULONG)EmptySub;
            memcpy(pIoBuffer, &EmptySubAddr, sizeof(ULONG));
            status = STATUS_SUCCESS;
            break;
        }
        //清空空白函数
        case IOCTL_ClearEmptySub:
        {
            memset((PVOID)(EmptySubAddr+2), 0x90, 256);
            break;
        }
        //调用空白函数
        case IOCTL_CallEmptySub:
        {   
            EmptySub();
            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;
}

VOID WpOffAndToDpcLevel()
{
    OldIrql = KeRaiseIrqlToDpcLevel();
    __asm
    {
        cli
        push eax
        mov eax, cr0
        and eax, 0FFFEFFFFh
        mov cr0, eax
        pop eax
    }
}

VOID WpOn()
{
    __asm
    {
        push eax
        mov eax, cr0
        or eax, 10000h
        mov cr0, eax
        pop eax
        sti
    }
    KeLowerIrql(OldIrql);
}

NTSTATUS ReadKernelMemory(PVOID Address, ULONG Size, PVOID OutBuffer)
{
    NTSTATUS st = STATUS_UNSUCCESSFUL;
    PMDL  pMdl = 0;
    PVOID pAddress = 0;

    if (!Address) return st;
    pMdl = IoAllocateMdl(Address, Size, FALSE, FALSE, 0);
    if (pMdl)
    {
        MmBuildMdlForNonPagedPool(pMdl);
        pAddress = MmGetSystemAddressForMdlSafe(pMdl, NormalPagePriority);
        if (pAddress)
        {
            __try
            {
                RtlCopyMemory(OutBuffer, pAddress, Size);
                st = STATUS_SUCCESS;
            }
            __except(EXCEPTION_EXECUTE_HANDLER)
            {                    
            }
        }            
        IoFreeMdl(pMdl);
    }
    return st;
}

NTSTATUS WriteKernelMemory(PVOID Address, ULONG Size, PVOID InBuffer)
{
    NTSTATUS st = STATUS_UNSUCCESSFUL;
    PMDL  pMdl = 0;
    PVOID pAddress = 0;
    KSPIN_LOCK spinlock;
    KIRQL oldirql;
   
    if (!Address) return st;
    pMdl = IoAllocateMdl(Address, Size, FALSE, FALSE, 0);
    if (pMdl)
    {
        MmBuildMdlForNonPagedPool(pMdl);
        pAddress = MmGetSystemAddressForMdlSafe(pMdl, NormalPagePriority);
        if (pAddress)
        {
            __try
            {
                KeInitializeSpinLock(&spinlock);
                KeAcquireSpinLock(&spinlock,&oldirql);
                WpOffAndToDpcLevel();
                RtlCopyMemory(pAddress, InBuffer, Size);
                WpOn();
                KeReleaseSpinLock(&spinlock, oldirql);
                st = STATUS_SUCCESS;
            }
            __except(EXCEPTION_EXECUTE_HANDLER)
            {                    
            }
        }            
        IoFreeMdl(pMdl);
    }
    return st;
}

VOID EmptySub()
{
    _asm
    {
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
    }
}

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-7-15 18:05:18 | 显示全部楼层
VB调用代码:

  1. Option Explicit
  2.    
  3. Public DrvController As New cls_Driver
  4. Private Const IOCTL_SET_ADDRESS = &H801
  5. Private Const IOCTL_READ_KERNEL_MEM = &H802
  6. Private Const IOCTL_WRITE_KERNEL_MEM = &H803
  7. Private Const IOCTL_GetEmptySubAddress = &H804
  8. Private Const IOCTL_ClearEmptySub = &H805
  9. Private Const IOCTL_CallEmptySub = &H806
  10. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  11.    
  12. '长整形数字转成字节数组:输入Long,输出Byte数组
  13. Public Sub Long2ByteArray(ByVal lng As Long, ByRef ba() As Byte)
  14.     Dim TempBytes(0 To 3) As Byte
  15.     CopyMemory TempBytes(0), lng, 4
  16.     ba = TempBytes
  17. End Sub
  18.    
  19. '字节数组转成长整形数字:输入Byte数组,输出Long
  20. Public Sub ByteArray2Long(ByRef lng As Long, ByRef ba() As Byte)
  21.      CopyMemory lng, ba(0), 4
  22. End Sub
  23.    
  24. '读取内核数据:地址,长度,输出缓冲区
  25. Public Function ReadKernelMemoryEx(ByVal Address As Long, ByVal nSize As Long, ByVal OutBuffer As Long) As Long
  26.     With DrvController
  27.         .IoControl .CTL_CODE_GEN(IOCTL_SET_ADDRESS), VarPtr(Address), 4, 0, 0
  28.         ReadKernelMemoryEx = .IoControl(.CTL_CODE_GEN(IOCTL_READ_KERNEL_MEM), 0, 0, OutBuffer, nSize)
  29.     End With
  30. End Function
  31.    
  32. '修改内核数据:地址,长度,输入缓冲区
  33. Public Function ModifyKernelMemoryEx(ByVal Address As Long, ByVal nSize As Long, ByVal InBuffer As Long) As Long
  34.     With DrvController
  35.         .IoControl .CTL_CODE_GEN(IOCTL_SET_ADDRESS), VarPtr(Address), 4, 0, 0
  36.         ModifyKernelMemoryEx = .IoControl(.CTL_CODE_GEN(IOCTL_WRITE_KERNEL_MEM), InBuffer, nSize, 0, 0)
  37.     End With
  38. End Function
  39.    
  40. '读取内核数据:读取定长为4的内核内存数据
  41. Public Sub ReadKernelMemory(ByVal Address As Long, ByRef ulData As Long)
  42.     Dim bytX(0 To 3) As Byte
  43.     ReadKernelMemoryEx Address, 4, VarPtr(bytX(0))
  44.     ByteArray2Long ulData, bytX
  45. End Sub
  46.    
  47. '修改内核数据:修改定长为4的内核内存数据
  48. Public Sub ModifyKernelMemory(ByVal Address As Long, ByVal ulData As Long)
  49.     Dim bytX() As Byte
  50.     Long2ByteArray ulData, bytX  '数值
  51.     ModifyKernelMemoryEx Address, 4, VarPtr(bytX(0))
  52. End Sub
  53. '读取内核数据:地址,长度,返回字节数组
  54. Public Sub ReadKernelMemory2(ByVal Address As Long, ByVal nSize As Long, ByRef BytBuf() As Byte)
  55.     ReDim BytBuf(nSize - 1) As Byte
  56.     ReadKernelMemoryEx Address, nSize, VarPtr(BytBuf(0))
  57. End Sub
  58.    
  59. '修改内核数据:地址,长度,以及字节数组
  60. Public Sub ModifyKernelMemory2(ByVal Address As Long, ByVal nSize As Long, ByRef BytBuf() As Byte)
  61.     ModifyKernelMemoryEx Address, nSize, VarPtr(BytBuf(0))
  62. End Sub
  63. '得到空函数地址
  64. Public Function GetEmptySubAddr() As Long
  65.     Dim Ltmp As Long
  66.     With DrvController
  67.         .IoControl .CTL_CODE_GEN(IOCTL_GetEmptySubAddress), 0, 0, VarPtr(Ltmp), 4
  68.     End With
  69.     GetEmptySubAddr = Ltmp
  70. End Function
  71. '擦除空函数内容
  72. Public Sub ClearEmptySub()
  73.     With DrvController
  74.         .IoControl .CTL_CODE_GEN(IOCTL_ClearEmptySub), 0, 0, 0, 0
  75.     End With
  76. End Sub
  77. '调用空函数
  78. Public Sub CallEmptySub()
  79.     With DrvController
  80.         .IoControl .CTL_CODE_GEN(IOCTL_CallEmptySub), 0, 0, 0, 0
  81.     End With
  82. End Sub
复制代码

陈辉的cls_driver.cls就自己找吧,网上很多的。

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-7-15 18:20:15 | 显示全部楼层
VB调用驱动函数,利用MySystemDebugControl实现。

VB调用驱动函数.rar

95.43 KB, 阅读权限: 10, 下载次数: 4

售价: 10 水晶币  [记录]

本网站最菜的人 该用户已被删除
发表于 2010-7-15 20:02:55 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-7-16 14:00:37 | 显示全部楼层
不知道有啥用..............:L
我就是嗷嗷叫的老马了......

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-7-16 20:19:20 | 显示全部楼层
本帖最后由 HoviDelphic 于 2010-7-16 20:45 编辑

回复 5# 马大哈


这是几个使用MySystemDebugControl的demo,主要代码都不是我写的。

mysysdbg.rar

153.46 KB, 阅读权限: 20, 下载次数: 2

售价: 10 水晶币  [记录]

demo

1

主题

16

回帖

0

精华

初来乍到

积分
31
发表于 2010-7-17 14:47:22 | 显示全部楼层
先记录下、也许有用

7

主题

414

回帖

1

精华

铂金会员

积分
2173
发表于 2013-4-6 23:59:48 | 显示全部楼层
好東西 值得收藏
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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