使用ptrace 截获系统调用
时间:2007-04-18 来源:loughsky
这两天正在书写,内存分析软件,今天刚刚完成,计划分为3个层面,一个是通过/proc/pid/stat信息,显示出操作系统级别,物理内存使用曲线;一个是截获有管内存分配的系统调用,获得虚拟内存使用曲线;一个是获得malloc等的日志,来获得具体内存使用情况。
在截获有关内存分配的系统调用时:
brk,和mmap的参数传递很简单,他们都是通过寄存器来传递参数
m_sys->param[0] = ptrace(PTRACE_PEEKUSER,pid, 4 * 0,NULL);
m_sys->param[1] = ptrace(PTRACE_PEEKUSER,pid, 4 * 1,NULL);
m_sys->param[2] = ptrace(PTRACE_PEEKUSER,pid, 4 * 2,NULL);
m_sys->param[3] = ptrace(PTRACE_PEEKUSER,pid, 4 * 3,NULL);
m_sys->param[4] = ptrace(PTRACE_PEEKUSER,pid, 4 * 4,NULL);
m_sys->param[5] = ptrace(PTRACE_PEEKUSER,pid, 4 * 5,NULL); old_mmap的参数传递与其不同,其使用堆栈来传递参数,获得方法 m_sys->syscallno = ptrace(PTRACE_PEEKUSER,pid, 4 * ORIG_EAX, NULL);
m_sys->param[0] = ptrace(PTRACE_PEEKUSER,pid, 4 * 0,NULL); ptrace_read(child,PTRACE_PEEKDATA,m_sys.param[0],(void*)m_sys.param,sizeof(m_sys.param)); 其中 struct msyscall
{
long syscallno;
long ret;
long param[6];
};
m_sys->param[1] = ptrace(PTRACE_PEEKUSER,pid, 4 * 1,NULL);
m_sys->param[2] = ptrace(PTRACE_PEEKUSER,pid, 4 * 2,NULL);
m_sys->param[3] = ptrace(PTRACE_PEEKUSER,pid, 4 * 3,NULL);
m_sys->param[4] = ptrace(PTRACE_PEEKUSER,pid, 4 * 4,NULL);
m_sys->param[5] = ptrace(PTRACE_PEEKUSER,pid, 4 * 5,NULL); old_mmap的参数传递与其不同,其使用堆栈来传递参数,获得方法 m_sys->syscallno = ptrace(PTRACE_PEEKUSER,pid, 4 * ORIG_EAX, NULL);
m_sys->param[0] = ptrace(PTRACE_PEEKUSER,pid, 4 * 0,NULL); ptrace_read(child,PTRACE_PEEKDATA,m_sys.param[0],(void*)m_sys.param,sizeof(m_sys.param)); 其中 struct msyscall
{
long syscallno;
long ret;
long param[6];
};
相关阅读 更多 +
排行榜 更多 +