| Посл.ответ | 
Сообщение | 
 Ранг: 0.0 (гость) Активность: 0=0 Статус: Участник 
 
 | 
Создано: 21 апреля 2005 12:00   · Личное сообщение ·  #1 
В последнее время много приходиться читать статей по защите ПО в *nix-среде (есть и собственные наработки по этому вопросу). Вот в одной из таких статей http://reactor-core.org/worms-for-fun-and-profit.html  нашёл странный код: 
 void kill_debug(void) {
   int x,n;
   n=getppid();
   if (!(x=fork())) {
     x=getppid();
     if (ptrace(PTRACE_ATTACH,x,0,0)) {
       fprintf(stderr,
           "\n\n\n*****************************************\n"
                 "*** I REALLY DO NOT LIKE TO BE TRACED ***\n"
                 "*****************************************\n\n\n");
       ptrace(PTRACE_ATTACH,n,0,0);
       kill(x,9);
     }
     usleep(1000);
     ptrace(PTRACE_DETACH,x,0,0);
     exit(0);
   }
   waitpid(x,&n,0);
   return;
 }
Вопрос у меня вот какой: зачем используется вызов  ptrace(PTRACE_ATTACH,n,0,0); в данном фрагменте? Я очень бы хотел услышать комментарии по этому поводу. Мне казалось, что я немного уже разобрался в вызовах ptrace и т.д. - а теперь чуствую себя опять зелёным новичком.
   | Сообщение посчитали полезным:  | 
 | 
  Ранг: 199.6 (ветеран), 12thx Активность: 0.1↘0 Статус: Участник www.uinc.ru 
 
 | 
Создано: 21 апреля 2005 12:18   · Личное сообщение ·  #2 
Эээ, никогда не интересовался убогими пингвиновскими поделками, так что могу соврать.
 Но если не ошибаюсь, то getppid() в случае нахождения под отладкой возвращает идентификатор
 не текущего процесса, а процесса-хозяина, который тебя отлаживает. ptrace() в свою очередь
 не может аттачиться к собственному процессу, потому если ptrace() не вернул ошибку,
 подключаясь к результату getppid() то значит нас кто-то отлаживает. Помойму так.
   | Сообщение посчитали полезным:  | 
 Ранг: 0.0 (гость) Активность: 0=0 Статус: Участник 
 
 | 
Создано: 21 апреля 2005 12:46   · Личное сообщение ·  #3 
Кхм. Попробую объяснить, в чём моё недоумение.
 void kill_debug(void) {
   int x,n;
   //в n сейчас записывается папа текущего процесса.
   //возможно - это bash(sh). возможно - отладчик.
   n=getppid();
   //делаем сына, который выполнит проверку
   if (!(x=fork())) {
     //берём в x pid папы - процесса, который мы защищаем от отладки
     x=getppid();
     //говорим, что мы будем отлаживать папу.
     if (ptrace(PTRACE_ATTACH,x,0,0)) {
       //если получили ошибку, значит, возможно, папу УЖЕ кто-то отлаживает
       //тогда ругаемся
       fprintf(stderr,
           "\n\n\n*****************************************\n"
                 "*** I REALLY DO NOT LIKE TO BE TRACED ***\n"
                 "*****************************************\n\n\n");
       //??? WTF ??? Начинаем отлаживать отладчик ??? Посылаем СТОП отладчику??? Чего за...?
       ptrace(PTRACE_ATTACH,n,0,0);
       //убиваем папу.
       kill(x,9);
     }
     //спим - папа тожде спит (он получил SIGSTOP, между прочим) 
     usleep(1000);
     //отпускаем папу
     ptrace(PTRACE_DETACH,x,0,0);
     //уходим, папа будет ждать нашего завершения 
     exit(0);
   }
   //ждём выполнения сына-проверяльщика
   waitpid(x,&n,0);
   //всё нормально, выходим 
   return;
 }
Так вот. Зачем мы цепляемся к системе/отладчику через  ptrace(PTRACE_ATTACH,n,0,0); ? Это попытка его завесить, что ли?
   | Сообщение посчитали полезным:  | 
 Ранг: 352.4 (мудрец), 4thx Активность: 0.15↘0 Статус: Участник retired 
 
 | 
Создано: 21 апреля 2005 13:51   · Личное сообщение ·  #4 
наверное это просто проверка, дебажит ли кто-нибудь уже, или нет
   | Сообщение посчитали полезным:  | 
 Ранг: 0.0 (гость) Активность: 0=0 Статус: Участник 
 
 | 
Создано: 21 апреля 2005 14:41   · Личное сообщение ·  #5 
ssx
>> наверное это просто проверка, дебажит ли кто-нибудь уже, или нет
   Это Вы о чём? Кто кого дебажит?
   | Сообщение посчитали полезным:   | 
 Ранг: 352.4 (мудрец), 4thx Активность: 0.15↘0 Статус: Участник retired 
 
 | 
Создано: 21 апреля 2005 14:49   · Личное сообщение ·  #6 
ptrace(PTRACE_ATTACH,n,0,0); - я так понял, это ptrace самого себя. если вызов не прошел, значит уже дебажат
   | Сообщение посчитали полезным:  | 
 Ранг: 0.0 (гость) Активность: 0=0 Статус: Участник 
 
 | 
Создано: 21 апреля 2005 14:58   · Личное сообщение ·  #7 
ssx
В том месте, где вызывается  ptrace(PTRACE_ATTACH,n,0,0); n равен pid'у процесса-деда (т.е. отладчика либо шелла). То есть никак не самого себя. Более того, результат вызова - _не_проверяется_ никак. Зачем тогда делать вызов?
   | Сообщение посчитали полезным:   |