Выравнивание секций

Тема в разделе "WASM.BEGINNERS", создана пользователем GoldFinch, 14 окт 2008.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Есть файл с 1 секцией
    VirtSize: 70h
    VirtAddr: 1000h
    raw data size: 200h
    raw data offs: 200h

    при этом у него
    Section Alignment 1000h
    File Alignment 200h

    меняю File Alignment на 4 - незапускается
    меняю и File Alignment и Section Alignment на 4 - незапускается
    меняю Section Alignment на 0x200 - незапускается

    как так?
     
  2. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    GoldFinch
    SizeOfImage с учетом выравнивания ?
     
  3. PE_Kill

    PE_Kill New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    107
    GoldFinch естественно

    http://www.insidepro.com/kk/085/085r.shtml
    Физическое смещение секции в файле должно быть кратно степени выравнивания, прописанной в заголовке файла в поле File Alignment. Линкер от Microsoft по умолчанию использует выравнивание в 1000h, а наименьшая кратность выравнивания равна 200h (и хотя Windows NT поддерживает гораздо меньшие значения в 20h и даже 10h, такой файл не сможет работать в Windows 9x, поэтому такое выравнивание в живой природе практически не встречается).

    но даже если ты сделаешь всё по правилам, то файл не бедет загружаться, т.к. секции у тебя выравнены на старые значения, а мапится будут по новым - в итоге неверные смещения. Это же элементарно.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    GoldFinch
    Если File Alignment меньше 200h, то должен быть равен Section Alignment
    SizeOfImage становится неравным VirtualSize + VirtualAddress. Имеется в виду VirtualSize выравненный на SectionAlignment (который Вами изменён).
    Аналогично предыдущему.
    P.S. Мда... опоздал... сильно. :)
    P.P.S. А ещё VirtualSize < SizeOfRawData - далеко не самое кошерное сочетание.
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
  6. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    File Alignment = 4
    Section Alignment = 4
    Size of image = 1070h (1000h+70h)

    - незапускается
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    GoldFinch
    Вообще P.P.S. из четвёртого поста ещё в силе.
    К тому же, если SectionAlignment < 1000h, то VirtualAddress каждой секции должен быть равен PointerToRawData.
    Почитайте вот эту тему.
     
  8. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    PE_Kill
    Небольшая поправка - на NT выравнивания в 20h и 10h встречаются в основном в драйверах и при таких значениях загрузчки проецирует содержимое файла в память 1:1 (т.е. физический образ всегда равен виртуальному).
     
  9. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Скомпилено фасмом. При выравнивании размера файла по размеру кластера 0x200 (512), фактического увеличения зангимаемого файлом места на диске не происходит, так что все нормально.
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    GoldFinch
    Я компилю ml а линкую polink с File Alignment = 4 и Section Alignment = 4 более подробно здесь и здесь
     
  11. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    А я задаю заголовок прямо в фасме, ага:
    ?? equ 0xAAAA
    dw "MZ",0, "PE",0, 14ch,1, ??,??, ??,??, ??,??, 0xE0,103h, 10bh,??, ??,??, ??,??, ??,??, EntryPoint,0, ??,??, ??,??, 0,40h
    ...

    Если что, тема не о том, как скомпилить маленький файл, а о том как переделать имеющийся.
     
  12. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
  13. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    ппц... мой моск окончательно съеден PE-header'ом...
    вот фасмовский сырец файла:
    Код (Text):
    1. FILE_ALIGN = 0x200
    2. VIRTUAL_ALIGN = 0x1000
    3. IMAGE_SIZE = 0x4000
    4. HEAREDS_SIZE = 0x200
    5.  
    6. SECTIONS = 3
    7.  
    8. SEC_1_VIRT_SIZE = 0x100
    9. SEC_1_RVA    = 0x1000
    10. SEC_1_RAW_SIZE = 0x200
    11. SEC_1_RAW_OFS = 0x200
    12. SEC_2_VIRT_SIZE = 0x100
    13. SEC_2_RVA    = 0x2000
    14. SEC_2_RAW_SIZE = 0x200
    15. SEC_2_RAW_OFS = 0x400
    16.  
    17. SEC_3_VIRT_SIZE = 0x1000
    18. SEC_3_RVA    = 0x3000
    19. SEC_3_RAW_SIZE = 0x200
    20. SEC_3_RAW_OFS = 0x0
    21.  
    22. ENTRYPOINT equ 4;0x3004  ;<<<<<<<<<<<<<<<<<<
    23. ;========== header begin ===============
    24. dd "MZ"
    25. ;-------- inserted code ----------------
    26. use32
    27. ;int3
    28. push 0x400000+EntryPoint
    29. ret
    30. ;---------------------------------------
    31. db 0x3c-$ dup 0
    32. dd 0x40,"PE"
    33. dw 14ch,SECTIONS,0,0,0,0,0,0,0xE0,103h,10bh,0,0,0,0,0,0,0
    34. dd ENTRYPOINT,0,0,400000h,VIRTUAL_ALIGN,FILE_ALIGN
    35. dd 0,0,4,0
    36. dd IMAGE_SIZE,HEAREDS_SIZE
    37. dw 0,0,2,0,0,0,0,0,0,0,0,0,0,0,2,0
    38. data_dir:
    39. dd 0,0, idata,20, 2*14 dup 0
    40. section_table:
    41. dq "section1"
    42. dd SEC_1_VIRT_SIZE,SEC_1_RVA,SEC_1_RAW_SIZE,SEC_1_RAW_OFS
    43. dd 0,0,0,0xE0000040
    44. dq "section2"
    45. dd SEC_2_VIRT_SIZE,SEC_2_RVA,SEC_2_RAW_SIZE,SEC_2_RAW_OFS
    46. dd 0,0,0,0xE0000040
    47. dq "section0"
    48. dd SEC_3_VIRT_SIZE,SEC_3_RVA,SEC_3_RAW_SIZE,SEC_3_RAW_OFS
    49. dd 0,0,0,0xE00000E0
    50. ;============= end of header =========================
    51. db 0x200-$ dup 0 ; FILE ALIGN
    52. org 0x1000
    53. ;============= section 1 begin =======================
    54. EntryPoint:
    55.     use32
    56.     push 0
    57.     call @f ;"PE",0
    58.     db "capt",0
    59. @@: call @f
    60.     db "msg",0
    61. @@: push 0
    62.     call @f
    63.     vUSER32 dd aMessageBoxA,0
    64. @@: pop eax
    65.     call dword[eax]
    66.     ret
    67. ;============= section 1 end =======================
    68. db 0x200-($-$$) dup 0
    69. org 0x2000
    70. ;============= section 2 begin =======================
    71. ;import
    72.     idata dd 0,0,0,aUSER32,vUSER32, 5 dup 0
    73.     aUSER32 db "USER32.DLL",0
    74.     aMessageBoxA db 0,0,"MessageBoxA",0
    75. ;============= section 2 end =======================
    76. db 0x400-($-$$) dup 0  ; FILE ALIGN
    Он работает.
    Только одна проблема, в нем rva entrypoint=4
    А задумывалось что entrypoint будет в 3й секции (rva 0х3004), только хз почему но загрузчик не переносит байты 3й секции из файла в память, а просто заполняет ее нулями.
    Что не так?!
     
  14. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    GoldFinch
    Потому что raw offset 3ей секции - нуль. Такой вот загрузчик. Поставь там единицу или что-то - загрузчик сам выровняет до нуля и нормально погрузит.
     
  15. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    о_О работает же....
    Sol_Ksacap, спасибо
     
  16. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    GoldFinch
    Я сегодня с утра ел вареники с клюквой, потом ещё перекусывал в столовой, а когда домой пришёл, уже обед стоит, так что всё нормально.
     
  17. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    l_inc, ну раз нормально, так нормально. Я когда буду писать свой компилятор обязательно сделаю так чтобы он генерил кошерные файлы, дабы кодеры могли им пользоваться без оглядки на религиозные ограничения. А пока мне проходится пользоваться некошерным фасмом, благо что я не иудей.

    В продолжение темы, если записать код в заголовок файла (не создавая в нем новых секций), и перенаправить туда entrypoint, то это будет работать на любой системе?
     
  18. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    GoldFinch
    :) Некошерность заключается в том, что по слухам разные загрузчики такую ситуацию могут обрабатывать по-разному. :)
    А фасм очень даже ничего. И то, что его можно заставить генерировать от PE с неудачными или невалидными полями до BMP, ему только в плюс.
    Эм... если не учитывать привередливые антивирусы, то на любой 32-битной windows.
     
  19. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    l_inc
    ну а я и не вирус пишу, а если бы и вирус - так надо просто сказать жертве, что файл очень нужный, но вот авирь может ругаться =)
     
  20. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    долеплял линкер один. Если точнее - пытаюсь перевести alef на вынь платформу. В настоящее время компилер алефа пашет, а с рантаймом не все хорошо. большая разница в план9 и вынь процессных/поточных/синхронизационных моделях. кроме того есть разница и в модели объектника и линкера (последние оптимизации и перевод в машкод делает линкер). в тулчейне есть еще С, С++ (не смотрел пока), асм, дебуггер (не смотрел пока), линкер. Кто загорится помочь - велкам. Для просто любопытно посмотреть - сорцы на сайте белл-лабс - план9 и алеф отдельно.

    так вот, наименьшее воспринимаемое всеми выравнивание секций - 200h (диск) и 1000h (образ). Что и понятно, сектор и страница.