【问题标题】:ptrace: get imagebase of tracee?ptrace:获取tracee的图像库?
【发布时间】:2013-11-14 18:08:29
【问题描述】:

我在 ubuntu 13.10 上,有这个剥离+打包的小精灵文件。我需要以自动化的方式从它的过程中转储各种信息,所以我拼凑了一个跟踪我的进度的小型跟踪器,类似于 strace。提出了三个问题:

1) 附加到我的进程后,如何获取它的图像库?

2) 进程首先在哪里中断?显然不是节目的EP。

3) 加载 .so/.lib 文件时可以通过什么方式通知我?我认为 GDB 可以做到这一点。

第一个问题确实是最重要的。任何帮助表示赞赏。

【问题讨论】:

  • 我不确定,但我相信您必须通过解析进程的可执行映像来自己找出(1)的答案。并且程序只会在您告诉它中断的地方中断(使用PTRACE_SETREGSETPTRACE_POKEUSER,取决于操作系统和CPU,设置调试控制寄存器以建立硬件断点,或PTRACE_POKETEXT 注入断点指令)。 ptrace 是一个非常“裸机”的 API——它对你的作用很小,你必须了解硬件和 ABI 的内部和外部才能有效地使用它。
  • 我将如何解析可执行进程?
  • 调查libelf
  • 我可以这样做,但它不会为我提供该进程的当前图像库,它不一定与文件 (ASLR) 中的“默认”图像库相同。

标签: linux debugging ptrace


【解决方案1】:

1) /proc/<PID>/maps 包含进程映射的所有内容以及从哪里映射的列表,包括从可执行文件映射的页面。通过阅读可执行的 ELF 标头,您应该能够找出 .text 的位置。

2) 动态链接二进制文件的执行通常从解释器开始。 ELF 可执行文件(使用readelf -e 转储)中的INTERP 程序头将具有其名称。它是解释器执行开始的入口点。通常它是一个运行时链接器ld-<some-variant>.so。它映射到可执行文件的部分,也可能映射所需的共享库。

3) GDB 非常详细地了解运行时链接器是如何实现的,因此它能够通过在正确的位置设置断点来拦截动态对象加载。你也可以做到的。 dlopen() 似乎是一个很好的拦截点候选者。正如我在 #2 中所指出的,共享对象可能在可执行文件获得控制权之前就已预先加载。

【讨论】:

  • 1) 我现在会调查一下。但是,我基本上是在解析 text 以找到图像库。感觉不干净。不过谢谢,我现在就调查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 2017-09-24
  • 1970-01-01
相关资源
最近更新 更多