NtReadFile 不读取
NtReadFile doesn't read
本文关键字:读取 NtReadFile 更新时间:2023-10-16
我尝试用nativeApi编写dll注入器。我的第一个问题是这样做的好吗?第二个是:NtReadFile不会失败,但也不会读取。我认为这是缓冲错误,但我不确定?我如何解决这个问题?
现在是这样的:
bool initiationDll(const std::string& dllPath){
if (!isDllExist(dllPath))
{
printf("Dll doesn't exist!n");
return false;
}
else
{
printf("LibraryPath :%sn", dllPath.c_str());
NTSTATUS status;
HANDLE lFile;
OBJECT_ATTRIBUTES objAttribs = { 0 };
UNICODE_STRING unicodeString;
std::string dllPathWithprefix = "\??\" + dllPath;
std::wstring wString = std::wstring(dllPathWithprefix.begin(), dllPathWithprefix.end()); PCWSTR toPcwstr = wString.c_str();
RtlInitUnicodeString(&unicodeString, toPcwstr);
InitializeObjectAttributes(&objAttribs, &unicodeString, OBJ_CASE_INSENSITIVE, NULL, NULL);
objAttribs.Attributes = 0;
const int allocSize = 2048;
LARGE_INTEGER largeInteger;
largeInteger.QuadPart = allocSize;
IO_STATUS_BLOCK ioStatusBlock;
status = NtCreateFile(
&lFile,
GENERIC_ALL,
&objAttribs,
&ioStatusBlock,
&largeInteger,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_OPEN,
FILE_NON_DIRECTORY_FILE,
NULL,
NULL
);
if (!NT_SUCCESS(status)) {
printf("CreateFile failed..n");
return false;
}
else {
printf("Library Handle : %pn", lFile);
DWORD fileSize = getDllSize(dllPath);
if (fileSize == 0)
{
printf("File size 0.n");
return false;
}
else
{
printf("File size : %d byte.n", fileSize);
PVOID FileReadBuffer;
FileReadBuffer = new CHAR[fileSize];
status = NtReadFile(
lFile,
NULL,
NULL,
NULL,
&ioStatusBlock,
FileReadBuffer,
sizeof(FileReadBuffer),
0, // ByteOffset
NULL);
if (!NT_SUCCESS(status))
{
printf("Unable to read the dll... : %dn", GetLastError());
return false;
}
}
}}
For NtCreateFile:
status -> 0
ioStatusBlock : Status -> 0
Pointer -> 0x00000000
Information -> 1
我尝试NtOpenFile和相同的结果。
For NtReadFile:status -> -1073741811
ioStatusBlock : Status -> 0
Pointer -> 0x00000000
Information -> 1
NtCreateFile函数后的结果值
NtReadFile函数后的结果值
if (lFile == INVALID_HANDLE_VALUE)
-您需要检查返回的status
而不是lFile
,并且NT从未将文件句柄设置为INVALID_HANDLE_VALUE
-因此条件始终为FALSE。OPEN_EXISTING
(3) -错误的常数NtCreateFile
-需要使用FILE_OPEN
(1)为例或使用NtOpenFile
。您以异步方式打开文件(没有FILE_SYNCHRONOUS_IO_NONALERT
或FILE_SYNCHRONOUS_IO_NALERT
) -由于NtReadFile
,您获得STATUS_PENDING
(0x103)的速度更快。所以你没有进入STATUS_PENDING
的if (!NT_SUCCESS(status))
块,但FileReadBuffer
的数据还没有准备好。
和下一次张贴所有状态和ioStatusBlock值
NtReadFile
的状态码-1073741811表示通过了INVALID_PARAMETER
。
ErrorCodeDescription
将0赋给ByteOffset
参数为我解决了这个问题;
LARGE_INTEGER liBytes = { 0 };
status = SysNtReadFile(pFileHandle, NULL, NULL, NULL, &statusBlock, buffer, fileSize, &liBytes, NULL);
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 独立读取-修改-写入顺序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- NtReadFile 不读取