Мне любопытно узнать, можно ли расширить модуль процесса, например, DLL, чтобы он был больше.
Например, я вставляю test.dll в test.exe, я делаю test. dll + 0x1000 байт больше, эти новые байты теперь имеют привилегии PAGE_EXECUTE, и я могу изменять их, как мне нравится.
Я хочу иметь возможность делать это только после введения dll, а не путем добавления поддельного кода в dll перезаписать, так как я, вероятно, не буду иметь никакого контроля над выполнением фактического объекта испытаний.
Я уже пытался использовать VirtualAllo c в конце секций DLL, чтобы увеличить его размер, но это не не работает, я обычно получаю ERROR_BAD_ADDRESS, я убедился, что у процесса достаточно места после dll для выделения и принятия.
uint64_t module_contents = (uint64_t)GetModuleHandleA(NULL);
IMAGE_DOS_HEADER* dos_header = (IMAGE_DOS_HEADER*)module_contents;
IMAGE_NT_HEADERS64* nt_header = (IMAGE_NT_HEADERS*)(module_contents + dos_header->e_lfanew);
IMAGE_SECTION_HEADER* section = (IMAGE_SECTION_HEADER*)(nt_header + 1);
for (unsigned short i = 0; i < nt_header->FileHeader.NumberOfSections; i++) {
if (!section->SizeOfRawData && section->Characteristics & IMAGE_SCN_MEM_EXECUTE) {
char name[8];
memcpy(name, section->Name, sizeof(name));
if (std::string(name).find("text") == std::string::npos) {
//std::cout << name << std::endl;
break;
}
}
section++;
}
std::cout << VirtualAlloc((void*)(module_contents + section->VirtualAddress + section->Misc.PhysicalAddress), 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE) << std::endl;
Ожидаемый результат - заполнение и подтверждение пустое пространство после разделов модуля, которое, как я проверяю, не было зафиксировано ни cout, ни Cheat Engine для проверки области памяти. В результате я получаю сообщение об ошибке 0x1E7 или ERROR_INVALID_ADDRESS. Я получил другие сообщения об ошибках, например ERROR_INVALID_PARAMETER, при использовании меньшего размера, например 0x1.
Любая помощь с этим приветствуется!