хай всем пишу стаб для своего pe-компрессора, в образовательных целях сделал для теста простой загрузчик, который распакованный в память exe приводит в порядок (за счёт секции релоков) и передаёт ему управление. всё сделал, всё работает, за исключением одного момента - ресурсы. ресурсы обрабатываю таким образом - выделяю память по адресу >ImageBase текущего процесса (стаба), туда копирую секцию ресурсов от сжатого екзе. для текущего процесса (стаба) в хедерах прописываем VA новой секции ресурсов: our_data_directory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = NewResourcesVA; // NewResourcesVA = NewResources-ImageBase our_data_directory[IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = NewResourcesSize; после правлю VA для всех найденных в ресурсах IMAGE_RESOURCE_DATA_ENTRY. после когда уже всё готово для передачи управления entry point-у, ради теста написал такой вот код (в память загружался пустой скомпиленый билдером екзе): HRSRC rs = FindResource(hInstance, "TFORM1", RT_RCDATA); // тут получаем правильный адрес, NewResources+0x130 DWORD cbRes = SizeofResource(hInstance, rs); // тут 0 HGLOBAL glb = LoadResource(hInstance, rs); // тут NULL LPVOID pResData = LockResource(glb); // тут NULL ShowError(); // тут - указанный файл образа не содержит секции ресурсов Вопрос - что я забыл сделать ?
Значит ты неправильно восстановил секцию ресурсов. Я не помню - какие - VA или RVA адреса в директории ресурсов, но даст тебе RVA-адрес. Может ты хотел VA? Сначала проверь тест на нормальных файлах (то есть неупакованный тест-файл). Если он сработает, значит 100% дело в ошибке упаковщика, а не в самом тесте. Тогда выложи сам упаковщик, а именно - ту часть, к-я работает с ресурсами.
В общем оказалось надо устанавливать в заголовках PE SizeOfImage = NewResourcesVA+NewResourcesSize, тк функция которая резолвит ресурсы проверяет не вылезли ли они за пределы размеров образа PE, и если вылезли - заканчивает резолвинг с ошибок что образ не содержит ресурсов (эту ошибку он выдаёт в разных случаях, не обязательно файл должен не содержать ресурсов).
SizeOfImage - это размер виртуального образа. Должен определяться так: Код (Text): SizeOfImage = RVAадрес_последней_секции + Виртуальный_размер_последней_секции Секция ресурсов необязательно должна быть последней (н-р, после упаковки AsPack'ом после ресурсов появляется еще 2 секции). Если (Виртуальный_размер_последней_секции == 0), то он определяется как физический размер, выровненный на выравнивание секций в памяти (SectionAligment).
Дело в том что после того как я её распакую вслед за стабом она станет последней в любом случае. Я просто сразу не обратил внимания на SizeOfImage в заголовке, а текст сообщения об ошибке сбил с толку.