ZwReadFile失败,异常代码0xC0000005,求指点
其次,在进程进入我的_ZwReadFile时,是可以正常读取文件内容的,然后我想判断一下此次读的文件的头10个字节是否为我指定的内容,由于刚刚已经读到了文件结尾,下一次读时需要将文件位置设置为0,以便再次从文件头中读取文件头10个字节的内容。
于是,有如下代码:
bool IsEncrypt(HANDLE FileHandle)
{
IO_STATUS_BLOCK ioStatus;
ULONG dwReaded = 0;
FILE_POSITION_INFORMATION current_fpi;
FILE_POSITION_INFORMATION fpi;
NTSTATUS status;
InterlockedIncrement(&g_uCount);
//获取当前文件位置信息,以便读取文件头后,恢复当前文件指针位置
status = ZwQueryInformationFile(FileHandle, &ioStatus, ¤t_fpi, sizeof(FILE_POSITION_INFORMATION), FilePositionInformation);
DbgPrint("%ld", current_fpi.CurrentByteOffset);
if (NT_SUCCESS(status))
{
DbgPrint("ZwQueryInformationFile successful");
}
else
{
DbgPrint("ZwQueryInformationFile failed");
}
//移动文件指针位置到文件头部
fpi.CurrentByteOffset.QuadPart = 0i64;
DbgPrint("%ld", fpi.CurrentByteOffset);
//设置文件指针位置信息
status = ZwSetInformationFile(FileHandle, &ioStatus, &fpi, sizeof(FILE_POSITION_INFORMATION), FilePositionInformation);
if (NT_SUCCESS(status))
{
DbgPrint("ZwSetInformationFile successful");
}
else
{
DbgPrint("ZwSetInformationFile failed");
}
char *szFileHeader = (char*)ExAllocatePool(NonPagedPool, 10);
ULONG length = 10;
NTSTATUS status1 = g_pfnZwReadFile(
FileHandle,
NULL,
NULL,
NULL,
&ioStatus,
szFileHeader,
length,
NULL,
NULL);
if (NT_SUCCESS(status1))
{
DbgPrint("Read File Header successful");
}
else
{
//此处将会被执行,读取文件失败。。。
DbgPrint("Read File Header failed : %d, %d, %d", status1, ioStatus.Status, ioStatus.Information);
}
//恢复文件指针位置
ZwSetInformationFile(FileHandle, &ioStatus, ¤t_fpi, sizeof(FILE_POSITION_INFORMATION), FilePositionInformation);
InterlockedDecrement(&g_uCount);
DbgPrint("FileHeader : %s", szFileHeader);
if (!strcmp(szFileHeader, "QQ:7278449"))
{
return TRUE;
}
ExFreePool(szFileHeader);
return FALSE;
}
NTSTATUS NTAPI _ZwReadFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID Buffer,
IN ULONG Length,
IN PLARGE_INTEGER ByteOffset OPTIONAL,
IN PULONG Key OPTIONAL
)
{
NTSTATUS status;
char szProcessName[256] = {0};
GetProcessName((ULONG)PsGetCurrentProcessId(), szProcessName);
InterlockedIncrement(&g_uCount);
status = g_pfnZwReadFile(
FileHandle,
Event,
ApcRoutine,
ApcContext,
IoStatusBlock,
Buffer,
Length,
ByteOffset,
Key);
InterlockedDecrement(&g_uCount);
if (!strcmp(szProcessName, "w3wp.exe") || !strcmp(szProcessName, "ReadFileTest.ex"))
{
DbgPrint("Current Process Name : %s", szProcessName);
DbgPrint("%s", Buffer);
if (IsEncrypt(FileHandle))
{
DbgPrint("the file is encrypt!!!");
Decrypt((char*)Buffer, Length);
}
}
return status;
}
注:g_pfnZwReadFile为HOOK后,原ZwReadFile函数的指针。
经过一周时间windbg调试+DebugView,也没能找出读文件失败原因,还请大神指点,表示感谢!
可用分全部奉上....
相关推荐
pytorch报错:Process finished with exit code -1073741819 (0xC0000005)
网上各种解决方法,但是我都试了不可以,我实验发现如果不采用gpu环境的pytorch程序无报错,采用使用gpu的pytoch程序报错,采用gpu的tensroflow和keras不报错。这就让我很疑惑,为什么只有采用gpu的pytorch程序才会报错,又联想到windows10有自动更新系统的毛病,所以我怀疑是自动更新把我配的环境搞坏了。所以采取了一下自查行为: 1.查看自己安装torch和torchvision的版本 我的环境是windows10,python版本是3.6.7,笔记本显卡是GTX950m,torchvision版本是cu92/torchvision-0.6.0+cu92-
Android Studio启动模拟器失败.docx
Android Studio启动模拟器失败解决方法
Adobe Premiere Pro 2018 无法启动,报错的解决方案
笔记本安装 Adobe Premiere Pro 2018 无法启动,报错的解决办法 笔记本安装 Adobe Premiere Pro 2018 无法启动,报错的解决办法 笔记本安装 Adobe Premiere Pro 2018 无法启动,报错的解决办法
VC运行库(32-64位系统)
系统程序错误:应用程序无法正常启动(0xc0000005),请单击"确定"关闭应用程序。 这是因为系统缺失了应用程序启动文件所导致的,解决的办法就是重新安装一下运行库文件,然后按Win+R打开运行对话框,输入"Services.msc"运行服务,在右边栏下滑找到"Windows Modules Installer"双击打开,将启动类型设为"自动",再单击"启动"按钮,转到"恢复"栏,将前三个选项设为"运行一个程序",按"确定"退出服务,最后就可以在系统安装其他软件了。
win2000-xp-2003错误代码大全
win2000-xp-2003错误代码大全


驱动开发/核心开发
