Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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
Linux 捕获所有堆分配_Linux_Debugging_Trace_Heap Memory_Intel Pin - Fatal编程技术网

Linux 捕获所有堆分配

Linux 捕获所有堆分配,linux,debugging,trace,heap-memory,intel-pin,Linux,Debugging,Trace,Heap Memory,Intel Pin,我想在应用程序中查找对堆内存的所有访问。我需要存储每个分配,因此,不仅可以检查[heap]范围内的地址(也不包括mmap()分配的堆内存区域)。因此,我编写了一个pintool并捕获了对malloc()、calloc()、realloc()和free()的所有调用。由于诸如尾部调用删除之类的优化,Pin无法检测这些调用的最后一条指令。因此,我在这些函数中的每个可能的直接/间接跳转目标(例如,malloc(),间接跳转到malloc\u hook\u ini())中的ret..指令之后手动添加回调

我想在应用程序中查找对堆内存的所有访问。我需要存储每个分配,因此,不仅可以检查
[heap]
范围内的地址(也不包括
mmap()
分配的堆内存区域)。因此,我编写了一个
pintool
并捕获了对
malloc()
calloc()
realloc()
free()的所有调用。由于诸如尾部调用删除之类的优化,Pin
无法检测这些调用的最后一条指令。因此,我在这些函数中的每个可能的直接/间接跳转目标(例如,
malloc()
,间接跳转到
malloc\u hook\u ini())中的
ret..
指令之后手动添加回调(确切地说,我使用了
IPOINT\u take\u BRANCH
。因此,我在
ret..之后添加了指令插入代码。
malloc\u hook\u ini()中的指令。)。这些目标本身可能有向外的直接/间接跳跃,我再次尝试捕获它们

但是,在
[heap]
范围内(以及
mmap()
范围内)仍有一些访问不属于以前捕获的任何分配。为了澄清任何疑问,我经常在访问点之前显示所有当前分配的堆块。访问地址显然位于已分配的堆块中。当然,知道这些堆块的分配IP将是一个很大的帮助。但这在
Pwngdb
或任何其他类似工具中都不受支持

在许多情况下,通过
Pin
分析,在整个程序执行期间,访问地址不属于分配的任何地址范围(即使是同时删除的地址范围)。如何确定在
Pin
分析过程中遗漏了哪个分配功能

似乎有两种可能的情况:

1)除了
malloc()

2)对于
malloc()
calloc()
realloc()
free()
,有一些遗漏的返回点

第二个候选者是不可能的。因为我在每个分配函数之前和之后都放了一个计数器,最后它们的值相等


更新:

以下是一个此类接入点的回溯,以及
RSI
寄存器的值:

也许您最好在系统调用级别执行此操作,即拦截对操作系统的所有ram调用?在c以外的通用语言中,可能不会使用malloc分配内存,甚至c也可能会根据上下文使用其他方法。谢谢。系统调用级别的拦截似乎没有帮助。因为(在
ptmalloc
)内存是从操作系统中主动获取的,并存储在大小可变的块中以供将来分配。我需要实际分配。您能否在
C
中提到一种动态分配机制,它不使用
malloc()/calloc()/realloc()
mmap()
?这是一个很长的目标,但您是否正确地处理了共享内存之类的东西,例如shmat?谢谢你抽出时间。该程序是单进程的。我发现了窃听器。原因是对
calloc()
参数的愚蠢错误处理。我认为它的输入参数与
malloc()
的输入参数相同。