xAnalyzer是 @mrexodia 的 x86/x64 x64dbg 调试器的插件。该插件基于 @mrfearless 的 APIInfo Plugin,但进行了一些改进和添加。 xAnalyzer能够对调试应用程序的静态代码进行各种类型的分析,为用户提供更多额外信息。该插件将进行广泛的 API 函数调用检测,以添加函数定义、参数和数据类型以及任何其他补充信息,这些信息与您使用 OllyDbg 分析引擎获得的信息非常接近,以便使其更易于理解用户在开始调试任务之前。
一些主要功能和改进包括:
扩展函数调用分析(来自近 200 个 DLL 的超过 13,000 个 API 定义)
定义和通用函数、参数、数据类型和附加调试信息识别。
自动循环检测。
用户维护的定义文件
在 xAnalyzer 之前
xAnalyzer之后
在此处下载最新版本的二进制文件
下载最新版本的x64dbg
解压apis_def.zip
将xAnalyzer.dp32/xAnalyzer.dp64和apis_def文件夹复制到x64dbg中各自的插件目录中
在 x64dbg 主窗口中的“ Plugins ”菜单下或 Disasm 窗口的二级菜单中查找“ xAnalyzer ”条目
xAnalyzer 有一些选项可供选择,以便更加个性化使用它的体验,以便在您需要时以您想要的方式使用它。插件选项如下:
自动分析:当此选项打开时,插件将在每次加载到调试器时到达入口点时对可执行代码启动全自动分析。通过使用此选项,您可以在 x64dbg 上获得更接近 OllyDbg 初始分析行为。
扩展分析:此选项将强制 xAnalyzer 对调试的可执行文件的整个代码部分进行扩展分析。警告!!!通过启用此选项,分析过程可能需要更多的时间和资源才能完成,而且 x64dbg 可能会使用大量 RAM 内存,具体取决于部分的大小以及添加到调试的可执行静态反汇编的额外数据量
分析未定义的函数:通过选择此选项,xAnalyzer 将对 api 定义文件中未定义的所有 API 调用/函数使用通用分析和参数类型,并且还会调用如下内容:
CALL {REGISTER}
CALL {REGISTER + DISPLACEMENT}
CALL {DYNAMIC_POINTER}
使用可执行文件时,xAnalyzer 有一些命令和菜单选项可供选择:
通过在 x64dbg 的反汇编窗口中选择几条指令并选择此菜单,将对所选行进行快速分析。您还可以使用命令xanal 选择来启动此选项,甚至可以在 x64dbg gui 中为其设置自己的热键。
如果您正处于某个函数的中间,您可以使用此菜单项来分析整个函数并且仅分析该函数。以您选择的单个指令作为参考,xAnalyzer 将从那里处理代码块内的所有行。您还可以使用命令xanal 函数来启动此类分析,甚至可以在 x64dbg gui 中为其设置自己的热键。
该命令将对整个模块启动全面分析。此功能考虑了扩展分析选项来确定要使用的分析深度。您也可以使用命令xanal 模块来执行它,甚至可以在 x64dbg gui 中为其设置自己的热键。
在这些情况下,所有这些菜单都会做出与之前命令相反的操作。如果您想删除代码某些部分或整个可执行文件中的分析额外信息(如果需要)。您还可以使用以下命令: xanalremove选择/功能/模块
xAnalyzer 有一个可扩展的 API 定义文件系统,这些文件位于文件夹“api_def”和“api_def/headers”中,其中应包含具有 .ini 结构和规范的所有文件:
“ filename ”:这是 API 函数所在模块的名称。
“ filename.h ”:这是包含类型数据(标志和枚举)相关信息的标头
“ .api ”扩展名:指定它是定义文件,不会识别其他扩展名(kernel32.api、shell32.api 等)
所有这些 ini 文件都包含插件的重要信息,例如函数原型、参数类型等。xAnalyzer 使用所有这些信息来设置静态代码的额外信息。这些文件中的单个条目将类似于:
文件 user32.api
[MessageBox]
1=HANDLE hWnd
2=LPCTSTR lpText
3=LPCTSTR lpCaption
4=[MessageBoxType] uType
ParamCount=4
Header=shell.h.api;
@=MessageBox
文件 shell.h.api
[MessageBoxType]
TypeDisplay=UINT
Base=UINT
Type=Flag
Const1=MB_ABORTRETRYIGNORE
Value1=0x00000002
Const2=MB_CANCELTRYCONTINUE
Value2=0x00000006
Const3=MB_HELP
Value3=0x00004000
Const4=MB_OK
Value4=0x00000000
Const5=MB_OKCANCEL
...
括号之间的任何参数都意味着这是一个特定的数据类型(枚举或二进制标志),并且这将在键“ Header ”中指定的正确 .h 头文件中定义。
至于头文件,方案几乎相同,只是有几个键,例如“ TypeDisplay ”。这指定了要在 dbg 注释中显示的正确数据类型,然后它是“ Base ”,它将指向主条目使用的基本数据类型,如果有链接的数据类型,这可能位于括号之间,如下所示出色地。 “ Type ”键是数据结构的类型,它可以是“Flag”或“Enum”。最后所有的变量名称和值都出现了。
如果您发现 xAnalyzer 未检测到或未正确检测到某个 API 调用定义,则可能意味着它不存在于定义文件中或定义不正确,因此在这种情况下,可以进行添加或修改以包括任何缺失的函数或参数,只要遵循相同的结构,就可以 100% 可定制。
函数中第一个带有泛型参数的未定义调用将不会被处理,除非它前面有一个跳转,因为没有办法知道要使用多少个参数而不非法使用函数序言指令。只有记录在案的调用才会在函数开头或由跳转主持的未定义函数中进行处理。
一些“不常见”函数在跳转之间有参数,因此根据插件的实际设计(函数参数之间没有跳转)这些调用将不会被处理,因为每次发现跳转时堆栈中的指令都会被清理。
仅当满足以下条件时,嵌套调用才能正常工作:
1-) 内部调用已定义
2-) 如果内部未定义调用采用的堆栈参数不比外部调用所需的参数多
它仅检测函数内部的循环(函数边界 Prolog/RET)。如果函数的代码中间包含 RET,它将被检测为函数结束,并且循环堆栈将被清除。
如果正在调试的可执行文件的名称中有多个点,分析可能会失败
内部有非条件跳转的部分的循环检测不正确(参见#7)
嵌套参数行(xAnalyzer 支持嵌套参数,但 x64dbg 目前不支持)
添加熵分析
流分析扫描代替线性(迹线仿真)
案例开关检测
x分析器2.5.4
- 项目更新至VS2017
- 修复了处理涉及堆栈指针的参数指令时的问题(x64 版本)。
- 修复了涉及堆栈指针的不正确参数顺序(x64 版本)。
- 修复了未定义函数参数识别的错误,该错误将重复寄存器作为不同的参数(x64 版本)
- 更改了未定义调用参数识别,默认情况下最多只能预测 4 个未定义参数(x86 版本)
- 一些代码重构
x分析器2.5.3
-修复了较新版本的 x64dbg 中函数名称的检测
x分析器2.5.2
-使用当前选择的 disasm 线代替 cip 进行模块分析
- 修改了一些插件条目的输入
- 一些代码重构
-修改命令“xanal/xanalremove exe”为“xanal/xanalremove module”
x分析器2.5.1
- 修复了 mov 指令变化时的崩溃问题
x分析器2.5.0
- 删除了 [EBP+/-] 指令作为可能的函数调用者参数
- 删除了所有函数参数值的前缀“0x”,因为推断的是十六进制
-修复了指针变量无法正确显示为指针而是显示为基本数据类型的参数
-添加了对堆栈指针使用(ESP)的识别作为函数调用的可能参数(x86)
- 在参数中添加了使用准确的数据类型名称,而不是通用/基本数据类型名称
- 新增函数智能跟踪功能(智能预测和识别间接函数调用,如:CALL {REGISTER}、CALL {POINTER})
-添加了函数指针的名称作为参数(如果检测到,将使用整个函数名称,而不仅仅是地址)
x分析器2.4.3
- 添加了对 x86 上 MOV 指令的识别
- 添加了对带有“Stub”后缀的函数的识别
- 修正了“自动分析”的错误(添加了更多EP检查条件)
- 清除自动评论/自动标签选项,现在默认选中
x分析器2.4.2
- 修复了 BoF 当参数标记注释超过 MAX_COMMENT_SIZE 时的问题
- 修复了定义位于第二个 .api 文件中时的函数名称搜索错误
x分析器2.4.1
- 添加了新的热键方案
- 添加了新选项来控制应删除哪些先前的分析数据。 (这使得可以与 SwissArmyKnife 等地图加载器插件无缝协作)。
- 添加了新命令(旧命令已被弃用)
xanal Selection :执行选择分析
xanal 函数:执行函数分析
xanal exe :执行整个可执行文件分析
xanalremove Selection :删除先前的选择分析
xanalremove function : 删除之前的函数分析
xanalremove exe :删除以前的整个可执行分析
xanal help : 在日志窗口中显示一些帮助文本
- 修复了启动时未启动的自动分析(关闭 #18)
- 修复了各种 api 定义文件(关闭 #17)
x分析器2.4
- 新的和改进的 API 定义文件,方案略有修改(来自近 200 个 DLL 的 13,000 个 API)
- 使用的每个 API 定义参数的符号识别系统(1000 多个枚举数据类型和 800 多个标志)
- 识别参数数据类型(BOOL、NUMERIC、NON-NUMERIC)
- VB“DllFunctionCall”存根检测
- 作为参数传递的字符串现在更干净(调试器注释现在已删除地址部分)
- 执行摘要添加到日志窗口
- 由于与 x64dbg 存在一些冲突,热键功能被删除(将合并到未来的版本中)
- 修复了各种错误
x分析器2.3.1
- 修复了启动“分析选择”菜单并选择单行时导致突然 dbg 异常的错误(感谢@blaquee)
- 在加载插件之前检查定义文件夹“apis_def”和定义文件是否存在于其中
- 将热键更改为用于选择的 Ctrl+Shift+X 和用于功能的 Ctrl+X
x分析器2.3
- 添加了选项“分析未定义的函数”。 (默认情况下关闭,不分析定义文件中没有的任何内容)
- 添加了选项“自动分析”(默认情况下关闭,在调试可执行文件的 EP 上启动时进行分析)
- 新增“分析选择”功能(对选定的指令进行分析,支持多个选定的调用)
- 添加了“分析函数”功能(从所选地址自动发现和分析当前函数)
- 从选择/函数/可执行文件中添加了“删除分析”功能
- 添加了命令快捷方式
- 添加了新图标
- 添加了将配置保存到 .ini 文件
- 添加了十六进制参数值的大写
- 重组功能“分析可执行文件”(对当前可执行文件进行全面分析)
- 重组菜单
- 新的“关于”对话框现在显示版本号以跟踪更新
- 一些小错误修复
- 修复并合并了一些API定义文件
- 速度和稳定性改进
x分析器2.2
- 添加了分析进度指示器
- 添加了新的分析深度模式
-现在仅在不存在备份数据库的情况下才执行自动分析
- 错误已修复
x分析器2.1
- 未定义函数和内部子函数的通用参数
- 智能函数注释和参数(仅处理堆栈上带有参数的函数)。这允许 xAnalyzer 通过仅使用实际参数处理和注释这些函数来更清晰地查看代码
- 使用方案 CALL -> DYNAMIC_MEMORY -> API 检测间接函数调用
- 使用方案 CALL -> REGISTER/REGISTER + DISPLACMENT -> API 检测间接函数调用
- 使用方案 CALL -> JMP -> JMP -> API 检测间接函数调用
- 自动循环检测
- 修复了未成年人的错误
- 代码重新排列
x分析器2.0
- 支持 x64 位
- 支持 x64 位中的 API 调用参数顺序更改
- 支持API调用中的PDB文件额外信息
- 支持直接/间接API调用
- 支持对主模块代码的静态API函数调用
- 修复了定义文件中几个错误的 API 调用参数顺序。现在可以正确检测和评论更多呼叫
- 一些改进和更好的编写代码
- 解决了各种错误
x分析器1.2
- 更新了API的定义文件
- 添加了对 vc6+ 可执行文件的支持
x分析器1.1
- 修复了由于在循环中使用 BASIC_INSTRUCTION_INFO 结构之前/之后未正确清理 BASIC_INSTRUCTION_INFO 结构而未在 VC++ 可执行文件上显示 API 信息的问题
- 添加/更新了 API 的定义文件
- 错误已修复
x分析器1.0
- 初始版本
欢迎各种形式的贡献,不仅可以作为 PR,还可以作为错误报告、文档等。
请记住以下几点:
感谢您使用 xAnalyzer 插件...祝大家逆向快乐!