首页
社区
课程
招聘
[旧帖] [求助]驱动下读取SSDT中的NtOpenProcess函数地址蓝屏 0.00雪花
发表于: 2014-1-27 12:16 1742

[旧帖] [求助]驱动下读取SSDT中的NtOpenProcess函数地址蓝屏 0.00雪花

2014-1-27 12:16
1742
检查了好几次找不到是什么地方的问题,所以就来网上求助,
代码:
#include <ntddk.h>
VOID DriverUnload(PDRIVER_OBJECT driver);
NTSTATUS ddk_Disp(IN PDEVICE_OBJECT dev,PIRP pIrp); //派遣函数
NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject,IN UNICODE_STRING _devName,IN UNICODE_STRING _symLinkName);// 函数申明
UNICODE_STRING str1=RTL_CONSTANT_STRING(L"Hello,STRING\n");
NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_ptr)
{
        ULONG SSDT_NtOpenProcess_Cur_Addr;
        UNICODE_STRING devname;
        UNICODE_STRING linkname;
        extern long KeServiceDescriptorTable;
        DbgPrint("Load Driver!");
        RtlInitUnicodeString(&devname,L"\\Device\\MyFirstDevice");
        RtlInitUnicodeString(&linkname,L"\\??\\yjx888");
        driver->MajorFunction[IRP_MJ_CREATE]=ddk_Disp;
        driver->MajorFunction[IRP_MJ_CLOSE]=ddk_Disp;
        driver->MajorFunction[IRP_MJ_READ]=ddk_Disp;
        driver->MajorFunction[IRP_MJ_DEVICE_CONTROL]=ddk_Disp;
        //CreateDevice(driver,devname,linkname); // 创建一个设备
        driver->DriverUnload=DriverUnload;       
        _asm{
        push ebx
        push eax
                mov ebx,KeServiceDescriptorTable
                mov ebx,[ebx]
                mov eax,0x1E8
                add ebx,eax  //NTopenprocess
                mov ebx,[ebx]
                mov SSDT_NtOpenProcess_Cur_Addr,ebx
        pop eax       
        pop ebx
        int 3
        }
        KdPrint(("当前SSDT_NtOpenProcess_Cur_Addr地址为%x \n",SSDT_NtOpenProcess_Cur_Addr));
        return STATUS_SUCCESS;
}
VOID DriverUnload(PDRIVER_OBJECT driver)
{
        DbgPrint("Unload Driver!\n");
}
NTSTATUS
CreateDevice(IN PDRIVER_OBJECT pDriverObject,IN UNICODE_STRING _devName,IN UNICODE_STRING _symLinkName)
{
        NTSTATUS status;
        PDEVICE_OBJECT pDevObj;/*用来返回创建设备*/
        PUNICODE_STRING devName=&_devName;
        PUNICODE_STRING symLinkName=&_symLinkName;
                //创建设备
        status = IoCreateDevice( pDriverObject,\
                0,\
                devName,\
                FILE_DEVICE_UNKNOWN,\
                0, TRUE,\
                &pDevObj);
        if (!NT_SUCCESS(status))
        {
                DbgPrint("创建设备失败!");
                return status;
        }       
        pDevObj->Flags |= DO_BUFFERED_IO; // 直接缓冲I/O 读写模式            
        status = IoCreateSymbolicLink( symLinkName,devName );
        //以上
        if (!NT_SUCCESS(status))
        {
                IoDeleteDevice( pDevObj );
                return status;
        }
        DbgPrint("创建设备成功!");
        return STATUS_SUCCESS;
}
NTSTATUS ddk_Disp(IN PDEVICE_OBJECT dev,PIRP pIrp)
{
        pIrp->IoStatus.Information=0;
        pIrp->IoStatus.Status=STATUS_SUCCESS;
        IoCompleteRequest(pIrp,IO_NO_INCREMENT);
        DbgPrint(("离开派遣函数\n"));//调试信息
        return STATUS_SUCCESS; //返回成功
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
什么系统呀,这个可以允许的,不蓝屏
2014-1-27 14:32
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
为啥硬编码,换个系统版本不就蓝了?
实在不行自己在那段代码下个断点调试下,这种蓝肯定是访问的地址非法
2014-1-27 18:39
0
雪    币: 6910
活跃值: (9049)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
4
Win7 32位,ring0级下应该可以访问所以内存单元啊!
2014-1-27 20:17
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谁说可以访问所有内存的,有些内存压根没映射,你访问会蓝屏的
2014-1-27 22:06
0
雪    币: 6910
活跃值: (9049)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
6
换成了XP,不蓝了,不过只输出了 "Load Driver!",函数地址没输出。
2014-1-27 22:09
0
雪    币: 6910
活跃值: (9049)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
7
这段内存是SSDT表,不可能没有
2014-1-27 22:10
0
雪    币: 6910
活跃值: (9049)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
8
嗯,可以读出数据了,不过好像和 SSDT表中的NtOpenProcess函数的原始地址不一样,你测试一下呢!
2014-1-27 22:15
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
木有环境,没法测。如果不一样,可能是被HOOK了呗。
2014-1-27 22:30
0
雪    币: 6910
活跃值: (9049)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
10
我用 火眼看了那个地址,真的不一样。
2014-1-28 09:12
0
游客
登录 | 注册 方可回帖
返回
//