Вопрос № 55538: Здравствуйте ! Не подскажете как можно на асме запустить файл ? Если можно без WinAPI....
Вопрос № 55.538
Здравствуйте ! Не подскажете как можно на асме запустить файл ? Если можно без WinAPI.
Отправлен: 15.09.2006, 14:54
Вопрос задал: Whiteman (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Whiteman!
А чем не угодило WinAPI? Если без WinAPI, то это как? Даже интересно стало...
В Windows все взаимодействие с системой идет через вызов соответствующего API.
А запустить можно, например, так:
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 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 байт памяти)
То, с каким кодом выхода завершилась программа (что было в AL при вызове INT 21h с AH=4Ch) можно просмотреть функцией 4Dh, возвращающей код завершения в AX.
Стандартные коды - 0 - всё нрмально, 1 - выход по Ctrl-Break, 2 - по критической ошибке, 3 - terminate but stay resident
Удачи в дополнительном исследовании!
--------- Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: 3-ий класс)
Ответ отправлен: 15.09.2006, 19:43 Оценка за ответ: 5