所以我试图写一个0序列从文件偏移量直到文件结束,这是我的代码:
HANDLE hFile = CreateFileA((LPCSTR)"hello.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile < 0) return -1;
DWORD fileSize = GetFileSize(hFile, NULL);
DWORD offset = 0x13d4;
DWORD check = NULL;
DWORD pos = SetFilePointer(hFile, offset, 0, FILE_BEGIN);
BYTE* zeroes = new BYTE[fileSize-offset];
ZeroMemory((PVOID)zeroes, fileSize-offset);
WriteFile(hFile, (PVOID)&zeroes, fileSize-offset, &check, NULL);
printf("Wrote %d bytes at %xn", check, pos);
if(check < fileSize-offset)
{
printf("[+] An error occured while trying to patch the file.");
return EXIT_FAILURE;
}
CloseHandle(hFile);
现在我检查了我的fileSize是正确的,文件偏移量(pos
)与offset
相同,我的文件句柄是有效的,写入存储在check
中的字节数等于zeroes
缓冲区长度,最后一个错误是0。然而,当我在十六进制模式下检查我的文件时,它没有在末尾添加任何零。
任何想法?
Thanks in advance
WriteFile(hFile, (PVOID)&zeroes, fileSize-offset, &check, NULL);
是错误的。您正在将数据写入指针变量zeroes
本身,而不是变量所指向的数据。通常,指针只有4或8个字节,所以如果文件足够大,可能会导致超出范围的访问。
删除zeros
之前的&
,使其写入zeroes
指向的缓冲区的内容。
WriteFile(hFile, (PVOID)zeroes, fileSize-offset, &check, NULL);