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

Тема в разделе "WASM.WIN32", создана пользователем QuAzI, 13 дек 2005.

  1. QuAzI

    QuAzI New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    26
    Адрес:
    Belarus
    народ, что за нафиг.

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

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

    fasm 1.64
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Давая я угадаю, ты в windows2000 сидишь?

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

    QuAzI New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    26
    Адрес:
    Belarus
    млин... единственные винды, которые я переношу - 98.

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

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

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

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    ааа, ну в 98 ты и не такое встретишь :)

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

    QuAzI New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    26
    Адрес:
    Belarus
    ой... блин... ценитель нашелся...

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

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

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

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



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

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Да.





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



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

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    В последнее время вынужденно перешел на XP(sp2), т.к.

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



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



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

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




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

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    bogrus

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

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    IceStudent



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

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

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

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

    bogrus Active Member

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

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    кста, bogrus, какую там АПИ лучше всего захучить

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

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

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

    bogrus Active Member

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

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    ясно

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

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Понятно.
     
  17. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




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

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    нет, фасм не создает, он создает только секцию, но в хидере видимо директория не прописана



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



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

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Релоки ведь не обязаны быть в отдельной секции?, в 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 работает
    Код (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

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine