Сейчас на форуме: Magister Yoda, rtsgreg1989 (+7 невидимых)

 eXeL@B —› Основной форум —› Методы антиотладки в Linux, один пример.
Посл.ответ Сообщение

Ранг: 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.10
Статус: Участник
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.150
Статус: Участник
retired

Создано: 21 апреля 2005 13:51
· Личное сообщение · #4

наверное это просто проверка, дебажит ли кто-нибудь уже, или нет



Ранг: 0.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 апреля 2005 14:41
· Личное сообщение · #5

ssx
>> наверное это просто проверка, дебажит ли кто-нибудь уже, или нет
Это Вы о чём? Кто кого дебажит?



Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
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'у процесса-деда (т.е. отладчика либо шелла). То есть никак не самого себя. Более того, результат вызова - _не_проверяется_ никак. Зачем тогда делать вызов?


 eXeL@B —› Основной форум —› Методы антиотладки в Linux, один пример.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати