-
Автор темы
- #1
как в файле найти определённые байты и заменить их на другие
#include <fstream>
using namespace std;
int main() {
ofstream f("text.txt"); // Файл и текст для теста
f.write("hello world", 12); // str, size
f.close();
f.open("text.txt", ofstream::binary | ofstream::out | ofstream::in);
f.seekp(2); // Индекс начала замены
f.write("ugame", 5); // newStr, size
}
#include <Windows.h>
#include <stdio.h>
BYTE* find_needle(BYTE* haystack, size_t haystack_length, BYTE* needle, size_t needle_length) {
for (size_t haystack_index = 0; haystack_index < haystack_length; haystack_index++) {
bool needle_found = true;
for (size_t needle_index = 0; needle_index < needle_length; needle_index++) {
BYTE haystack_character = haystack[haystack_index + needle_index];
BYTE needle_character = needle[needle_index];
if (haystack_character == needle_character) {
continue;
}
else {
needle_found = false;
break;
}
}
if (needle_found) {
return &haystack[haystack_index];
}
}
return nullptr;
}
int main(int argc, char* argv[])
{
HANDLE hInFile = CreateFileA("input file", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
HANDLE hOutFile = CreateFileA("output file", GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
DWORD dwSize = GetFileSize(hInFile, 0);
BYTE* mem = (BYTE*)malloc(dwSize);
DWORD dw;
ReadFile(hInFile, mem, dwSize, &dw, 0);
BYTE* to_be_found = (BYTE*)"bytes to be found in input file";
BYTE* bytesOffset = find_needle(mem, dwSize, to_be_found, sizeof(to_be_found));
printf("bytes found: %p\n", bytesOffset);
BYTE* replace = (BYTE*)"replace with this bytes";
memcpy(bytesOffset, replace, sizeof(replace));
WriteFile(hOutFile, mem, dwSize, &dw, 0);
CloseHandle(hOutFile);
CloseHandle(hInFile);
return 0;
}
ебать оверкомпликейт...Если не слишком большой файл
C++:#include <Windows.h> #include <stdio.h> BYTE* find_needle(BYTE* haystack, size_t haystack_length, BYTE* needle, size_t needle_length) { for (size_t haystack_index = 0; haystack_index < haystack_length; haystack_index++) { bool needle_found = true; for (size_t needle_index = 0; needle_index < needle_length; needle_index++) { BYTE haystack_character = haystack[haystack_index + needle_index]; BYTE needle_character = needle[needle_index]; if (haystack_character == needle_character) { continue; } else { needle_found = false; break; } } if (needle_found) { return &haystack[haystack_index]; } } return nullptr; } int main(int argc, char* argv[]) { HANDLE hInFile = CreateFileA("input file", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); HANDLE hOutFile = CreateFileA("output file", GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0); DWORD dwSize = GetFileSize(hInFile, 0); BYTE* mem = (BYTE*)malloc(dwSize); DWORD dw; ReadFile(hInFile, mem, dwSize, &dw, 0); BYTE* to_be_found = (BYTE*)"bytes to be found in input file"; BYTE* bytesOffset = find_needle(mem, dwSize, to_be_found, sizeof(to_be_found)); printf("bytes found: %p\n", bytesOffset); BYTE* replace = (BYTE*)"replace with this bytes"; memcpy(bytesOffset, replace, sizeof(replace)); WriteFile(hOutFile, mem, dwSize, &dw, 0); CloseHandle(hOutFile); CloseHandle(hInFile); return 0; }
ну 32 мб ,но я могу сделать по другому спасибоЕсли не слишком большой файл
C++:#include <Windows.h> #include <stdio.h> BYTE* find_needle(BYTE* haystack, size_t haystack_length, BYTE* needle, size_t needle_length) { for (size_t haystack_index = 0; haystack_index < haystack_length; haystack_index++) { bool needle_found = true; for (size_t needle_index = 0; needle_index < needle_length; needle_index++) { BYTE haystack_character = haystack[haystack_index + needle_index]; BYTE needle_character = needle[needle_index]; if (haystack_character == needle_character) { continue; } else { needle_found = false; break; } } if (needle_found) { return &haystack[haystack_index]; } } return nullptr; } int main(int argc, char* argv[]) { HANDLE hInFile = CreateFileA("input file", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); HANDLE hOutFile = CreateFileA("output file", GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0); DWORD dwSize = GetFileSize(hInFile, 0); BYTE* mem = (BYTE*)malloc(dwSize); DWORD dw; ReadFile(hInFile, mem, dwSize, &dw, 0); BYTE* to_be_found = (BYTE*)"bytes to be found in input file"; BYTE* bytesOffset = find_needle(mem, dwSize, to_be_found, sizeof(to_be_found)); printf("bytes found: %p\n", bytesOffset); BYTE* replace = (BYTE*)"replace with this bytes"; memcpy(bytesOffset, replace, sizeof(replace)); WriteFile(hOutFile, mem, dwSize, &dw, 0); CloseHandle(hOutFile); CloseHandle(hInFile); return 0; }
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz