релоки должны указывать на выделенную память ? --- Сообщение объединено, 28 янв 2024 --- и системой... --- Сообщение объединено, 28 янв 2024 --- rmn, CreateThread в DllMain ?
Да: в бинарнике все обращения к данным предполагают, что бинарник загружен по фиксированному адресу (ImageBase). Если бинарник надо загрузить по другому адресу, все такие места надо пропатчить. Список всех этих мест лежит в таблице релоков. Ты идёшь по каждому смещению из таблицы релоков, и, в зависимости от размера указателя в байтах, пересчитываешь новый адрес: NewAddress = OldAddress - OldImageBase + NewImageBase
HoShiMin ,поблема в том что релоки это RVA адреса,а если длл разместить по произвольному адресу,то есть прочитать с диска в произвольную область памяти,здесь их придётся как-то пересчитывать,особенно когда образ загружен не по ImageBase
Да, создать поток в DllMain() безопасно. Главное, помнить, что хотя CreateThread() выполнится успешно и вернет валидный хендл, твоя функция потока не начнет выполняться, пока твоя DllMain() не завершится, поэтому ждать от потока что-то сразу после вызова CreateThread() - это гарантированный дедлок. Но лучше, конечно, класс-хелпер для создания потока заюзать, требующий для сборки C++24 и собирающийся кастомным тулчейном на джва гига всего за 7 секунд на i9-over9000
Есть хорошие статьи в http://rsdn.org/ как подготовить и грузить DLL в про-во процесса http://rsdn.org/article/baseserv/peloader.xml?print Загрузчик PE-файлов Исследование формата Portable Executable, сопровождающееся написанием PE-загрузчика http://rsdn.org/article/baseserv/InjectDll.xml?print Способ принудительной загрузки DLL в адресное пространство процесса --- Сообщение объединено, 28 янв 2024 --- И еще полезная статья........ http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1294 TUnRar без DLL