LionD8
驱动牛犊
驱动牛犊
  • 注册日期2003-04-20
  • 最后登录2011-02-14
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3589回复:3

PAGE_FAULT_IN_NONPAGED_AREA 错误 各位老大帮忙看看啊!

楼主#
更多 发布于:2005-02-28 17:56
自己修改了一个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_driver.rar (18KB)  24
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于: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};
都放在全局变量里保险......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2005-02-28 20:38
测试了下,还可以,虽然方法比较烂,不过对于一般的RING3进程查看器也够了....
附件名称/大小 下载次数 最后更新
2005-02-28_driver.rar (1264KB)  24
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
LionD8
驱动牛犊
驱动牛犊
  • 注册日期2003-04-20
  • 最后登录2011-02-14
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-01 10:08
多谢wowocock老大帮忙。俺又看了看RtlInitUnicodeString的反汇编代码。
原来 RtlInitUnicodeString(&hide_process_name,WideName);
直接就把WideName的地址赋值给了hide_process_name.Buffer
怪的不得要出错。
原来以为在RtlInitUnicodeString中会自动分配一块内存然后在赋值给hide_process_name.Buffer,所以一直想不通出错的原因。
再次感谢老大帮忙。感激感激。
游客

返回顶部