在不设置断点的情况下跟踪(“记录”)堆栈?

逆向工程 调试器 调用栈
2021-06-29 18:05:37

我熟悉在中断特定指令后回溯堆栈的概念。我想知道的是:理论上,帮助自己分析应用程序的一个好方法是让它执行所研究的代码,然后仔细检查堆栈。据我所知,调试器只允许在实际中断指令后跟踪堆栈。然而,这可能是有问题的,因为如果我不知道在哪里放置断点,我就无法使用这种有用的技术。

例如,假设我正在玩一个简单的射击游戏。在每次射击之后(或之前),都会进行一些数学运算来计算武器的随机弹丸散布。同样,从理论上讲,如果可以“记录”在那段时间内完成的所有堆栈活动,那将极大地有助于分析。

我的问题:

  1. 那可能吗?
  2. 如果以上的答案是肯定的,那是否是一种可行的分析技术?鉴于在一个大型复杂应用程序中一直在执行大量代码,实际上是否有可能将所研究的代码与其他所有代码区分开来?
2个回答

当应用程序正在运行且未步进或暂停时,调试器无法读取/记录堆栈。

最接近您想做的事情称为跟踪,并得到一些调试器(如 OllyDbg 和 IDA)的支持

您描述的方法是在多个分析器中实现的,通常名称为sampling profiler它通常的作用是:

  1. 定期(例如每 100 毫秒)暂停应用程序
  2. 获取每个线程的当前寄存器
  3. 使用捕获的 ESP/EIP/EBP 执行快速堆栈跟踪
  4. 恢复申请
  5. 分析结束后,整理堆栈跟踪,将地址解析为源代码行等。