Правильное перемещение основания PE - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь запустить исполняемый файл WIN32 PE из памяти (не для вредоносных программ только в целях защиты программного обеспечения). Когда я размещаю на нужном изображении базовый адрес (0x00400000), он работает отлично. Но это не идеально, так как этот адрес не всегда доступен, иногда даже используется текущим процессом в зависимости от ASLR.

Вместо этого я должен переместить изображение с новым адресом, полученным из VirtualAllo c (), используя этот обобщенный код c.

    while (pIBR->VirtualAddress)
    {
        if (pIBR->SizeOfBlock >= sizeof(IMAGE_BASE_RELOCATION))
        {
            count = (pIBR->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD);
            list = (PWORD)(pIBR + 1);

            for (i = 0; i < count; i++)
            {
                if (list[i])
                {
                    ptr = (PDWORD)((LPBYTE)image + (pIBR->VirtualAddress + (list[i] & 0xFFF)));
                    *ptr += delta;
                }
            }
        }

        pIBR = (PIMAGE_BASE_RELOCATION)((LPBYTE)pIBR + pIBR->SizeOfBlock);
    }

, который отлично работает для простых исполняемых файлов, но более сложные исполняемые файлы с ресурсами, TLS и многими другими вещами загружаются некорректно или вообще не загружаются.

Мой вопрос, есть ли лучший способ перемещения изображений или как я всегда могу зарезервировать адрес 0x00400000 за мой новый образ PE.

Спасибо.

...