阅读:3589回复:3
PAGE_FAULT_IN_NONPAGED_AREA 错误 各位老大帮忙看看啊!
自己修改了一个io control。
static NTSTATUS MydrvDispatchIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION IrpStack; NTSTATUS status; ULONG ControlCode; ULONG InputLength,OutputLength; TCHAR wInputBuffer[200]; TCHAR OutMsg[] = \"Message send by driver\"; // 得到当前IRP (IO请求包) IrpStack = IoGetCurrentIrpStackLocation(Irp); // 得到DeviceIoControl传来的功能调用号 ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; // 得到DeviceIoControl传来的输入缓冲区长度 InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength; // 得到DeviceIoControl的输出缓冲区长度 OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; switch (ControlCode) { case IOCTL_EVENT_MSG: DbgPrint(\"IOCTL_EVENT_MSG\\n\"); DbgPrint(\"InputLength = %d\\n\",InputLength); DbgPrint(\"OutputLength = %d\\n\",OutputLength); if ( InputLength>0 && OutputLength==0) { char ProcessName[256] ={0}; WCHAR WideName[256] = {0}; int i=0; DbgPrint(\"%s\\n\",Irp->AssociatedIrp.SystemBuffer); RtlCopyMemory(ProcessName,Irp->AssociatedIrp.SystemBuffer,InputLength); for ( ; i < InputLength; i++ ) WideName [ i ] = ProcessName [ i ]; RtlInitUnicodeString(&hide_process_name,WideName); DbgPrint(\"process_name %ws\\n\",hide_process_name.Buffer); Irp->IoStatus.Information = InputLength; Irp->IoStatus.Status = STATUS_SUCCESS; break; } RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, OutMsg, sizeof(OutMsg)); Irp->IoStatus.Status = STATUS_SUCCESS; OutputLength = sizeof(OutMsg); Irp->IoStatus.Information = OutputLength; break; } status = Irp->IoStatus.Status; IoCompleteRequest(Irp, 0); return status; } hide_process_name 是一个全局的 UNICODE_STRING 写了一个简单的交互程序 输入 要隐藏的进程名字 #include \"windows.h\" #include \"stdio.h\" #define CTL_CODE( DeviceType, Function, Method, Access ) ( \\ ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \\ ) #define FILE_ANY_ACCESS 0 #define METHOD_BUFFERED 0 #define FILE_DEVICE_UNKNOWN 0x00000022 #define IOCTL_EVENT_MSG CTL_CODE(FILE_DEVICE_UNKNOWN, 0x927, METHOD_BUFFERED , FILE_ANY_ACCESS) void main (int argc ,char* argv[]) { char* FileName = \"\\\\\\\\.\\\\MyDriver\"; HANDLE hf=NULL; hf = CreateFile(FileName,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if ( hf == INVALID_HANDLE_VALUE ) { printf(\"CreateFile %d\",GetLastError()); return ; } char ibuf[] = \"WINLOGON.EXE\"; DWORD A=0; if ( !DeviceIoControl(hf,IOCTL_EVENT_MSG,ibuf,12,NULL,0,&A,NULL) ) { printf(\"DeviceIoControl %d\",GetLastError()); return ; } Sleep(1000000); } 如果运行了上面的应用程序,WINLOGON在任务管理器中消失。但是在几秒钟后出现PAGE_FAULT_IN_NONPAGED_AREA错误。 如果不运行应用程序驱动没问题。 调试了一个下午,还是找不出问题出在哪? 各位老大帮忙调试调试啊。感激感激! 完整的驱动源代码在附件中。先谢谢啦。 [编辑 - 2/28/05 by LionD8] |
|
|
沙发#
发布于:2005-02-28 20:18
你在HookZwQuerySystemInformation里执行
if (RtlCompareUnicodeString(&hide_process_name, &curr->ProcessName, 1) == 0) hide_process_name在MydrvDispatchIoctl里的IOCTL_EVENT_MSG里被初始化,而你的字符传分配在堆栈里,当你比较的时候能不崩溃吗?? 你应该把 UNICODE_STRING hide_process_name; WCHAR WideName[256] = {0}; 都放在全局变量里保险...... |
|
|
板凳#
发布于:2005-02-28 20:38
测试了下,还可以,虽然方法比较烂,不过对于一般的RING3进程查看器也够了....
|
|
|
地板#
发布于:2005-03-01 10:08
多谢wowocock老大帮忙。俺又看了看RtlInitUnicodeString的反汇编代码。
原来 RtlInitUnicodeString(&hide_process_name,WideName); 直接就把WideName的地址赋值给了hide_process_name.Buffer 怪的不得要出错。 原来以为在RtlInitUnicodeString中会自动分配一块内存然后在赋值给hide_process_name.Buffer,所以一直想不通出错的原因。 再次感谢老大帮忙。感激感激。 |
|