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()
的输入参数相同。