如何跟踪执行的每条指令?

逆向工程 ollydbg
2021-06-25 03:57:20

当我使用“trace into”时,它不会只在“Run Trace”窗口中记录每一条执行的指令,而只记录其中的一些。我必须设置断点才能记录一些指令。

例如,现在我正在使用 TLS 回调跟踪程序。我在系统入口点中断,所以我从 ntdll 开始并点击“trace into”,但是如果我没有在它上面放置断点,则不会记录来自主可执行文件的 TLS 回调。如果我在它上面放置一个断点,它就会出现在运行跟踪中。如何在不设置断点的情况下记录每条指令?

我已取消选中“不要输入系统 dll”框并选中“始终跟踪字符串函数”框(及其所有其他组合)。

我还尝试设置跟踪条件“当 EIP 介于 400000-500000 之间时暂停跟踪”,这仅在我在 TLS 上设置断点时才有效(即,一旦遇到断点,单击“跟踪到”将单步执行 TLS 代码并且不会在我设置的断点之前暂停),如果我不设置断点则不起作用。显然我错过了一些东西,但我已经尝试了我能想到的一切。

还有另一件事:当我从 ntdll 按下“执行直到用户代码”时,它不会在 TLS 回调上停止(除非我在那里放置断点)。为什么会这样?

更新:原来问题是我使用的是 64 位操作系统。我在 32 位窗口中再次运行它并且 TLS 跟踪良好。

“执行直到用户代码”仍然不会中断 TLS 回调。

1个回答

您是如何确认运行跟踪中不存在 tls 回调的?

AFAIK ollydbg 通过 LdrpCallInitRoutine 正确跟踪

Run trace, selected line
 Back=1663410.
 Thread=Main
 Module=ntdll
 Address=7C91C4F5
 Command=CALL    ntdll.LdrpCallInitRoutine
 Comment=ELdrpCallInitRoutine <------------

您是否将跟踪记录到某个文件中?缓冲区条目以后进先出的方式丢弃(缓冲区大小是可配置的,并且缓冲区的默认大小设置为其最低大小)

即使您将缓冲区配置为其最大大小,也有可能会丢弃日志条目

你知道tls回调的地址吗

如果是,您是否尝试过右键单击 -> 标记地址并使用 + / - 进行导航?

这是 ollydbg 记录的 tls 条目

Run trace, selected line
 Back=1663399.  <------------------ i have paused the binary so much instruction forward     
notice the earlier index is farther back in ldrpcallinitroutine paste above
 Thread=Main
 Module=kernl
 Address=10001000 <ModuleEntryPoint>  <---- a dll (LDR_PROCESS_ATTACH Init Call)

命令=PUSH EBP