能力值:
( LV4,RANK:50 )
|
-
-
2 楼
JMP到目标函数? 那你不能随便动栈了,不然板上钉钉的蓝屏啊
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
没动,就是获取第一个参数判断下而已
|
能力值:
( LV9,RANK:140 )
|
-
-
4 楼
一般来说,参数都是指针.
所以,你确定你操作指针的姿势没有问题?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
没操作,只是获取第一个参数,判断是否等于某个值而已
还有麻烦问下,IRP_MJ_DEVICE_CONTROL派遣函数里可以用IoGetCurrentProcess获取调用deviceiocontrol的程序的eprocess么
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
上代码,看到代码才知道原因
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
编译器在编辑的是否会加一些其他的指令,你的情况应该是esp被改变了。试试在函数前加上__declspec(naked),函数用内联汇编写。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
加了的x
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
IRP_MJ_DEVICE_CONTROL派遣函数里可以用IoGetCurrentProcess获取调用deviceiocontrol的程序的eprocess么 ?
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
IoThreadToProcess(Irp->Tail.Overlay.Thread)
应该这样获取
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
IoGetRequestorProcess(Irp)
|
能力值:
( 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;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
你还是掌握点程序基本原理再来写驱动吧,否则蓝死客户不偿命啊。
symLinkName一个局部变量你就往device ext里放啊。
另外,蓝屏最起码要看看DUMP,而不是对着代码问挖掘机技术哪家强。
|
能力值:
( 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";
可以这么尝试下,看看有没有再崩溃;
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
没仔细看,确实是拷贝了。
可能确实是你说的问题,确实某些情况下DriverEntry会被放在INIT节中
所以说出了问题还是得看DUMP啊
|
能力值:
( 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]
}
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
谢谢大神,我试下
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
大神,能否帮我看下代码
|
|
|