Можно ли запустить исполняемый файл из памяти?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Можно ли запустить исполняемый файл из памяти?

Сообщение Anonymous »

Я пытаюсь написать приложение, которое считывает EXE-файл и помещает его в память, исправляет новую таблицу IAT и разрешает перемещения.

Код: Выделить всё

int main()
{
LOADED_IMAGE loadedImage;
MapAndLoad("D:\\program\\test.exe", nullptr, &loadedImage, false, false);

LPVOID v = VirtualAlloc(nullptr, loadedImage.FileHeader->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
memcpy(v, loadedImage.MappedAddress, loadedImage.FileHeader->OptionalHeader.SizeOfHeaders);

for (int i = 0; i < loadedImage.FileHeader->FileHeader.NumberOfSections; ++i) {
const IMAGE_SECTION_HEADER& section = loadedImage.Sections[i];
LPVOID dest = reinterpret_cast(v) + section.VirtualAddress;
LPVOID src = reinterpret_cast(loadedImage.MappedAddress) + section.PointerToRawData;
memcpy(dest, src, section.SizeOfRawData);
}
DWORD_PTR delta = reinterpret_cast(v) - loadedImage.FileHeader->OptionalHeader.ImageBase;
ApplyRelocations(v, loadedImage.FileHeader, delta);

IMAGE_DATA_DIRECTORY& importDirectory = loadedImage.FileHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
IMAGE_IMPORT_DESCRIPTOR* imd = reinterpret_cast((char*)v + importDirectory.VirtualAddress);
while (imd->Name != 0) {
const char* dllName = reinterpret_cast((char*)v+ imd->Name);
if (*dllName == '\0') {
imd++;
continue;
}
HMODULE hMod = GetModuleHandleA((LPCSTR)dllName);
if (!hMod) {
hMod = LoadLibraryExA((LPSTR)(std::string("C:\\Windows\\System32\\") + std::string(dllName)).c_str(), 0, DONT_RESOLVE_DLL_REFERENCES);
}
auto nameAddressPtr = (PIMAGE_THUNK_DATA)(DWORD_PTR)(imd->OriginalFirstThunk +(char*)v);
auto funcAddr = (PIMAGE_THUNK_DATA)(DWORD_PTR)(imd->FirstThunk + (char*)v);
while (nameAddressPtr->u1.Function) {
FARPROC proc;
auto impotByNameImage = (PIMAGE_IMPORT_BY_NAME)(DWORD_PTR)(nameAddressPtr->u1.AddressOfData + (char*)v);
if (nameAddressPtr->u1.Ordinal&IMAGE_ORDINAL_FLAG) {
proc = GetProcAddress(hMod, MAKEINTRESOURCEA(impotByNameImage->Name));
}
else {
proc = GetProcAddress(hMod,impotByNameImage->Name);
}
auto oldProt = 0ul;
VirtualProtect(imd->FirstThunk+(char*)v, sizeof(IMAGE_THUNK_DATA), PAGE_EXECUTE_READWRITE, &oldProt);
funcAddr->u1.AddressOfData = (DWORD_PTR)proc;
nameAddressPtr++;
funcAddr++;
}
imd++;
}
void (*q)() = (void(*)())(reinterpret_cast(v) + loadedImage.FileHeader->OptionalHeader.AddressOfEntryPoint);
UnMapAndLoad(&loadedImage);
q();
}
Приложение, которое я пытаюсь прочитать, представляет собой простое приложение hello world.
Можно ли вообще проанализировать приложение и запустить его из памяти? Или в ОС реализованы меры безопасности, которые предотвращают это?
Я точно знаю, что IAT инициализируется правильно, поскольку вижу правильные имена функций в x64dbg.
PS: на данный момент я проигнорировал анализ раздела .tls из-за неопределенности.

Подробнее здесь: https://stackoverflow.com/questions/793 ... rom-memory
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»