Всем привет! Не совсем понимаю, можно ли так делать. Хочу создать голый код, то есть сделать подключение dll прямо в коде, но у меня даже не получается запустить его, выписывает что: "не является приложение win32" Fasm: Код (Text): format PE console 4.0 entry start section '.data' data writeable readable buffer db 'hello world!',0 section '.code' code writeable readable executable start: mov esi, [esp] ;получение адреса где то в kernel32.dll section '.idata' import data readable writeable section '.reloc' fixups data readable discardable А если импортирую библиотеку, и вызываю какую либо функцию, все нормально - запускаеться и отлаживаеться: Код (Text): format PE console 4.0 include 'c:\asma\fasm\INCLUDE\WIN32A.INC' entry start section '.data' data writeable readable buffer db 'hello world!',0 section '.code' code writeable readable executable start: mov esi, [esp] push 0 call [ExitProcess] section '.idata' import data readable writeable library kernel32,'kernel32.dll',\ user32,'user32.dll' import kernel32,\ ExitProcess,'ExitProcess',\ section '.reloc' fixups data readable discardable ???
vadak Windows бракует образы с секциями нулевого размера. В Вашем случае это относится как к фиксапам, так и к импорту. Если добавляете импорт, то соответствующий элемент IAT автоматически упоминается и в секции фиксапов. Точнее все доступы к этому элементу. Т.о. обе секции становятся непустыми. Так должно работать: Код (Text): section '.idata' import data readable writeable rb 4 section '.reloc' fixups data readable discardable rb 4 Ну и проследите, разумеется, чтобы после mov esi, [esp] управление не убежало вникуда. ret хотя бы поставьте.
Спасибо! Теперь ясно. А тогда еще вопрос: не описанные секции программистом, компилятор сам вставлет или они остаются пустыми?
vadak Неописаные — это какие? За пределы описаных секций попадают только такие код/данные, которые расположены перед первой директивой section в исходнике (или все код/данные, если эта директива вообще не используется). Для таких кода/данных fasm создаёт секцию по умолчанию, выставляет ей readable writable executable и называет .flat. Других неописаных секций fasm не делает. Ни пустых, ни заполненых.
l_inc, сделал как вы порекомендовали, теперь код можно загрузить в отладчик, но вот отладить почему то нет. олька выдает access violation по адресу 0x793A87B3, и окно disasm отладчика пустое. Еще пробовал убирать все описатели секций, фасм действительно создает секцию .flat(rwe) где распологаются данные и код вместе: Код (Text): format PE console 4.0 entry start buffer db 'hello world!',0 start: mov esi, [esp] ;получение адреса где то в kernel32.dll Но ситуация аналогична предыдущей тот же access violation в ольке.
vadak 1) Последний совет из поста #3 учтён? Если по первому пункту да, то 2) Вы случайно не под Win2000 экспериментируете?
Mikl___ Ага, благодарю за ссылку, попробую твой пример на фасм переписать l_inc 1) да; 2) да(win2000SP4);
vadak Если импорт образа пуст, то win2k не подгружает автоматически ntdll.dll и kernel32.dll, как это делают все более новые системы. Но юзермодная часть загрузчика расположена как раз в ntdll.dll. Поэтому, когда дело доходит до исполнения юзермодной части, управление передаётся в невыделенную память, где должна находиться ntdll.dll. Отсюда и падение. В общем, по хорошему, в win2k образ должен иметь импорт. По плохому можно либо собственный образ расположить по адресам ntdll.dll либо при запуске перехватывать создание первичного потока и выставлять eip в его контексте в нужное значение. Но это имеет смысл только для win2k. Эти примеры для XP. На других системах работать не будут.
vadak Начальную базу можно получить в Windows Internals Руссиновича. Например, в пятом издании это глава 5.3 Flow of CreateProcess. Там, кстати, указано, что на последней стадии загрузки управление передаётся в юзермодную часть, в ntdll.LdrInitializeThunk, где у Вас, собственно, процесс и рушится. Ну а более подробно из исходников, дизасм-листингов и т.п. Кое-что мне в своё время подробно объяснил diamond.