Посл.ответ |
Сообщение |
Ранг: 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 и т.д. - а теперь чуствую себя опять зелёным новичком.
| Сообщение посчитали полезным: |
|
![](img/s5.gif) Ранг: 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
>> наверное это просто проверка, дебажит ли кто-нибудь уже, или нет
![](img/smilies/s11.gif) Это Вы о чём? Кто кого дебажит?
| Сообщение посчитали полезным: |
Ранг: 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'у процесса-деда (т.е. отладчика либо шелла). То есть никак не самого себя. Более того, результат вызова - _не_проверяется_ никак. Зачем тогда делать вызов?
| Сообщение посчитали полезным: |