2015-04-21 2 views
0

Я пытаюсь запустить процесс из своего кода, Изначально я пробовал вызов функции system(). Как я узнал, что с exec процесс накладывается на двоичный код исполняемый исполняемый файл, затем я попробовал функцию exec().Скрыть имя процесса из списка системных процессов

и поскольку первый аргумент (argv [0]) является именем программы, я намеренно передал «файл данных» в качестве второго параметра. Во время выполнения я проверяю процессы в списке процессов (через ps -e/top), фактическое имя вместо процесса «datafile» отображается в списке процессов !! Есть ли способ скрыть/переименовать имя двоичного файла, запущенного из дочернего процесса?

void main() 
{ 

pid_t pid; 
int status; 
fflush(stdout); 
pid=fork(); 
if(pid<0) 
     exit(3); 
    if(pid==0) 
    { 
    execlp("/usr/bin/top","datafile",NULL); // "datafile" for deceiving the ps -e 
    //system(top); 
    } 
    else 
    { 
    waitpid(pid,&status,0); 
    printf("\nHello %d ",pid); 
    fflush(stdout); 
    exit(0); 
    } 
} 

Когда двоичная выполняется выход является:

Swap: 3998716 total, 165756 used, 3832960 free. 379712 cached Mem 

     PID USER  PR NI VIRT RES SHR S %CPU %MEM  TIME+ COMMAND                            
    3217 user  20 0 196840 12844 8120 S 0.7 0.8 0:09.02 unity-panel-ser            
    3650 user  20 0 320844 11976 7984 S 0.7 0.7 0:03.25 nm-applet              
    7774 user  20 0 5524 1324 936 R 0.7 0.1 0:00.04 top               
     630 message+ 20 0 5440 2016 1028 S 0.3 0.1 0:05.06 dbus-daemon             
     705 root  20 0 54864 4496 3572 S 0.3 0.3 0:05.11 NetworkManager             
    1025 mysql  20 0 326740 10380 1240 S 0.3 0.6 0:14.92 mysqld               
    1129 root  20 0 200856 60132 46616 S 0.3 3.7 5:26.94 Xorg 

Здравствуйте

Здесь "сверху команда" запущена с mycode видна в процессе листинга! My Aim здесь означает, что другие пользователи (включая root) не должны знать, какую команду я запускаю, хотя несколько экземпляров a.out в списке процессов в порядке! I.e. Я ожидаю, что выход:

7774 user  20 0 196840 12844 8120 S 0.7 0.8 0:09.02 ./a.out            
7773 user  20 0 320844 11976 7984 S 0.7 0.7 0:09.01 ./a.out 

Любые подсказки/Помощь будет очень плодотворной.

UPDATE: Пробовал execv:

void main() 
{ 

pid_t pid; 
int status; 
char *newargv[3] = { "neverkillme","www.yahoo.com", NULL }; 
fflush(stdout); 
pid=fork(); 
if(pid<0) exit(3); 
if(pid==0) 
execv("/usr/bin/opera",newargv); 
else 
{ 
waitpid(pid,&status,0); 
printf("\nneverkillme(opera) process's ID %d ",pid); 
fflush(stdout); 
exit(0); 
} 
} 

ВЫВОД: когда я запускаю a.out оперы открытой yahoo.com под новой вкладке; но я могу видеть «оперу», перечисленную в качестве процесса с использованием пса -e

Initially: 
[email protected]:~/Documents/C$ ps -e| grep a.out 
[email protected]:~/Documents/C$ ps -e| grep opera 
[email protected]:~/Documents/C$ ./a.out 
    ** (opera:5248): CRITICAL **: os_bar_hide: assertion 'OS_IS_BAR (bar)' failed (opera:5248): Gtk-CRITICAL **: IA__gtk_widget_hide: assertion 'GTK_IS_WIDGET (widget)' failed 
    ** (opera:5248): CRITICAL **: os_bar_set_parent: assertion 'OS_IS_BAR (bar)' failed 
    ** (opera:5248): CRITICAL **: os_bar_hide: assertion 'OS_IS_BAR (bar)' failed (opera:5248): Gtk-CRITICAL **: IA__gtk_widget_hide: assertion 'GTK_IS_WIDGET (widget)' failed 
    ** (opera:5248): CRITICAL **: os_bar_set_parent: assertion 'OS_IS_BAR (bar)' failed 
    ** (opera:5248): CRITICAL **: os_bar_hide: assertion 'OS_IS_BAR (bar)' failed (opera:5248): Gtk-CRITICAL **: IA__gtk_widget_hide: assertion 'GTK_IS_WIDGET (widget)' failed 
    ** (opera:5248): CRITICAL **: os_bar_set_parent: assertion 'OS_IS_BAR (bar)' failed 
    ** (opera:5248): CRITICAL **: os_bar_hide: assertion 'OS_IS_BAR (bar)' failed (opera:5248): Gtk-CRITICAL **: IA__gtk_widget_hide: assertion 'GTK_IS_WIDGET (widget)' failed 
    ** (opera:5248): CRITICAL **: os_bar_set_parent: assertion 'OS_IS_BAR (bar)' failed 
    ** (opera:5248): CRITICAL **: os_bar_hide: assertion 'OS_IS_BAR (bar)' failed (opera:5248): Gtk-CRITICAL **: IA__gtk_widget_hide: assertion 'GTK_IS_WIDGET (widget)' failed 
    ** (opera:5248): CRITICAL **: os_bar_set_parent: assertion 'OS_IS_BAR (bar)' failed 

    neverkillme(opera) process's ID 5248 

[email protected]:~/Documents/C$ ps -e| grep opera 
5248 pts/24 00:00:01 opera 
[email protected]:~/Documents/C$ ps -e| grep a.out 
5247 pts/24 00:00:00 a.out 

ответ

1

Не уверен, кто вы пытаетесь замарать здесь ;-), но ответ на ваш вопрос заключается в использовании execv(). Первый аргумент - это путь исполняемого файла для фактического запуска, а второй аргумент - массив argv [], который получит программа. Если вы измените свой argv [0], ваше значение будет отображаться в top/ps вместо реального имени программы. Например:

#include <unistd.h> 

int main(int argc, char **argv) { 
    char *newargv[4] = { "hi mom!", "-d", "60", NULL }; 

    execv("/usr/bin/top", newargv); 
} 

и вы можете проверить это:

$ ps ax | grep mom 
26564 pts/10 S+  0:00 hi mom! -d 60 
26573 pts/9 S+  0:00 grep mom 
+0

я пытался ваше решение, оно не работает! –

+1

Можете ли вы объяснить, каким образом он не работает? Это, безусловно, работает для меня в коробке Red Hat Linux. –

+0

Opera, вероятно, устанавливает свой собственный argv [0] или запускает подпроцесс с фактическим именем. Если это так, вы ничего не можете с этим поделать. Но попробуйте его с более простой командой, такой как «верх», и вы увидите, что работает базовая техника. –

Смежные вопросы