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

Discussion in 'WASM.BEGINNERS' started by vadak, Oct 23, 2011.

  1. vadak

    vadak New Member

    Blog Posts:
    0
    Joined:
    Nov 21, 2010
    Messages:
    41
    Всем привет!
    Не совсем понимаю, можно ли так делать. Хочу создать голый код, то есть сделать подключение dll прямо в коде, но у меня даже не получается запустить его, выписывает что: "не является приложение win32"
    Fasm:
    Code (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
    А если импортирую библиотеку, и вызываю какую либо функцию, все нормально - запускаеться и отлаживаеться:
    Code (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

    Blog Posts:
    0
    Joined:
    Nov 27, 2008
    Messages:
    28
    убери эту строчку: section '.idata' import data readable writeable
     
  3. l_inc

    l_inc New Member

    Blog Posts:
    0
    Joined:
    Sep 29, 2005
    Messages:
    2,566
    vadak
    Windows бракует образы с секциями нулевого размера. В Вашем случае это относится как к фиксапам, так и к импорту. Если добавляете импорт, то соответствующий элемент IAT автоматически упоминается и в секции фиксапов. Точнее все доступы к этому элементу. Т.о. обе секции становятся непустыми. Так должно работать:
    Code (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

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

    l_inc New Member

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

    vadak New Member

    Blog Posts:
    0
    Joined:
    Nov 21, 2010
    Messages:
    41
    l_inc, сделал как вы порекомендовали, теперь код можно загрузить в отладчик, но вот отладить почему то нет. олька выдает access violation по адресу 0x793A87B3, и окно disasm отладчика пустое. Еще пробовал убирать все описатели секций, фасм действительно создает секцию .flat(rwe) где распологаются данные и код вместе:
    Code (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___ Супермодератор Staff Member

    Blog Posts:
    14
    Joined:
    Jun 25, 2008
    Messages:
    3,914
  8. l_inc

    l_inc New Member

    Blog Posts:
    0
    Joined:
    Sep 29, 2005
    Messages:
    2,566
    vadak
    1) Последний совет из поста #3 учтён?
    Если по первому пункту да, то
    2) Вы случайно не под Win2000 экспериментируете?
     
  9. vadak

    vadak New Member

    Blog Posts:
    0
    Joined:
    Nov 21, 2010
    Messages:
    41
    Mikl___
    Ага, благодарю за ссылку, попробую твой пример на фасм переписать
    l_inc
    1) да;
    2) да(win2000SP4);
     
  10. l_inc

    l_inc New Member

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

    vadak New Member

    Blog Posts:
    0
    Joined:
    Nov 21, 2010
    Messages:
    41
    l_inc
    Если честно, не знал. А где можно про устройство загрузчика почитать?
     
  12. l_inc

    l_inc New Member

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

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

    vadak New Member

    Blog Posts:
    0
    Joined:
    Nov 21, 2010
    Messages:
    41
    l_inc
    Все понятно, спасибо, вопрос закрыт.