Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Проектирование экзоскелета. Монография
.pdf
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);
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
