如何解决Ptrace() 获取存储在位置
我目前正在开发一个程序,该程序使用 ptrace 在给定的十六进制地址处放置断点,然后可以选择单步执行、继续或打印当前地址处的数据。这是我当前的代码:
int main(int argc,char **argv)
{
if(argc < 2)
{
printf("Enter parameter");
return 0;
}
pid_t child = fork();
if(child == 0){
ptrace(PTRACE_TRACEME,NULL,NULL);
char* proc_path = strdup(argv[1]);
if(proc_path == NULL){
return 0;
}
const char *args2 = NULL;
execl(proc_path,args2,NULL);
}
else if(child > 0){
// struct user_regs_struct uregs;
long address = 0;
size_t read;
size_t size = 0;
char* line = NULL;
long data = 0;
long orig_data = 0;
int word;
while(1) {
read = getline(&line,&size,stdin);
if(read <= 0){
break;
}
switch(line[0])
{
case 'b':
// ptrace(PTRACE_GETREGS,child,&uregs);
// printf("ebx = %p\n",&uregs.rbx);
read = getline(&line,stdin);
if(read < 1){
break;
}
address = strtol(line,16);
data = ptrace( PTRACE_PEEKTEXT,(void *)address,NULL );
orig_data = data;
data = (data & ~0xff) | 0xcc;
ptrace( PTRACE_POKETEXT,data );
break;
case 's':
ptrace(PTRACE_SINGLESTEP,NULL);
break;
case 'c':
ptrace(PTRACE_CONT,NULL);
break;
case 'p':
word = ptrace(PTRACE_PEEKTEXT,(void*)address,NULL);
printf("%i",word);
break;
default:
break;
}
}
}
else{
printf("error/n");
}
return 0;
}
总的来说,我对 C 和 Linux 还很陌生,但我认为我的 continue 和 single step 函数应该按预期工作,断点也应该如此。我在对我的程序进行故障排除时遇到了麻烦,因为我不知道如何获取我的程序的起始地址以在那里放置断点(我已经尝试在我的测试程序中打印位置,但我假设有更好的方法做)。同样,我希望在提取“p”情况下的数据方面得到一些帮助,我只想在当前位置获取值。我知道这里有抵消和其他障碍,但没有运气试图克服它们。如果有人能将我推向正确的方向,我将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。