Специалисты по PE формату, подскажите, что не так с EXE файлом.

Тема в разделе "WASM.RESEARCH", создана пользователем jangle, 5 сен 2007.

  1. jangle

    jangle New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    56
    Адрес:
    Russia
    У меня такая проблема. Есть два EXE файла. У одного файла, я выделяю секцию ресурсов и сдампливаю ее на диск в файл rsrc.bin
    Затем добавляю секцию .rsrc во второй EXE и прописываю туда rsrc.bin
    Т.е. проще говоря, я отрезаю секцию ресурсов у одного экзешника и приклеиваю ее к другому. Проблема в том, что-то ресурсы оказываются неработоспособными. В Resource Hacker нормально отображается дерево ресурсов, но при попытке открыть любой из них выдается сообщение "This file has a non-standart resource layout..."
    Подскажите, что не так с этим экзешником, может какие-то поля неправильно установлены?
     
  2. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    Если VA новой секции ресурсев отличается от VA старой, то нужно поменять все IMAGE_RESOURCE_DATA_ENTRY.OffsetToData на эту разницу
     
  3. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    примерно так
    Код (Text):
    1. mov esi,FileMapping
    2. add esi,[esi+3Ch]
    3. mov esi,[esi].IMAGE_NT_HEADERS.OptionalHeader.DataDirectory[(IMAGE_DIR_RESOURCE)].VirtualAddress
    4. add esi,FileMapping
    5. mov eax,VANew
    6. sub eax,VAOld
    7. invoke EnumResDir,esi,eax
    8.  
    9. ...
    10. EnumResDir proc pRes,dwDelta
    11.     assume  esi:ptr IMAGE_RESOURCE_DIRECTORY
    12.     movzx   eax,[esi].NumberOfNamedEntries
    13.     movzx   ecx,[esi].NumberOfIdEntries
    14.     add     ecx,eax
    15.     add     esi,sizeof IMAGE_RESOURCE_DIRECTORY
    16.     assume  esi:ptr IMAGE_RESOURCE_DIRECTORY_ENTRY
    17.     .repeat
    18.         push    esi
    19.         push    ecx
    20.  
    21.         mov     edx,[esi].OffsetToData
    22.         .if edx & 80000000h
    23.             mov     esi,edx
    24.             and     esi,7FFFFFFFh
    25.             add     esi,pRes
    26.             invoke  EnumResDir,pRes,dwDelta
    27.         .else
    28.             mov     eax,dwDelta
    29.             assume  esi:nothing
    30.             mov     esi,[esi].IMAGE_RESOURCE_DIRECTORY_ENTRY.OffsetToData
    31.             add     esi,pRes
    32.             add     [esi].IMAGE_RESOURCE_DATA_ENTRY.OffsetToData,eax
    33.         .endif
    34.  
    35.         pop     ecx
    36.         pop     esi
    37.         add     esi,sizeof IMAGE_RESOURCE_DIRECTORY_ENTRY
    38.         dec     ecx
    39.     .until ZERO?
    40.  
    41.     ret
    42. EnumResDir endp
     
  4. jangle

    jangle New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    56
    Адрес:
    Russia
    Спасибо! Буду дальше думать! )))
     
  5. jangle

    jangle New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    56
    Адрес:
    Russia
    Только я не пойму, почему иногда ресурсы все таки нормально отображаются. Для примера еще один EXE в аттаче. У него с переносом ресурсов все правильно. Это случайное совпадение Virtual Address ресурсов в двух разных файлах?