Всем привет. Есть PE-файл со static-линковкой который требуется отработать в памяти (приложение на C++, собирается в VS 2015). Падает не доходя до точки входа (стадия инициализации рантайма). Отладка подсказала, что происходит следующее сравнение Код (Text): cmp dword ptr ds:[rcx + rax], 0 где rcx - смещение, rax - imagebase пациента, но rax == 0, через что мы и падаем.. Судя по предшествующему этой проверке коду, вопрос касается VEH. По константам нагуглил такое - https://github.com/DarthTon/Blackbone/blob/master/src/BlackBone/ManualMap/MExcept.cpp . Посредством отладчика заполнил в динамике rax и место откуда оно его тянет - всё работает. Как-то мысли сошлись к тому, что я просто не добавил указатель на элементы IMAGE_DIRECTORY_ENTRY_EXCEPTION пациента в таблицу (RtlpDynamicFunctionTable) посредством RtlAddFunctionTable(), все же гостевое приложение обильно использует исключения. Ок, делаем - возвращает TRUE, но приложение все равно падает (вот у человека аналогичная проблема - https://wasm.in/threads/rtladdfunctiontable-i-dll-v-pamjati.24773/). Прежде чем с головой нырять в анализ рантайм-хлама или правку кода загружаемого, вопрос: как быть с ImageBase? В peb подмену производил - не помогает. Какие пути решения? Случай редкий, встречается не только у меня. Загрузчик написан и работает нормально. Пациент тоже нормально, но видать реализация MS-рантайма почему-то дает сбой.. в динамической версии (/MD) всё работает. Спасибо за внимание!
Настройка кода производится в своём АП. На примере публичных реализаций, примерно такое: - https://github.com/nettitude/SimplePELoader - https://github.com/fancycode/MemoryModule
Ответа не знаю, но хотел добавить что два примера которые вы предоставили (загрузка DLL без LoadLibrary) называется reflective DLL loader в среде infosec (metasploit, хакеры-шмакеры). Конкретно по вопросу, если есть crashdump (.dmp), могу посмотреть и подсказать в чём проблема. Компрессируйте 7z и закачивайте на любой сервис (Google Drive, Microsoft OneDrive, etc). Удачи.