компиляция без импорта

Тема в разделе "WASM.BEGINNERS", создана пользователем vadak, 23 окт 2011.

  1. vadak

    vadak New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2010
    Сообщения:
    41
    Всем привет!
    Не совсем понимаю, можно ли так делать. Хочу создать голый код, то есть сделать подключение dll прямо в коде, но у меня даже не получается запустить его, выписывает что: "не является приложение win32"
    Fasm:
    Код (Text):
    1. format PE console 4.0
    2. entry start
    3. section '.data' data writeable readable
    4. buffer db 'hello world!',0
    5. section '.code' code writeable readable executable
    6. start:
    7.     mov esi, [esp] ;получение адреса где то в kernel32.dll
    8. section '.idata' import data readable writeable
    9. section '.reloc' fixups data readable discardable
    А если импортирую библиотеку, и вызываю какую либо функцию, все нормально - запускаеться и отлаживаеться:
    Код (Text):
    1. format PE console 4.0
    2. include 'c:\asma\fasm\INCLUDE\WIN32A.INC'
    3. entry start
    4. section '.data' data writeable readable
    5. buffer db 'hello world!',0
    6. section '.code' code writeable readable executable
    7. start:
    8.     mov esi, [esp]
    9.         push 0
    10.         call [ExitProcess]
    11. section '.idata' import data readable writeable
    12. library kernel32,'kernel32.dll',\
    13.     user32,'user32.dll'
    14. import kernel32,\
    15.     ExitProcess,'ExitProcess',\
    16. section '.reloc' fixups data readable discardable
    ???
     
  2. xyz

    xyz New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2008
    Сообщения:
    28
    убери эту строчку: section '.idata' import data readable writeable
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    vadak
    Windows бракует образы с секциями нулевого размера. В Вашем случае это относится как к фиксапам, так и к импорту. Если добавляете импорт, то соответствующий элемент IAT автоматически упоминается и в секции фиксапов. Точнее все доступы к этому элементу. Т.о. обе секции становятся непустыми. Так должно работать:
    Код (Text):
    1. section '.idata' import data readable writeable
    2. rb 4
    3. section '.reloc' fixups data readable discardable
    4. rb 4
    Ну и проследите, разумеется, чтобы после mov esi, [esp] управление не убежало вникуда. ret хотя бы поставьте.
     
  4. vadak

    vadak New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2010
    Сообщения:
    41
    Спасибо! Теперь ясно. А тогда еще вопрос: не описанные секции программистом, компилятор сам вставлет или они остаются пустыми?
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    vadak
    Неописаные — это какие? За пределы описаных секций попадают только такие код/данные, которые расположены перед первой директивой section в исходнике (или все код/данные, если эта директива вообще не используется). Для таких кода/данных fasm создаёт секцию по умолчанию, выставляет ей readable writable executable и называет .flat. Других неописаных секций fasm не делает. Ни пустых, ни заполненых.
     
  6. vadak

    vadak New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2010
    Сообщения:
    41
    l_inc, сделал как вы порекомендовали, теперь код можно загрузить в отладчик, но вот отладить почему то нет. олька выдает access violation по адресу 0x793A87B3, и окно disasm отладчика пустое. Еще пробовал убирать все описатели секций, фасм действительно создает секцию .flat(rwe) где распологаются данные и код вместе:
    Код (Text):
    1. format PE console 4.0
    2. entry start
    3. buffer db 'hello world!',0
    4. start:
    5.     mov esi, [esp] ;получение адреса где то в kernel32.dll
    Но ситуация аналогична предыдущей тот же access violation в ольке.
     
  7. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    vadak
    1) Последний совет из поста #3 учтён?
    Если по первому пункту да, то
    2) Вы случайно не под Win2000 экспериментируете?
     
  9. vadak

    vadak New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2010
    Сообщения:
    41
    Mikl___
    Ага, благодарю за ссылку, попробую твой пример на фасм переписать
    l_inc
    1) да;
    2) да(win2000SP4);
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    vadak
    Если импорт образа пуст, то win2k не подгружает автоматически ntdll.dll и kernel32.dll, как это делают все более новые системы. Но юзермодная часть загрузчика расположена как раз в ntdll.dll. Поэтому, когда дело доходит до исполнения юзермодной части, управление передаётся в невыделенную память, где должна находиться ntdll.dll. Отсюда и падение. В общем, по хорошему, в win2k образ должен иметь импорт. По плохому можно либо собственный образ расположить по адресам ntdll.dll либо при запуске перехватывать создание первичного потока и выставлять eip в его контексте в нужное значение. Но это имеет смысл только для win2k.
    Эти примеры для XP. На других системах работать не будут.
     
  11. vadak

    vadak New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2010
    Сообщения:
    41
    l_inc
    Если честно, не знал. А где можно про устройство загрузчика почитать?
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    vadak
    Начальную базу можно получить в Windows Internals Руссиновича. Например, в пятом издании это глава 5.3 Flow of CreateProcess. Там, кстати, указано, что на последней стадии загрузки управление передаётся в юзермодную часть, в ntdll.LdrInitializeThunk, где у Вас, собственно, процесс и рушится.

    Ну а более подробно из исходников, дизасм-листингов и т.п. Кое-что мне в своё время подробно объяснил diamond.
     
  13. vadak

    vadak New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2010
    Сообщения:
    41
    l_inc
    Все понятно, спасибо, вопрос закрыт.