fasm dll & отсутствие релоков

Discussion in 'WASM.WIN32' started by QuAzI, Dec 13, 2005.

  1. QuAzI

    QuAzI New Member

    Blog Posts:
    0
    народ, что за нафиг.

    не могу на фасме сделать пустую DLL.

    если делаю хоть один вызов на АПИ, то всё ок иначе библа не хочет подгружаться.

    fasm 1.64
     
  2. Ms Rem

    Ms Rem New Member

    Blog Posts:
    0
    Давая я угадаю, ты в windows2000 сидишь?

    Это особенность системы такая, что в импортах должна быть хотя-бы одна длл.
     
  3. QuAzI

    QuAzI New Member

    Blog Posts:
    0
    млин... единственные винды, которые я переношу - 98.

    кстати, импорт я заполняю...

    фишка именно в самом вызове АПИ...

    если не вызвал, то не вашет, даже если импорт/экспорт инициализировал...
     
  4. Ms Rem

    Ms Rem New Member

    Blog Posts:
    0
    ааа, ну в 98 ты и не такое встретишь :)

    Имхо эта система написана настолько криво, что удивительно что она вобще работает.
     
  5. QuAzI

    QuAzI New Member

    Blog Posts:
    0
    ой... блин... ценитель нашелся...

    единственная ось, которая пашет, у мелкософта...

    нефиг гнать на винды, если ты не знаешь, почему библа не пашет... все нормально созданные библы, на других языках, пашут...

    возможно просто fasm не создает секцию импорта, если АПИ не вызываются ни разу... так скть, за ненадобностью...

    и нефиг топик перемещать...



    тож мне... раз 98, то не значит, что начинающий...
     
  6. IceStudent

    IceStudent Active Member

    Blog Posts:
    0


    Да.





    Не из-за 98й (тут Asterix её любит например), а из-за вопроса. Сам бы мог глянуть на структуру PE в этой DLL - увидел бы, что нет записей в импорте.



    <font color="red]вернул на Win32</font><!--color-->
     
  7. Asterix

    Asterix New Member

    Blog Posts:
    0
    В последнее время вынужденно перешел на XP(sp2), т.к.

    под новое железо нет дров для win98 %)



    masm, в таком случае, секцию импорта тоже не создает, но это не мешает DLL грузиться :derisive:



    сдается мне что проблема с релоками
     
  8. Asterix

    Asterix New Member

    Blog Posts:
    0
  9. bogrus

    bogrus Active Member

    Blog Posts:
    0




    да, это баг, фасм их тоже не создает если в коде не используются абсолютные адреса, т.е. добавление mov eax,$ решает проблему, а импорт для dll в w2k не обязателен
     
  10. IceStudent

    IceStudent Active Member

    Blog Posts:
    0
    bogrus

    Какой же это баг? А что релоцировать, если нет адресов?
     
  11. Asterix

    Asterix New Member

    Blog Posts:
    0
    IceStudent



    при тех же условиях у масм не возникает проблем

    должна быть директория релоков в любом случае,

    масм ее создает пустую но она есть

    у фасма ее нет, отсюда и баг
     
  12. bogrus

    bogrus Active Member

    Blog Posts:
    0
    Видимо есть, загрузчик сообщает Message=Debug string: LDR: Fixups unsuccessfully re-applied @ 140000, где 0x00140000 это адрес по которому хотела винда загрузить dll (её imagebase 0x00400000 занят)
     
  13. Asterix

    Asterix New Member

    Blog Posts:
    0
    кста, bogrus, какую там АПИ лучше всего захучить

    чтоб Олли дебажные строки загрузчика показывал,

    т.е. когда винда будет проверять что показвать ей или нет

    чтоб подсунуть нужное во флагах
     
  14. bogrus

    bogrus Active Member

    Blog Posts:
    0
    Сперва ntdll копирует NtGlobalFlag в свою переменную (в секции data), потом тупо сверяет каждый раз
    Code (Text):
    1. cmp byte[var],0
    2. jnz DebugPrint
    Т.е. чтоб их ловить у меня в реестре для test.exe стоит NtGlobalFlag = 0x2, а в олли включен break на Debug string и когда надо я просто переименовываю любую прогу в test.exe и запускаю - тогда автоматом стартует олли и ловит все строки для этой проги
     
  15. Asterix

    Asterix New Member

    Blog Posts:
    0
    ясно

    сегодня какой-то странный день, на форуме фасма полный штиль
     
  16. IceStudent

    IceStudent Active Member

    Blog Posts:
    0


    Понятно.
     
  17. bogrus

    bogrus Active Member

    Blog Posts:
    0




    Хотя таки и не обязательно, если imagebase не занят, то винда загрузит такую dll даже с пустыми релоками (фасм их создает! но пустые, т.ч. может и не совсем баг)
     
  18. Asterix

    Asterix New Member

    Blog Posts:
    0
    нет, фасм не создает, он создает только секцию, но в хидере видимо директория не прописана



    а вот масм как раз создает секцию и прописывает в заголовок директорию



    достаточно попробовать просмотреть директорию релоков в PETools чтоб убедится
     
  19. bogrus

    bogrus Active Member

    Blog Posts:
    0
    Релоки ведь не обязаны быть в отдельной секции?, в PE_header.OptionalHeader.Data_Directories.Relocation_Table фасм запись делает об их присутствии! (см. в PEexplorer, ставит RVA, но размер ставит 0) и это работает если imagebase не занят



    А если занят то dll грузится(мапится) по новому адресу, например 0x00140000 потом вызывается ntdll.RtlImageDirectoryEntryToData(релоки) и если размер не 0 (иначе ошибка) то вызов LdrProcessRelocationBlock для обработки первой записи (если её нет, то тоже ошибка)



    Масм пишет LINK : fatal error LNK1272: cannot merge '.reloc' with any section, т.е. для релоков создает отдельную секцию и записывает в неё одну запись, вот такая dll работает
    Code (Text):
    1. ;=================================
    2. format      pe gui dll
    3. entry       start
    4. include     '%fasminc%\win32a.inc'
    5. ;=================================
    6. start:      xor     eax,eax
    7.             inc     eax
    8.             ret     0x0c
    9. ;=================================
    10. data        fixups
    11.             dd 0,8
    12. end         data
    13. ;=================================
    Короче надо порытся в MSPECOFF.pdf как правильно быть с отдельной секцией и записью
     
  20. bogrus

    bogrus Active Member

    Blog Posts:
    0