首页
社区
课程
招聘
[求助]把所有ssdt都指向了我的函数,直接jmp到原函数没事,获取第一个参数判断下再jmp就蓝屏怎么回事
发表于: 2014-10-11 22:53 6754

[求助]把所有ssdt都指向了我的函数,直接jmp到原函数没事,获取第一个参数判断下再jmp就蓝屏怎么回事

2014-10-11 22:53
6754
收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
JMP到目标函数? 那你不能随便动栈了,不然板上钉钉的蓝屏啊
2014-10-11 23:02
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
没动,就是获取第一个参数判断下而已
2014-10-11 23:04
0
雪    币: 2332
活跃值: (3624)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
4
一般来说,参数都是指针.
所以,你确定你操作指针的姿势没有问题?
2014-10-12 00:19
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
没操作,只是获取第一个参数,判断是否等于某个值而已
还有麻烦问下,IRP_MJ_DEVICE_CONTROL派遣函数里可以用IoGetCurrentProcess获取调用deviceiocontrol的程序的eprocess么
2014-10-12 00:26
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
上代码,看到代码才知道原因
2014-10-12 09:33
0
雪    币: 124
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
编译器在编辑的是否会加一些其他的指令,你的情况应该是esp被改变了。试试在函数前加上__declspec(naked),函数用内联汇编写。
2014-10-12 10:41
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
加了的x
2014-10-12 12:09
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
IRP_MJ_DEVICE_CONTROL派遣函数里可以用IoGetCurrentProcess获取调用deviceiocontrol的程序的eprocess么 ?
2014-10-12 12:11
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
IoThreadToProcess(Irp->Tail.Overlay.Thread)
应该这样获取
2014-10-12 15:18
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
IoGetRequestorProcess(Irp)
2014-10-13 14:59
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
哥们,为何我电脑和虚拟机一个一样的iso安得win7,为何一样的驱动虚拟机卸载没事,我的一卸载就蓝屏啊
这是代码
#include <ntddk.h>
#include <windef.h>
#include <ntstatus.h>
#define PAGEDCODE code_seg("PAGE")
#define LOCKEDCODE code_seg()
#define INITCODE code_seg("INIT")

#define PAGEDDATA data_seg("PAGE")
#define LOCKEDDATA data_seg()
#define INITDATA data_seg("INIT")

#define arraysize(p) (sizeof(p)/sizeof((p)[0]))

