более прокаченная версия приема может использовать отладочные регистры в кач-ве регистров общего назначения, тем самым лишая возможности установки хардварных бряков в обычных отладчиках.
я писал, что надо линковать следующим образом: ld -N hello.o -o hello опция -N указывает линковщику, что создавать загружаемый сегмент нужно с правами RWE. Можно и ручками в любом hex-редакторе подправить. 1 Код (Text): .global _start _start: movl $26,%eax movl $0,%ebx int $0x80 cmpl $(-1),%eax je debug xorl %eax,%eax incl %eax int $0x80 debug: xorl %eax,%eax incl %eax movl $0x29a,%ebx int $0x80
ясно)во твой код мне напомнил Код (Text): foo_beg(){//na etu funkciyu ne postavit brak} foo_end(){} int main(){ int a; unsigned char *p; a=0; for(p=(unsigned char*)foo_beg;p<(unsigne char*)foo_end;p++) a+=*p; if(a!=MY_CRC) printf("gdb detect\"); return 0; }
кстати почему этот код под отладчиком нормально пашет? Код (Text): #include <stdio.h> #include <sys/ptrace.h> #include <signal.h> int main(){ pid_t pid; int status; switch(pid=fork()){ case 0: ptrace(PTRACE_TRACEME); printf("sekret\n"); exit(1); case -1: perror("fork"); exit(1); default: if(ptrace(PTRACE_ATTACH,pid)){kill(pid,SIGKILL);exit(1);} while(waitpid(pid,&status,0)!=-1) ptrace(PTRACE_CONT,pid,0,0);exit(0); } return 0; }
Mecid Эта прога создает новый дочерний процесс. Я думаю, что чтобы она сработала, gdb должен отлаживать именно этот дочерний процесс, а не родителя. Поставь паузу после создания нового процесса, чтобы в gdb ты смог начать его отлаживать. Или поменяй процессы местами - пусть не отец отлаживает ребенка, а ребенок - отлаживает отца.