|
Системный вызов execve() ( его номер 11 ) выполняет подмену текущего процесса программой, путь до которой указан в первом параметре,без возврата обратно.
В системный вызов передается 3 параметра, первый - полное имя программы,то есть с путем до нее,
, второй - массив аргументов, причем если аргументы есть, то нулевой элемнт этого массива - имя программы, а далее аргументы, последний аргумент обязательно 0, и третий параметр - массив окружения,
заканчиваться должен тоже 0. В нашем примере нет ни аргументов ни окружения, поэтому второй и третий параметры у нас равны нулю.
.data
path:         # тут у нас путь до вызываемой программы
.string "faily"         # я выбрал программу из примера
msg1:         # работы с файлами, написал только имя, т. к. у меня она в том же каталоге
.ascii "\n \n I am child proc, i will a new another programm \n \n"
len1=.-msg1
msg2:         # тут сообщения наших процессов
.ascii "\n \n Hello, world! i am parent proc!\n \n "
len2 = . - msg2
.text
.global _start
_start:
movl $2,%eax         # разделяем на 2 процесса
int $0x80
testl %eax,%eax         # проверка на 0
jz _middle         # если ноль, то мы в дочернем процессе
movl $len2,%edx         # если нет, то в родительском
movl $msg2,%ecx         # выводим сообщение родителя
movl $1,%ebx
movl $4,%eax
int $0x80
_exit:         # выход
movl $0,%ebx
movl $1,%eax
int $0x80
_middle:
movl $len1,%edx         # дочерний процесс, выводим сообщение
movl $msg1,%ecx         # о замене на другую программу
movl $1,%ebx
movl $4,%eax
int $0x80
movl $0,%edx         # подменяем процесс, окружение = 0
movl $0,%ecx         # аргументы = 0
movl $path,%ebx         # путь до программы
movl $11,%eax         # вызов ядра
int $0x80         # подменили!
jmp _exit         # если подмена не удалась, то прыгаем на выход
# ВСЕ!
Непосредственно вводимый код выделен фиолетовым цветом , все остальное(зеленым) - комментарии.
Компилируем так
as -o podmena.o podmena.s
ld -s -o podmena podmena.o
скачать архив с исходным кодом и исполняемым файлом этого примера
tar.gz
zip
С уважением Pauk_pv ©
|