#define MAX_FILE_LENGTH 1024
typedef struct _DEVICE_EXTENSION {
        PDEVICE_OBJECT pDevice;
        UNICODE_STRING ustrDeviceName;        //设备名称
        UNICODE_STRING ustrSymLinkName;        //符号链接名

        PUCHAR buffer;//缓冲区
        ULONG file_length;//模拟的文件长度,必须小于MAX_FILE_LENGTH
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
NTSTATUS DispatchIoctl(PDEVICE_OBJECT DriverObject, PIRP pIrp)
  {
      PIO_STACK_LOCATION   io_stack;
     NTSTATUS             status;
      io_stack = IoGetCurrentIrpStackLocation(pIrp);
      if (io_stack->MajorFunction==IRP_MJ_DEVICE_CONTROL)
      {
         
     }
     IoCompleteRequest(pIrp,IO_NO_INCREMENT);
     return pIrp -> IoStatus.Status;
}
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject)
{
        PDEVICE_OBJECT        pNextObj;
UNICODE_STRING pLinkName;
        KdPrint(("Enter DriverUnload\n"));
        pNextObj = pDriverObject->DeviceObject;
        while (pNextObj != NULL)
        {
                PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
                        pNextObj->DeviceExtension;
                if (pDevExt->buffer)
                {
                        ExFreePool(pDevExt->buffer);
                        pDevExt->buffer = NULL;
                }

                //删除符号链接
                pLinkName = pDevExt->ustrSymLinkName;
                IoDeleteSymbolicLink(&pLinkName);
                pNextObj = pNextObj->NextDevice;
                IoDeleteDevice( pDevExt->pDevice );
        }
}
NTSTATUS CreateDevice (
                IN PDRIVER_OBJECT        pDriverObject)
{
        NTSTATUS status;
        PDEVICE_OBJECT pDevObj;
        PDEVICE_EXTENSION pDevExt;
        UNICODE_STRING symLinkName;
        //创建设备名称
        UNICODE_STRING devName;
        RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");
       
        //创建设备
        status = IoCreateDevice( pDriverObject,
                                                sizeof(DEVICE_EXTENSION),
                                                &devName,
                                                FILE_DEVICE_UNKNOWN,
                                                0, TRUE,
                                                &pDevObj );
        if (!NT_SUCCESS(status))
                return status;

        pDevObj->Flags |= DO_DIRECT_IO;
        pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
        pDevExt->pDevice = pDevObj;
        pDevExt->ustrDeviceName = devName;

        //申请模拟文件的缓冲区
        pDevExt->buffer = (PUCHAR)ExAllocatePool(PagedPool,MAX_FILE_LENGTH);
        //设置模拟文件大小
        pDevExt->file_length = 0;

        //创建符号链接
        RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");
        pDevExt->ustrSymLinkName = symLinkName;
        status = IoCreateSymbolicLink( &symLinkName,&devName );
        if (!NT_SUCCESS(status))
        {
                IoDeleteDevice( pDevObj );
                return status;
        }
        return STATUS_SUCCESS;
}
NTSTATUS DriverEntry (
                        IN PDRIVER_OBJECT pDriverObject,
                        IN PUNICODE_STRING pRegistryPath        )
{
        NTSTATUS status;
        KdPrint(("Enter DriverEntry\n"));

        //设置卸载函数
        pDriverObject->DriverUnload = HelloDDKUnload;
     pDriverObject->MajorFunction[IRP_MJ_CREATE] =
    pDriverObject->MajorFunction[IRP_MJ_READ] =
   pDriverObject->MajorFunction[IRP_MJ_WRITE] =
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
       
        //创建驱动设备对象
        status = CreateDevice(pDriverObject);

        KdPrint(("Leave DriverEntry\n"));
        return status;
}
2014-10-13 17:38
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
你还是掌握点程序基本原理再来写驱动吧,否则蓝死客户不偿命啊。

symLinkName一个局部变量你就往device ext里放啊。

另外,蓝屏最起码要看看DUMP,而不是对着代码问挖掘机技术哪家强。
2014-10-13 19:23
0
雪    币: 107
活跃值: (73)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
14
虽然是局部变量,但是已经经过拷贝,所以我个人觉着他的问题点不在这里;
问题可能在于这二个常量的使用上:
RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");
RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");
2个字符串应该处于Init段,函数执行完之后就销毁了;
故而在HelloDDKUnload中使用,导致直接崩溃了;

全局定义这2个字符串,如:
LPCWSTR const MY_DEVICENAME = L"\\Device\\MyDDKDevice";
LPCWSTR const MY_SYMLNKNAME = L"\\??\\HelloDDK";
可以这么尝试下,看看有没有再崩溃;
2014-10-13 20:07
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
没仔细看,确实是拷贝了。

可能确实是你说的问题,确实某些情况下DriverEntry会被放在INIT节中

所以说出了问题还是得看DUMP啊
2014-10-13 20:17
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
我的函数貌似蓝屏就这段,反正不是蓝屏就说服务错误,过一会儿关机,这是在中介函数的蓝屏的出问题的那段代码,nakeadd是原函数地址
变量都是全局的ULONG protect[200]={0};

pee=(ULONG)IoGetCurrentProcess();
i=0;
for(i=0;i<200;i++)
{

if(protect[i]==0)
{

_asm
{
jmp [nakeadd]
}

}

}
_asm
{
jmp [nakeadd]
}
2014-10-14 19:15
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
谢谢大神,我试下
2014-10-14 19:23
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
大神,能否帮我看下代码
2014-10-14 22:15
0
游客
登录 | 注册 方可回帖
返回
//