是否有任何工具可以解析 ollydbg 运行跟踪?

逆向工程 开箱 ollydbg
2021-06-14 11:06:30

我目前正在开发一种工具来自动化与解包软件相关的几个操作。我想使用 Ollydbg 的运行跟踪(首选 1.10,因为它有很多 antidebug/usage/etc 插件)。但是,我似乎不知道任何提供解析 Ollydbg 运行跟踪的库。

有谁知道任何可以做到这一点的图书馆或任何已经做到这一点的项目?

2个回答

我发现解析运行跟踪并不像人们希望的那样微不足道(正如我所假设的,就像评论您问题的人一样)。这有几个原因:

  1. 字段由可变数量的空格分隔。如果其中一个字段太长,则使用单个分号作为分隔符。但是,不保证可变数量的空格是字段分隔符。

  2. 第一个字段之一是执行指令的地址。除了十六进制地址之外,这也可以是一个(可能是被破坏的 C++)符号。线条可以包括野兽,如

    main  std::basic_string<unsigned short,std::char_traits<unsigned short>,std::allocator<unsigned short> >::~basic_string<unsigned short,std::char_traits<unsigned short>,std::allocator<unsigned short> >;push 0;0018EB38=0;ESP=0018EB38
    

    当然,重组名称也可能出现在汇编指令中,而不仅仅是在地址字段中。另外,我相信 ABCDEF0 既是有效的十六进制地址又是有效的符号名称,并且无法区分它们,因为跟踪只报告经过处理的名称十六进制地址。

  3. 根据 OllyDbg 的启发式,当跟踪的注释字段中指示的指向的数据包含 ASCII 或 unicode 数据时,将显示包含的字符串。至少字符串内的换行符没有被转义,所以你必须处理分割线。

  4. 至少如果您想提取调用跟踪是相关的:在不参考周围指令的情况下确定调用是被跟踪到(正常情况下)还是被跟踪到(在 Windows DLL 调用的情况下)通常不是微不足道的。您可以使用启发式方法,例如是否显示“调用指令”来修改 ESP 之外的其他寄存器。通过跟踪ESP,应该可以确定这一点。

  5. 转储跟踪的精确格式显然在很大程度上取决于选项,包括诸如程序集助记符是否通过空格或制表符与操作数分开,以及显示的程序集是全部大写还是小写等内容。

以上所有内容均与 OllyDbg 2.01 相关;我怀疑不同版本之间肯定会有差异(我不介意在未来的版本中格式是否更易于解析)。

说了这么多,我已经编写了一些(Haskell)代码来解析现在对我有用的输出,其中包含我的特定选项和转储的特定应用程序。这是我用来匹配行的与 PERL 兼容的正则表达式(在 POSIX 正则表达式上下文中不起作用):

^main  ([0-9A-F]{8}|(?:unsigned |operator |vbase destructor|[^ ;]| >)+)(?: +|;)((?:[^=; ]|operator.{0,2}=| (?! ))+)(?:(?: +|;)([^ ]+=.*))?$

第一个捕获组是地址/符号名称,第二组是汇编指令,第三组是包含内存内容和寄存器更改的行的“注释”部分。

我想我将继续使我的 Haskell 程序成为一个过滤器,它解析运行跟踪并以更容易机器解析的格式(可能是 CSV 或其他格式)输出它们;如果有人感兴趣,我可以分享代码。(抱歉使用 Haskell;我只需要脚本语言无法提供的性能。我的转储大小为 2 GB,我的 Haskell 解析器以大约 50 Mb/s 的速度消耗它。)

ollydbg runtrace 有一个内置的分析选项,它可以以模块方式或全局分析运行跟踪

转到运行跟踪窗口 (...)icon右键单击并选择profile moduleglobal profile

一个简单的messagebox.exe(iczelions教程2)将执行1087946从系统断点指令,以原始进入点 skipping string commands repmovsb ... movsdxpsp3

Run trace, selected line
 Back=1087946. 
 Thread=Main
 Module=ntdll
 Address=7C90120F
 Command=RETN
 Modified registers=ESP=0013FB24

并调用 _LdrSnapThunk 大约 1000 次

Profile of whole memory, item 30
 Count=1012.
 Address=7C917BF1 LdrpSnapThunk
 First command=MOV     EDI, EDI

将调用 zwCreateFile 4 次

Profile of whole memory, item 1046
 Count=4.
 Address=7C90D0AE ZwCreateFile
 First command=MOV     EAX, 25

从这个全局配置文件中,您可以hop back to disassembly windowrun trace window mark this position in run trace windowjump to next marked position

4 ZwCreateFile从全局配置文件到运行跟踪窗口的详细信息如下相关

Run trace, selected line
 Back=978309. <-------------------
 Thread=Main
 Module=ntdll
 Address=7C90D0AE ZwCreateFile
 Command=MOV     EAX, 25
 Modified registers=EAX=00000025

Run trace, selected line
 Back=975485. <----------------------
 Thread=Main
 Module=ntdll
 Address=7C90D0AE ZwCreateFile
 Command=MOV     EAX, 25
 Modified registers=EAX=00000025


Run trace, selected line
 Back=956331. <-----------------------
 Thread=Main
 Module=ntdll
 Address=7C90D0AE ZwCreateFile
 Command=MOV     EAX, 25
 Modified registers=EAX=00000025


Run trace, selected line
 Back=874497. <----------------------
 Thread=Main
 Module=ntdll
 Address=7C90D0AE ZwCreateFile
 Command=MOV     EAX, 25
 Modified registers=EAX=00000025