Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Проектирование экзоскелета. Монография

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
181
if (tmp[0]) { be_silent=1; if (wri) modify_lasti(q,b2,0,0,0); be_silent=0; return; }
// Hmm, look for unspecific stuff - is this a buffer? Or a map?
if (miau) { me=lookup_mem(q); if (me) { snprintf(tmp,MAXDESCR,"* %s buffer~%x\n",wri?"WRITE":"READ", me->addr); append_wlog(tmp); be_silent=1; if (wri) modify_lasti(q,b2,0,0,0); be_silent=0; return; } if (!me) ma=lookup_map(q); if (ma) { snprintf(tmp,MAXDESCR,"* %s map~%x:%d
(%s)\n",wri?"WRITE":"READ",
ma->addr,ma->len,ma->descr); append_wlog(tmp); be_silent=1; if (wri) modify_lasti(q,b2,0,0,0); be_silent=0; return; } }
182
// Last resort: try do determine where does it point on stack, if // it does point there.
if (miau==2) { int i; for (i=1;i<=current->fntop;i++) {
if (q >= current->frstart[i]) if (q < current->frend[i]) { // Wow, something local.
sprintf(tmp,"* %s stack of fcnt_%d (%d down)\n",wri?"WRITE":"READ", current->fnid[i],current->fntop-i);
append_wlog(tmp); be_silent=1; if (wri) modify_lasti(q,b2,0,0,0); be_silent=0; return;
}
}
}
fatal("brain damage",0); return;
}
183
/*************** * Describe fd * ***************/
static inline void add_fd_pdescr(const int fd) { char tmp[MAXDESCR];
if (T_nodesc) return;
if ((fd<0) || (fd>=current->fdtop)) { char buf[100]; sprintf(buf,"/proc/%d/fd/%d",current->pid,fd); if (fd==0 || fd==1 || fd==2 ||!access(buf,F_OK)) { char b[1024]; bzero(b,sizeof(b)); readlink(buf,b,1000); sprintf(tmp,"+ fd %d: \"%s\", origin unknown\n",fd,b); nappend(pdescr,tmp,MAXPDESC); unknown_filedes(fd,b); } return; }
if (!((*current->fd)[fd].name)) { char buf[100]; sprintf(buf,"/proc/%d/fd/%d",current->pid,fd); if (fd==0 || fd==1 || fd==2 || !access(buf,F_OK)) { char b[1024]; bzero(b,sizeof(b)); readlink(buf,b,1000); sprintf(tmp,"+ fd %d: \"%s\", origin unknown\n",fd,b);
184
nappend(pdescr,tmp,MAXPDESC); unknown_filedes(fd,b); } return; }
sprintf(tmp,"+ fd %d: \"%s\", %s\n",fd,(*current->fd)[fd].name, (*current->fd)[fd].descr);
nappend(pdescr,tmp,MAXPDESC);
// What are you looking for here, you poor little lost soul? // But since you're already here, what would you say for a // little trivia? http://lcamtuf.coredump.cx/simple.txt :-)
}
inline char* get_fddescr(const int fd) { char tmp[MAXDESCR]; static char ret[MAXDESCR];
ret[0]=0;
if ((fd<0) || (fd>=current->fdtop) || !((*current->fd)[fd].name)) { char buf[100]; sprintf(buf,"/proc/%d/fd/%d",current->pid,fd); if (fd==0 || fd==1 || fd==2 || !access(buf,F_OK)) { char b[1024]; bzero(b,sizeof(b)); readlink(buf,b,1000); sprintf(tmp,"+ fd %d: \"%s\", origin unknown\n",fd,b); nappend(ret,tmp,MAXPDESC);
185
return ret; } return ""; }
sprintf(tmp,"+ fd %d: \"%s\", %s\n",fd,(*current->fd)[fd].name, (*current->fd)[fd].descr);
nappend(ret,tmp,MAXPDESC); return ret;
}
/**************** * Get filename * ****************/
static inline char* get_fname(const int fd) {
if ((fd<0) || (fd>=current->fdtop)) return "<unknown>";
if (!(*current->fd)[fd].name) return "<unknown>";
return (*current->fd)[fd].name;
}
/**************** * Write pdescr * ****************/
186
static inline void dump_pdescr(const int ind) { char *x=pdescr, *old;
if (!pdescr[0]) return; if (T_nodesc) return;
while ((x=strchr(old=x,'\n'))) { indent(ind); *x=0; debug("%s\n",old); x++; }
RD();
}
/************** * Write wlog * **************/
static inline void dump_memchg(const int ind) { char *x=current->wlog[current->fntop], *old,*y;
if (!x) return; if (T_nodesc) return;
indent(ind); debug("// function has accessed non-local memory:\n"); RD();
187
while ((x=strchr(old=x,'\n'))) { indent(ind); *x=0; if ((y=strchr(old,'~'))) { unsigned int addr; if (*(y-1)==' ') *y='('; else *y=' '; if (sscanf(y+1,"%x",&addr)==1) Xv(addr); } debug("%s\n",old); dump_pdescr(ind); x++; }
free(current->wlog[current->fntop]); current->wlog[current->fntop]=0;
}
/********************************* * Read stack and display params * *********************************/
static inline void display_fparams(unsigned int esP,int pcnt,const
char* where) {
int i; unsigned int q; RD(); for (i=0;i<pcnt;i++) { q=ptrace(PTRACE_PEEKDATA,pid,esP+4*i,0); display_value(q,where); if (i!=pcnt-1) debug(", ");
188
} }
static inline void warn_opt(int d, int p) { if (d!=p) { current->bopt++; if (!current->Owarn) { current->Owarn=1; debug(""
"**********************************************************\n"
"* This function is supposed to have different number of *\n" "* parameters than I've detected. Because this particular *\n" "* library call is known to me, it will be displayed *\n" "* properly - however, parameter number auto-detection *\n" "* for unknown library calls and local functions might be *\n" "* inaccurate. This is very likely to be a result of high *\n" "* optimization of traced binary. Try documentation. *\n"
"**********************************************************\n");
} } else current->gopt++; }
/***************************************** * Try to find a match for this function * *****************************************/
static inline void display_specific(void) {
189
char n[MAXDESCR]; char* f=current->lcname; char buf[MAXDESCR]; char b2[MAXDESCR];
if (current->idtop) sprintf(n,"L %s:%s",lookup_fnct((*current->fnaddr)[current->idtop-
1],0,1),f);
else sprintf(n,"L main:%s",f);
debug("L %s (",f);
RD();
if (!strcmp(f,"strlen")) { get_string_from_child(current->lcpar[0],buf,sizeof(buf)); debug("%x \"%s\")",Xv(current->lcpar[0]),buf); debug(" = %d\n",(int)r.eax); DD(); warn_opt(1,current->lcpcnt); add_mem(current->lcpar[0],r.eax+1,0,n,0); }
else if (!strcmp(f,"malloc")) { debug("%d)",current->lcpar[0]); debug(" = %x\n",(int)r.eax); DD(); warn_opt(1,current->lcpcnt); if (r.eax) add_mem(r.eax,current->lcpar[0],0,n,1); }
else if (!strcmp(f,"strdup")) { get_string_from_child(current->lcpar[0],buf,sizeof(buf));
190
debug("%x \"%s\")",Xv(current->lcpar[0]),buf); debug(" = %x\n",(int)r.eax); DD(); warn_opt(1,current->lcpcnt); if (r.eax) add_mem(r.eax,strlen(buf),0,n,1); }
else if (!strcmp(f,"calloc")) { debug("%d, %d)",current->lcpar[0],current->lcpar[1]); debug(" = %x\n",(int)r.eax); DD(); warn_opt(2,current->lcpcnt); if (r.eax) add_mem(r.eax,current->lcpar[0]*current->lcpar[1],0,n,1); }
else if (!strcmp(f,"realloc")) { debug("%x, %d)",Xv(current->lcpar[0]),current->lcpar[1]); debug(" = %x\n",(int)r.eax); DD(); warn_opt(2,current->lcpcnt); if (current->lcpar[0]) { if (r.eax) add_mem(current->lcpar[0],current->lcpar[1],r.eax,n,1); } else { if (r.eax) add_mem(r.eax,current->lcpar[1],0,n,1); } }
else if (!strcmp(f,"free")) { debug("%x) = <void>\n",Xv(current->lcpar[0])); DD(); warn_opt(1,current->lcpcnt); delete_mem(current->lcpar[0],1);
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]