Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 551
от 20.09.2006, 19:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 352, Экспертов: 39
В номере:Вопросов: 1, Ответов: 3


Вопрос № 55538: Здравствуйте ! Не подскажете как можно на асме запустить файл ? Если можно без WinAPI....

Вопрос № 55.538
Здравствуйте ! Не подскажете как можно на асме запустить файл ? Если можно без WinAPI.
Отправлен: 15.09.2006, 14:54
Вопрос задал: Whiteman (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Whiteman!
А чем не угодило WinAPI? Если без WinAPI, то это как? Даже интересно стало...
В Windows все взаимодействие с системой идет через вызов соответствующего API.
А запустить можно, например, так:

open db 'open',0
FName db 'somefile.exe',0

invoke ShellExecute, NULL, addr open, addr FName, NULL, NULL, SW_SHOW

---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 15.09.2006, 16:32

Отвечает: mix_mix
Здравствуйте, Whiteman!
Без ВинАпи можно, но тогда Ваша программа будет сильно привязана к Вашей ОС.
В таблице KiSystemService есть функция NtCreateProcess. Чтобы ее вызвать без ВинАпи, надо поместить параметры в память (например в стек), затем поместить в edx указатель на параметры, в eax номер функции, и, наконец, сгенерировать прерывание 2Eh (в WinXP вместо int 2Eh, используется команда процессора sysenter; если Ваш ассемблер не поддерживает ее, то исп. db 0Fh, 34h):
push xxx
...
mov edx, esp
mov eax, 2fh ; <- только для XP; в 2000 и 2003 уже работать не будет :(
sysenter ; или int 2Eh
Конечно, так можно писать, да и скорость вып. кода повысится (на совсем чуть-чуть), но программа становится полностью аппартно-зависимая, полностью непереносимая, т.к. порой номера функций различаются в разных версиях Win (например, WinXP SP1 и SP2).
Да и писать так (а особенно отлаживать) адски сложно, уж поверьте :)
Да, и кстати, чтобы вначале создать процесс таким образом, необходимо использовать функции NtCreateFile, NtCreateSection, NtMapViewOfSection (именно в таком порядке).
Удачи!

Приложение:

Ответ отправил: mix_mix (статус: 7-ой класс)
Ответ отправлен: 15.09.2006, 17:32

Отвечает: Олег Владимирович
Здравствуйте, Whiteman!

Прерывание 21h имеет функцию запуска программы. Её номер AH=4Bh. При этом для загрузки и выполнения программы надо выбрать подфункцию AL=00h. (Есть ещё возможность загрузить программу, не выполняя, или загрузить оверлей)

Что касается параметров:
DS:DX - адрес ASCIIZ-строки с именем программы, включая путь.
ES:BX - адрес области параметров загрузки. Эта область представляет собой следующее:
ES:BX - слово - адрес блока среды процесса(куда загружать выполняемую программу)
ES:BX+2 - двойное слово - адрес командной строки(точнее, того, что от неё осталось: если в DOS вы набирали бы "f.exe somepar", то в здешней командной строке должно быть только "?somepar", причём ? - байт со значением длины строки, в данном случае 07h)
ES:BX+6 - двойное слово - адрес блока управления файлом 1 (10h байт памяти)
ES:BX+0Ah - двойное слово - адрес блока управления файлом 2 (10h байт памяти)

Результат: CF=1- ошибка (самая распространённая - 8 - not enough memory).

То, с каким кодом выхода завершилась программа (что было в AL при вызове INT 21h с AH=4Ch) можно просмотреть функцией 4Dh, возвращающей код завершения в AX.
Стандартные коды - 0 - всё нрмально, 1 - выход по Ctrl-Break, 2 - по критической ошибке, 3 - terminate but stay resident

Удачи в дополнительном исследовании!
---------
Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: 3-ий класс)
Ответ отправлен: 15.09.2006, 19:43
Оценка за ответ: 5


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.36 от 06.09.2006
Яндекс Rambler's Top100

В избранное