heaptrace 是一个堆调试器,用于跟踪 ELF64 (x86_64) 二进制文件中的 glibc 堆操作。其目的是在调试二进制文件或进行堆漏洞利用时,帮助可视化堆操作。

--break)请参阅 Releases 页面 上的 .deb 和 .rpm 发布文件,以及预编译的二进制文件。
$ sudo add-apt-repository ppa:arinerron/heaptrace
$ sudo apt-get update
$ sudo apt-get install heaptrace
使用你偏好的 AUR 助手来安装以下两个软件包之一:
heaptrace-git — 源码包 (PKGBUILD)heaptrace — 二进制包 (PKGBUILD)$ trizen -S heaptrace-git
... 或者 ...
$ trizen -S heaptrace
$ git clone https://github.com/Arinerron/heaptrace.git && cd heaptrace
$ make
$ sudo make install
...
$ heaptrace ./target
你可以在指定二进制文件名之前,向 heaptrace 传递参数:
Usage:
heaptrace [options...] <target> [args...]
heaptrace [options...] --attach <pid>
Options:
-p <pid>, --attach <pid>, --pid <pid>
指示 heaptrace 附加到指定的 pid,而不是从 `target`
参数运行二进制文件。注意,如果你指定此参数,则无需指定 `target`。
-b <expression>, --break=<expression>, --break-at=<expression>
当指定的 `expression` 满足条件时,向进程发送 SIGSTOP
信号,并将 GNU 调试器 (gdb) 附加到该进程。
此参数支持复杂表达式。请参阅文档了解更多信息:
https://github.com/Arinerron/heaptrace/wiki/How-to-Create-Breakpoints
-B <expression>, --break-after=<expression>
类似于 `--break`。用 gdb 替换跟踪器进程,但仅在堆函数返回之后。
请参阅文档了解更多信息:
https://github.com/Arinerron/heaptrace/wiki/How-to-Create-Breakpoints
-e <name=value>, --environ=<name=value>, --environment=<name=value>
设置单个环境变量。用于设置目标运行时的设置,例如
LD_PRELOAD=./libc.so.6,而不影响 heaptrace 自身的运行配置。
此选项可多次使用。
-s <sym_defs>, --symbols=<sym_defs>
覆盖 heaptrace 检测到的 malloc/calloc/free/realloc/reallocarray
符号的值。当 heaptrace 无法自动识别 stripped 二进制文件中的堆函数时
非常有用。请参阅 wiki 获取更多信息。
-F, --follow-fork, --follow
如果目标调用了 fork()、vfork() 或 clone(),指示 heaptrace 分离父进程
并跟踪子进程。
默认行为是分离子进程,仅跟踪父进程。
-G <path>, --gdb-path <path>
指示 heaptrace 使用 `path` 中指定的 gdb 路径,而不是默认的
/usr/bin/gdb。
-w <width>, --width=<width>, --term-width=<width>
强制指定终端宽度。
-o <file>, --output=<file>
将 heaptrace 输出写入 `file`,而不是 /dev/stderr(默认输出路径)。
-v, --verbose
打印详细信息,例如源代码中的行号(前提是在 ELF 中存储了所需的调试信息)。
-V, --version
显示当前 heaptrace 版本。
-h, --help
显示此帮助菜单。
heaptrace --break=3 ./my-binary。请参阅 wiki 文档 获取有关如何使用此参数的更多信息。-s/--symbol 参数调试 heaptrace 未能自动识别函数的 stripped 二进制文件的更多信息。$NO_COLOR 变量以从输出中移除 ANSI 颜色代码。此选项仍在开发中,不久将转换为参数。如果你遇到 bug 或有任何反馈,我很乐意提供帮助。请参阅 GitHub Issues 页面。