Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ptrace解析返回和调用_C_Assembly_Ptrace - Fatal编程技术网

使用ptrace解析返回和调用

使用ptrace解析返回和调用,c,assembly,ptrace,C,Assembly,Ptrace,我正在为我的学校项目用C编写一个ftrace程序,我使用ptrace()syscall解析指令。 我计算调用操作码(0x9a、0xe8、0xff,当0xff后面的字节的位(5,4,3)对应于调用)和ret操作码(0xc3、0xc2、0xca、0xcb)。 以下是我跟踪的程序: #include <stdlib.h> #include <stdio.h> int chevre(char *lel) { printf("Chevre\n"); free(le

我正在为我的学校项目用C编写一个ftrace程序,我使用ptrace()syscall解析指令。 我计算调用操作码(0x9a、0xe8、0xff,当0xff后面的字节的位(5,4,3)对应于调用)和ret操作码(0xc3、0xc2、0xca、0xcb)。 以下是我跟踪的程序:

#include <stdlib.h>
#include <stdio.h>

int     chevre(char *lel)
{
  printf("Chevre\n");
  free(lel);
  return (420);
}

int     main()
{
  char  *lel;

  lel = malloc(42);
  chevre(lel);
  return (0);
}
#包括
#包括
内部切弗(字符*lel)
{
printf(“Chevre\n”);
免费(lel);
返回(420);
}
int main()
{
char*lel;
lel=malloc(42);
切夫尔(lel);
返回(0);
}
我的问题是:为什么只有751次回程才能接到777个电话?当我只得到几个函数时(我成功地找到了解析ELF文件可执行文件和.plt部分的函数),为什么会有这么多调用

谢谢你的帮助

编辑: 问题在于过滤0xff操作码:我试图读取地址RIP-8处的字节,这是第一个参数的一部分,因为堆栈变小,指令信息位于地址RIP+8处。
读取我告诉我读取的操作码是有效的。

函数的
printf
级别相对较高,将调用其他较低级别的函数,该函数反过来执行多个系统调用。然后,您必须考虑您所编写的代码与某些启动代码相链接,
main
函数是您的代码开始运行的地方,。但是程序不是从哪里开始的,有很多代码,有那么多的调用,必须在
main
函数之前和之后进行。@JoachimPileborg对我来说听起来像是一个答案:)//还有,+1代表山羊。我在调用n°678时得到了u libc_start_main,所以我猜在那之前是libc加载之类的。但电话号码和ret号码之间的差异是我的错误还是正常的?(编辑:如果我是对的,printf函数是一个宏,真正的函数是puts)
printf
不是一个宏,但是编译器可以替换一个常量
printf
,该常量以一个换行符结束,并带有
puts