У меня такая проблема. Есть два EXE файла. У одного файла, я выделяю секцию ресурсов и сдампливаю ее на диск в файл rsrc.bin Затем добавляю секцию .rsrc во второй EXE и прописываю туда rsrc.bin Т.е. проще говоря, я отрезаю секцию ресурсов у одного экзешника и приклеиваю ее к другому. Проблема в том, что-то ресурсы оказываются неработоспособными. В Resource Hacker нормально отображается дерево ресурсов, но при попытке открыть любой из них выдается сообщение "This file has a non-standart resource layout..." Подскажите, что не так с этим экзешником, может какие-то поля неправильно установлены?
Если VA новой секции ресурсев отличается от VA старой, то нужно поменять все IMAGE_RESOURCE_DATA_ENTRY.OffsetToData на эту разницу
примерно так Код (Text): mov esi,FileMapping add esi,[esi+3Ch] mov esi,[esi].IMAGE_NT_HEADERS.OptionalHeader.DataDirectory[(IMAGE_DIR_RESOURCE)].VirtualAddress add esi,FileMapping mov eax,VANew sub eax,VAOld invoke EnumResDir,esi,eax ... EnumResDir proc pRes,dwDelta assume esi:ptr IMAGE_RESOURCE_DIRECTORY movzx eax,[esi].NumberOfNamedEntries movzx ecx,[esi].NumberOfIdEntries add ecx,eax add esi,sizeof IMAGE_RESOURCE_DIRECTORY assume esi:ptr IMAGE_RESOURCE_DIRECTORY_ENTRY .repeat push esi push ecx mov edx,[esi].OffsetToData .if edx & 80000000h mov esi,edx and esi,7FFFFFFFh add esi,pRes invoke EnumResDir,pRes,dwDelta .else mov eax,dwDelta assume esi:nothing mov esi,[esi].IMAGE_RESOURCE_DIRECTORY_ENTRY.OffsetToData add esi,pRes add [esi].IMAGE_RESOURCE_DATA_ENTRY.OffsetToData,eax .endif pop ecx pop esi add esi,sizeof IMAGE_RESOURCE_DIRECTORY_ENTRY dec ecx .until ZERO? ret EnumResDir endp
Только я не пойму, почему иногда ресурсы все таки нормально отображаются. Для примера еще один EXE в аттаче. У него с переносом ресурсов все правильно. Это случайное совпадение Virtual Address ресурсов в двух разных файлах?