ZwReadFile失败,异常代码0xC0000005,求指点

哈尔滨-猫猫 哈尔滨-猫猫 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
首先,我HOOK了SSDT的ZwReadFile函数,替换为我的_ZwReadFile,实现对系统所有进程读文件操作的过滤目的。当检测当前进程为w3wp.exe或者为ReadFileTest.exe(由于我获取进程名只获取到16个字节,所以少获取了一个'e',判断时,使用了ReadFileTest.ex)进程时,将判断这两个进程读的文件头10个字节,是否为我指定的内容,如果是,则执行相关解密操作。

其次,在进程进入我的_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-

weixin_38586942

Android Studio启动模拟器失败.docx

Android Studio启动模拟器失败解决方法

江七7

Adobe Premiere Pro 2018 无法启动,报错的解决方案

笔记本安装 Adobe Premiere Pro 2018 无法启动,报错的解决办法 笔记本安装 Adobe Premiere Pro 2018 无法启动,报错的解决办法 笔记本安装 Adobe Premiere Pro 2018 无法启动,报错的解决办法

稻草人V587

VC运行库(32-64位系统)

系统程序错误:应用程序无法正常启动(0xc0000005),请单击"确定"关闭应用程序。 这是因为系统缺失了应用程序启动文件所导致的,解决的办法就是重新安装一下运行库文件,然后按Win+R打开运行对话框,输入"Services.msc"运行服务,在右边栏下滑找到"Windows Modules Installer"双击打开,将启动类型设为"自动",再单击"启动"按钮,转到"恢复"栏,将前三个选项设为"运行一个程序",按"确定"退出服务,最后就可以在系统安装其他软件了。

键盘上的舞指

win2000-xp-2003错误代码大全

win2000-xp-2003错误代码大全

wzwwd55555
评论 17
收藏 已收藏
分享
返回顶部