热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

retsync:用于同步WinDbg/GDB/LLDB/OllyDbg2/x64dbg调试会话的插件

ret-sync是一组插件,用于同步WinDbgGDBLLDBOllyDbg2x64dbg调试会话的插件。ret-syncret-sync的英文全称是 Reverse-Engine


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. 自修改代码超出范围。




推荐阅读
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
author-avatar
菲拉慕格_516
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有