ret-sync是一组插件,用于同步WinDbg/GDB/LLDB/OllyDbg2/x64dbg 调试会话的插件。
ret-sync
ret-sync的英文全称是 Reverse-Engineering Tools SYNChronization(反向工程工具同步)。它是一组帮助调试会话(WinDbg/GDB/LLDB/OllyDbg/OllyDbg2/x64dbg)与反汇编程序(IDA/Ghidra)同步的插件。其基本思想很简单:从两个不同的状态(静态和动态分析)中获取最佳结果。
调试器和动态分析为我们提供:
1. 带有动态上下文(寄存器、内存等) 的本地视图;
2. 内置专门的功能或API,例如:WinDbg的!peb, !drvobj, !address等。
反汇编和静态分析为我们提供:
1. 模块宏视图;
2. 代码分析、签名、类型等;
3. 形象的图形视图;
4.反编译;
5.在IDB / GPR中持久存储知识。
主要功能:
1. 将图形和带有调试器状态的反编译视图同步;
2. 无需处理ASLR,可实时重新定位地址;
3. 将数据(注释、命令输出)从调试器传递到反汇编器;
4. 多个IDB / GPR可以同时同步,从而可以轻松地跟踪多个模块;
5. 反汇编器和调试器可以位于不同的主机或VM上。
ret-sync是我在Quarkslab期间开发和维护的一个qb-sync分支。
存储库介绍
调试器插件:
ext_windbg / sync:WinDbg扩展源文件,生成:sync.dll
ext_gdb / sync.py:GDB插件
ext_lldb / sync.py:LLDB插件
ext_olly1:OllyDbg 1.10插件
ext_olly2:OllyDbg v2插件
ext_x64dbg:x64dbg插件
以及反汇编程序插件:
ext_ida / SyncPlugin.py
ext_ghidra / dist / ghidra _ * _ retsync.zip:Ghidra插件
运行的前提条件
IDA和GDB插件需要一个有效的Python设置来支持python2和python3。还需要argparse模块,它默认包含在2.7和更高版本的Python标准库中。
二进制发行版
针对WinDbg/OllyDbg/OllyDbg2/x64dbg调试器的预构建二进制文件是通过Azure DevOps管道提出的:
选择最后一个版本,然后在“Related”部分6 published中进行检查。
在ext_ghidra/dist中提供了Ghidra插件的预构建文档
ret-sync配置
对于大多数使用典型设置的用户而言,ret-sync应该是开箱即用的:调试器和反汇编器位于相同的主机上,模块名称匹配。
在某些情况下,仍可以使用特定配置。为此,扩展程序和插件会在用户的主目录中检查名为.sync的可选全局配置文件,它必须是有效的.INI文件。
此外,IDA和Ghidra插件还将首先在IDB或项目目录( < project > .rep)中查找配置文件,以允许按IDB /项目进行本地设置。如果存在本地配置文件,则忽略全局配置文件。
在这些配置文件中声明的值将覆盖默认值,请注意,默认情况下不创建.sync文件。
下面我们详细介绍三个配置文件有用/需要的常见场景:
1. 远程调试;
2. 模块名称不匹配;
3. 缺失的PID。
远程调试:调试器和反汇编器位于不同的主机上
[INTERFACE]部分用于自定义与网络相关设置,让我们假设有人希望将IDA与运行在虚拟机或另一个主机中的调试器进行同步,这是常见的远程内核调试场景。
简单地创建两个.sync文件:
一个在安装了IDA的计算机上的IDB目录中:
它告诉ret-sync IDA插件使用端口9234在接口192.168.128.1上进行侦听,所以,该接口必须可以从远程主机或虚拟机访问。
另一个在执行调试器的计算机上,位于用户的主目录中:
它告诉ret-sync调试器插件连接到之前配置为在此接口中监听的ret-sync IDA插件。
注意:你必须在此处指定一个真实IP,而不要使用0.0.0.0。这是因为该变量同时被多个源用于绑定和连接,因此使用0.0.0.0将导致奇怪的错误。
IDB和调试器模块名称不同
[ALIASES]部分用于自定义名称,反汇编程序(IDA / Ghidra)使用该名称将模块注册到其调度程序/程序管理器。
默认情况下,反汇编程序插件使用输入文件的名称。但是,可能已经预先重命名了该文件,并且该文件与调试器看到的实际进程或已加载模块的名称不再匹配。
我们只是简单地告诉调度程序匹配名称ntkrnlmp.exe(真实名称),而不是ntoskrnl_vuln.exe (IDB名称)。
具有Qt Creator调试前端的gdb
Qt Creator调试前端更改了gdb命令输出的记录方式,由于这会干扰同步,所以可以使用原始的gdb输出进行同步,而不是使用临时文件。在.sync配置文件中使用,过程如下:
如果你希望使用Qt调试前端作为目标,可以进行如上操作。
嵌入式设备和丢失的/proc/ < pid > /maps
在某些情况下,例如通过QEMU中的串行或原始固件调试嵌入式设备,gdb无法识别PID,在这些情况下,[INIT]部分用于将自定义上下文传递给插件,它允许覆盖某些字段,例如PID和内存映射。
.sync内容提取:
映射中的条目分别是:mem_base、mem_end、mem_size、mem_name。
安装
IDA扩展
IDA先决条件
很简单,需要IDA 7.x分支。
安装IDA扩展
对于IDA安装,将Syncplugin.py和retsync文件夹从ext_ida复制到IDA plugins目录,例如:
运行IDA扩展
1. 打开IDB
2. 在IDA中运行插件(Alt-Shift-S)或Edit - > plugin - > ret-sync
IDA插件故障排除
要解决IDA扩展的问题,在文件retsync/rsconfig.py中有两个选项:
将LOG_LEVEL值设置为logging.DEBUG会使插件更详细。
将LOG_TO_FILE_ENABLE值设置为True会将broker.py和dispatch .py中的异常信息记录到专用文件中。日志文件是在名称模式为retsync.%s.err的%TMP%文件夹中生成的。
Ghidra扩展
构建Ghidra扩展
可以使用ext_ghidra/dist文件夹中的预构建版本,也可以按照说明进行构建。每个扩展版本只支持插件文件名中指定的Ghidra版本。例如,ghidra_9.1_PUBLIC_20191104_retsync.zip是针对Ghidra 9.1 Public的。
1. 安装Ghidra;
2. 安装gradle;
3. 为你的Ghidra安装构建扩展名(将$ GHIDRA_DIR替换为安装目录)。
安装Ghidra扩展
1. 在Ghidra项目管理器中:File- > Install Extensions ...,单击+号并选择ext_ghidra / dist / ghidra _ * _ retsync.zip,然后单击OK。这将有效地将zip中的retsync文件夹提取到$ GHIDRA_DIR / Extensions / Ghidra /;
2. 根据要求重启Ghidra;
3. 重新加载Ghidra后,在CodeBrowser中打开一个模块。它应该告诉你已检测到新的扩展插件。选择“是”进行配置。然后勾选“RetSyncPlugin”,然后单击“确定”。控制台应显示以下内容:
4.从Ghidra CodeBrowser工具中:使用工具栏图标或快捷方式来启用(Alt + s)/禁用(Alt + Shift + s)/重新启动(Alt + r)同步。
状态窗口也可以从Windows- > RetSyncPlugin获得,你通常希望将其与Ghidra环境窗口集成。
WinDbg扩展
构建WinDbg扩展
可以使用预先构建的二进制文件,也可以使用ext_windbg中提供的Visual Studio 2017解决方案(如果需要,请点此参阅),这将生成x64\release\sync.dll文件。
安装WinDbg扩展
你将需要将生成的sync.dll文件复制到相应的Windbg扩展路径中。
WinDbg Classic:
对于Windbg的早期版本,它如下这样(注意x86/x64):C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\sync.dll。
Windbg预览
用于存储扩展名的文件夹似乎是基于PATH的,因此你需要将其放在查询位置。如下所示:
C:\Users\user\AppData\Local\Microsoft\WindowsApps\sync.dll
运行WinDbg扩展
1. 在目标上启动WinDbg;
2. 载荷扩展(.load命令);
3. Sync WinDbg:
在IDA的输出窗口中的示例如下:
如果Windbg当前模块与IDA文件名匹配:
WinDbg安装故障排除
如果出现以下错误,那是因为你没有按照上述步骤将文件复制到正确的文件夹。
下面的错误通常表示Windbg尝试加载错误的扩展名,例如:x86代替x64 sync.dll。
GNU gdb (GDB)安装
1. 将ext_gdb/sync.py复制到你选择的目录;
2. 加载扩展(参见自动加载脚本的过程)。
LLDB安装
LLDB支持是实验性的,但载荷扩展也可以添加到~/.lldbinit中。
OllyDbg 1.10安装
OllyDbg 1.10支持是实验性的,但是:
1. 使用VS解决方案构建插件(可选,参见预构建的二进制文件);
2. 将dll复制到OllyDbg的插件目录中;
OllyDbg2安装
OllyDbg2支持是实验性的,但是:
1.使用VS解决方案构建插件(可选,参见预构建的二进制文件);
2.将dll复制到OllyDbg2的插件目录中
x64dbg安装
基于testplugin,x64dbg支持是实验性的,但是:
1.使用VS解决方案构建插件(可选,参见预构建的二进制文件),也许你需要一个不同版本的插件sdk,副本可以在每个版本的x64dbg中找到。将“pluginsdk”目录粘贴到“ext_x64dbg\x64dbg_sync”中;
2.在x64dbg的插件目录中复制dll(扩展名为.d32或.dp64)。
用法
ret-sync调试器命令
对于面向命令行的调试器(主要是Windbg和GDB),通过ret-sync公开一组命令,以帮助执行逆向工程任务。
下面的命令是通用的(Windbg和GDB),请注意WinDbg中的前缀“!”(例如:GDB中的sync, WinDbg中的!sync)。
WinDbg具体的命令如下:
GDB命令如下:
IDA的使用
IDA插件的GUI
“覆盖IDB名称”输入字段用于更改默认IDB名称,它是插件用来向调度程序注册的名称。 IDB自动切换基于模块名称匹配。如果名称冲突(例如foo.exe和foo.dll),则可用于简化匹配。请注意,如果你在同步处于活动状态时修改输入字段,则必须重新向调度程序注册;只需使用“重新启动”按钮即可完成。
提醒一下,在默认情况下,可以使用.sync配置文件来别名化。
Ghidra的用法
Ghidra插件的GUI
一旦RetSyncPlugin打开,你可以通过简单的拖拽将它添加到CodeBrowser窗口:
如果你想查看几个模块,文件需要在同一个CodeBrowser查看器中打开,只需在CodeBrowser窗口中拖放额外的模块即可获得如上所示的结果。
WinDbg用法
WinDbg插件命令
!sync::开始同步;
!syncoff:停止同步;
!synchelp:显示可用命令的列表,并附有简短说明;
!cmt [-a address]:在IDA中的当前IP处添加注释;
!rcmt [-a address]: 在IDA中的当前IP处重置注释;
!fcmt [-a address] : 为当前IP所在的函数添加函数注释;
注意:不带参数的调用此命令将重置函数的注释。
!raddr :添加一个注释,其中包含从表达式求值的重新定位的地址;
!rln :从反汇编器获取给定地址的符号;
!lbl [-a address] :在反汇编程序中的当前ip处添加标签名称;
!cmd :在WinDbg中执行命令,并将其输出作为注释添加到反汇编程序中的当前ip处;
!bc < ||on|off|set 0xBBGGRR > :启用/禁用反汇编程序中的路径着色,这不是代码跟踪工具,但是有一些有效的工具。每个手动步进的指令在图中都带有颜色。如果不带参数调用,则在当前ip上为单个指令着色。 “set”参数用于使用新的十六进制rgb代码设置路径颜色(如果使用值 > 0xFFFFFF调用,则重置颜色)。
!idblist:获取连接到调度程序的所有IDB客户端的列表:
!syncmodauto < on|off > : 基于模块名称启用/禁用反汇编程序自动切换:
!idbn:将活动IDB设置为第n个客户端, n应该是有效的十进制值。
在本例中,当前活动的IDB客户端将被设置为:
!jmpto:在当前调试器状态的上下文中评估作为参数给出的表达式。如果注册了匹配的模块,则反汇编程序的视图将与结果地址同步。可以看作是手动同步,是即时动态执行重定位。对于随机重定位的二进制文件特别有用。
!jmpraw:在当前调试器状态的上下文中评估作为参数给出的表达式。如果启用了IDB,则反汇编程序的视图将与结果地址同步。地址不重定基础,并且没有IDB切换。对于动态分配/生成的代码特别有用。
!modmap:将合成(“伪造”)模块(使用其基地址和大小定义)添加到调试器内部列表。来自msdn:“如果重新加载了所有模块,例如,通过将Module参数设置为空字符串调用Reload,则所有合成模块都将被丢弃。”它可用于更轻松地调试动态分配/生成的代码。
!modunmap:删除基地址上先前映射的合成模块。
!modcheck < ||md5 > :用于检查当前模块是否确实与IDB的文件匹配(例如:模块已更新)当不带参数调用时,将使用Debug Directory中的pdb的GUID。它可以替代地使用md5,但只能与本地调试对象一起使用(不适用于远程内核调试)。
!bpcmds < ||save|load| > :bpcmds封装器,保存并重新加载输出到当前IDB的.bpcmds(断点命令列表)。如果不带参数调用,则显示保存的数据。使用IDA的netnode功能可以实现持久存储。
!ks: 调试器标记语言(DML)增强了kv命令的输出。可以单击代码地址(!jmpto),也可以单击数据地址(dc)。
!translate : 从IDA(Alt-F2快捷方式)开始使用的含义,根据模块的名称和偏移量重新确定地址的基础。
地址可选参数
!cmt,!rcmt和!fcmt命令支持可选的地址选项:-a或--address。地址应作为十六进制值传递。命令解析基于python的argparse模块。要停止行解析,请使用--。
地址必须是有效的指令地址。
使用GNU gdb (GDB)
与主机同步:
GDB插件命令
使用没有“!”前缀的命令:
rln:从IDB获取给定地址的符号;
bbt: 美丽的回溯,类似于bt,但要求反汇编程序提供符号;
patch:根据实时上下文在反汇编程序中修补字节;
bx:漂亮的显示,与x相似,但使用符号,该符号将由反汇编程序解析。
cc: 继续在反汇编程序中,这是使用F3设置一次性断点和使用F5继续设置的替代方法。如果你更喜欢从gdb执行此操作,则这很有用。
LLDB的用法
1. 与主机同步:
2. 使用命令:
OllyDbg 1.10的用法
使用“插件”菜单或快捷方式来启用(Alt+s)/禁用(Alt+u)同步。
OllyDbg2的用法
使用“插件”菜单或快捷方式来启用(Ctrl+s)/禁用(Ctrl+u)同步,由于OllyDbg2 API处于测试版状态,因此仅实现了某些功能
x64dbg的用法
使用命令来启用(“!sync”)或禁用(“!syncoff”)同步。
已知漏洞和功能限制
1.使用Python 2.7/3.7、IDA 7.4 (Windows、Linux和Mac OS X)、Ghidra 9.1、GNU gdb (gdb)、7.4.1 (Debian)、lldb 310.2.37进行测试。
2. 双方之间没有任何认证/加密;
3. 自修改代码超出范围。
本文翻译自:https://github.com/bootleg/ret-sync如若转载,请注明原文地址: