ThunderCls/xAnalyzer

GitHub: ThunderCls/xAnalyzer

xAnalyzer 是 x64dbg 的代码分析增强插件,通过丰富的 API 定义库为调试会话提供函数参数、数据类型等静态分析信息,显著提升逆向工程效率。

Stars: 1189 | Forks: 120

[![欢迎贡献](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/ThunderCls/xAnalyzer/issues) [![构建状态](https://ci.appveyor.com/api/projects/status/6uabw25xqmkw6tat?svg=true)](https://ci.appveyor.com/project/ThunderCls/xanalyzer) [![GitHub 发布](https://img.shields.io/github/release/ThunderCls/xAnalyzer.svg?label=latest+release&maxAge=60)](https://github.com/ThunderCls/xAnalyzer/releases/latest) [![Github 发布](https://img.shields.io/github/downloads/ThunderCls/xAnalyzer/latest/total.svg?label=latest+downloads)](https://github.com/ThunderCls/xAnalyzer/releases/latest) [![Github 所有发布](https://img.shields.io/github/downloads/ThunderCls/xAnalyzer/total.svg?label=total+downloads)](https://github.com/ThunderCls/xAnalyzer/releases) [![GitHub stars](https://img.shields.io/github/stars/ThunderCls/xAnalyzer.svg?style=flat&label=stars)](https://github.com/ThunderCls/xAnalyzer/stargazers) [![license](https://img.shields.io/github/license/ThunderCls/xAnalyzer.svg?label=license&maxAge=86400)](https://github.com/ThunderCls/xAnalyzer/blob/master/LICENSE) **xAnalyzer** 是由 @mrexodia 开发的 x86/x64 x64dbg 调试器插件。该插件基于 @mrfearless 的 [APIInfo Plugin](https://github.com/mrfearless/APIInfo-Plugin-x86),并在此基础上进行了一些改进和扩充。**xAnalyzer** 能够对被调试应用程序的静态代码进行多种类型的分析,从而为用户提供更多额外信息。该插件将进行广泛的 API 函数调用检测,以添加函数定义、参数和数据类型以及任何其他补充信息,这类似于 OllyDbg 分析引擎所提供的功能,以便在开始调试任务之前让用户更易于理解。 ## 目录 - [功能特性](#features) - [下载](#download) - [安装说明](#installation) - [配置](#configuration) - [使用方法](#usage) - [API 定义文件](#api-definition-files) - [已知问题与限制](#known-issues-and-limitations) - [长期待办事项](#to-do-long-term) - [版本历史](#version-history) - [贡献指南](#contributing-guidelines) ## 功能特性 主要功能和改进包括: - 扩展的函数调用分析(涵盖近 200 个 DLL 的超过 13,000 个 API 定义) - 已定义和通用的函数、参数、数据类型及额外调试信息的识别。 - 自动循环检测。 - 用户可维护的定义文件。 xAnalyzer 使用前

xAnalyzer 使用后

## 下载 在[此处](https://github.com/ThunderCls/xAnalyzer/releases/latest)下载最新版本的二进制文件 ## 安装说明 1. 下载最新版本的 [x64dbg](https://github.com/x64dbg/x64dbg/releases/latest) 2. 解压 *apis_def.zip* 3. 将 *xAnalyzer.dp32/xAnalyzer.dp64* 以及 *apis_def* 文件夹复制到 x64dbg 相应的插件目录中 4. 在 x64dbg 主窗口的 "*Plugins*"(插件)菜单或反汇编窗口的二级菜单中查找 "*xAnalyzer*" 条目 * 如果按照上述步骤操作后,在 "*Plugins*" 菜单下仍看不到菜单项,请转到 "*Log*"(日志)选项卡,查看来自插件的任何消息,这些消息可能会为您提供解决错误的提示 ## 配置 xAnalyzer 提供了一些选项供用户选择,以便进一步个性化使用体验,让您在需要时以期望的方式使用它。插件选项如下: - **自动分析 (Automatic Analysis)**:当此选项开启时,每当调试器加载并到达入口点时,插件将对可执行代码启动完整的自动分析。通过使用此选项,您可以在 x64dbg 上获得更接近 OllyDbg 初始分析的行为体验。 - **扩展分析 (Extended Analysis)**:此选项将强制 xAnalyzer 对被调试可执行文件的整个代码段进行扩展分析。 *警告!!!启用此选项可能会导致分析过程消耗更多的时间和资源来完成,并且根据被调试可执行文件静态反汇编的节大小和添加的额外数据量,x64dbg 可能会占用大量 RAM 内存* - **分析未定义函数 (Analyze Undefined Functions)**:通过选择此选项,xAnalyzer 将对所有那些未在 API 定义文件中定义的 API 调用/函数使用通用分析和参数类型,以及如下调用: ``` CALL {REGISTER} CALL {REGISTER + DISPLACEMENT} CALL {DYNAMIC_POINTER} ``` ## 使用方法 在处理可执行文件时,xAnalyzer 提供了一些命令和菜单选项供选择: ### 分析选中区域 通过在 x64dbg 的反汇编窗口中选择多条指令并选择此菜单,将对选中的行进行快速分析。您也可以使用命令 *xanal selection* 来启动此选项,甚至可以在 x64dbg GUI 中为其设置自定义热键。

### 分析函数 如果您正处于某个函数中间,可以使用此菜单项来分析整个函数,且仅分析该函数。xAnalyzer 将以您选中的单条指令为参考,从那里开始处理代码块内的所有行。您也可以使用命令 *xanal function* 来启动此类分析,甚至可以在 x64dbg GUI 中为其设置自定义热键。

### 分析模块 此命令将对整个模块启动完整分析。此功能会考虑 **扩展分析** 选项来决定分析的深度。您也可以使用命令 *xanal module* 来执行此操作,甚至可以在 x64dbg GUI 中为其设置自定义热键。 ### 移除分析菜单 在这些情况下,所有这些菜单将执行与先前命令相反的操作。如果您希望摆脱代码某些部分或整个可执行文件中的分析额外信息,可以使用这些选项。您也可以使用命令:*xanalremove selection/function/module* ## API 定义文件 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"。最后是所有的变量名称和值。 如果您发现某个 API 调用定义未被 xAnalyzer 检测到或检测不正确,这可能意味着它不存在于定义文件中或定义不正确,因此在这种情况下,只要遵循相同的结构,就可以添加或修改以包含任何缺失的函数或参数,实现 100% 的可定制性。 ## 已知问题与限制 - 函数中第一个带有通用参数的未定义调用将不会被处理,除非它前面有一个跳转指令,因为如果不非法使用函数 prolog 指令,就无法判断要使用多少个参数。在函数开头只会处理已记录的调用,或者前面有跳转的未定义函数。 - 一些“非通用”函数的参数分布在跳转之间,因此根据插件当前的设计(函数参数之间不跨越跳转),这些调用将不会被处理,因为每次遇到跳转时,堆栈中的指令都会被清除。 - 嵌套调用仅在以下情况下才能正常工作: 1-) 内部调用已定义
2-) 如果内部未定义调用从堆栈中获取的参数不多于外部调用所需的参数 - 它仅检测函数内部的循环(函数边界 Prologs/RETs)。如果一个函数在其代码中间包含一个 RET,它将被检测为函数结束,并且循环堆栈将被清除。 - 如果被调试的可执行文件名称中包含多个点,分析可能会失败 - 对于内部包含非条件跳转的节,循环检测可能不正确(参见 [#7](https://github.com/ThunderCls/xAnalyzer/issues/7)) - 嵌套参数行(xAnalyzer 支持嵌套参数,但 x64dbg 目前不支持) ## 长期待办事项 - 添加熵分析 - 流分析扫描而非线性扫描(跟踪模拟) - Case-Switch 检测 ## 版本历史 ***xAnalyzer 2.5.4***
*- 更新项目至 VS2017*
*- 修复了处理涉及堆栈指针 (ESP) 的参数指令时的问题 (x64 版本)。*
*- 修复了涉及堆栈指针的参数顺序不正确的问题 (x64 版本)。*
*- 修复了未定义函数参数识别中的错误,该错误导致寄存器被重复识别为不同的参数 (x64 版本)*
*- 更改了未定义调用参数识别,默认情况下最多只预测 4 个未定义参数 (x86 版本)*
*- 一些代码重构*
***xAnalyzer 2.5.3***
*- 修复了在较新版本 x64dbg 中的函数名检测问题*
***xAnalyzer 2.5.2***
*- 使用当前选中的反汇编行进行模块分析,而不是 cip*
*- 修改了插件条目中的一些输入*
*- 一些代码重构*
*- 将命令 "xanal/xanalremove exe" 修改为 "xanal/xanalremove module"*
***xAnalyzer 2.5.1***
*- 修复了 mov 指令变体导致的崩溃*
***xAnalyzer 2.5.0***
*- 移除了 [EBP+/-] 指令作为可能的函数调用者参数*
*- 移除了所有函数参数值的 "0x" 前缀,因为默认推断为十六进制*
*- 修复了指针变量无法正确显示为指针而是显示为基础数据类型的参数问题*
*- 增加了对堆栈指针 (ESP) 作为函数调用可能参数的识别 (x86)*
*- 在参数中使用准确的数据类型名称,而不是通用/基础数据类型名称*
*- 增加了函数智能跟踪功能(智能预测和识别间接函数调用,如:CALL {REGISTER}, CALL {POINTER})*
*- 增加了作为参数的函数指针名称(如果检测到,将使用完整的函数名称,而不仅仅是地址)*
***xAnalyzer 2.4.3***
*- 增加了对 x86 上 MOV 指令的识别*
*- 增加了对带有 "Stub" 后缀的函数的识别*
*- 修复了 "auto analysis"(自动分析)中的错误(增加了更多 EP 检查条件)*
*- 默认选中清除 Auto Comments/Auto Labels 选项*
***xAnalyzer 2.4.2***
*- 修复了当参数标志注释超过 MAX_COMMENT_SIZE 时的 BoF (缓冲区溢出)*
*- 修复了当定义位于第二个 .api 文件时函数名搜索的错误*
***xAnalyzer 2.4.1***
*- 增加了新的热键方案*
*- 增加了新选项以控制应清除哪些先前的分析数据。(这使得与 map loader 插件如 SwissArmyKnife 等无缝协作成为可能)。*
*- 增加了新命令(旧命令已被弃用)*
*xanal selection : 执行选中区域分析*
*xanal function : 执行函数分析*
*xanal exe : 执行整个可执行文件分析*
*xanalremove selection : 移除先前的选中区域分析*
*xanalremove function : 移除先前的函数分析*
*xanalremove exe : 移除先前的整个可执行文件分析*
*xanal help : 在日志窗口显示帮助文本*
*- 修复了启动时未启动自动分析的问题 (Closes #18 )*
*- 修复了各种 API 定义文件 (Closes #17 )*
***xAnalyzer 2.4***
*- 全新且改进的 API 定义文件,采用略微修改的方案(涵盖近 200 个 DLL 的 13,000 个 API)*
*- 识别每个 API 定义参数所使用的符号(1000+ 枚举数据类型和 800+ 标志)*
*- 识别参数数据类型 (BOOL, NUMERIC, NON-NUMERIC)*
*- VB "DllFunctionCall" stubs 检测*
*- 作为参数传递的字符串现在更干净了(调试器注释现在去掉了地址部分)*
*- 在日志窗口添加了执行摘要*
*- 移除了热键功能(将在未来的修订版中加入),原因是与 x64dbg 存在一些冲突*
*- 修复了错误*
***xAnalyzer 2.3.1***
*- 修复了在选中单行的情况下启动 "Analyze Selection" 菜单导致 dbg 突然异常的错误 (感谢 @blaquee)*
*- 在加载插件之前检查定义文件文件夹 "apis_def" 及其中的定义文件是否存在*
*- 将热键更改为 Ctrl+Shift+X 用于选中区域,Ctrl+X 用于函数*
***xAnalyzer 2.3***
*- 增加了选项 "Analyze undefined functions"(分析未定义函数)。(默认关闭,任何不在定义文件中的内容都不进行分析)*
*- 增加了选项 "Automatic analysis"(自动分析)(默认关闭,在调试器启动时于被调试可执行文件的 EP 处进行分析)*
*- 增加了功能 "Analyze Selection"(分析选中区域)(对选中的指令进行分析,支持多个选中的调用)*
*- 增加了功能 "Analyze Function"(分析函数)(从选定的地址自动发现并分析当前函数)*
*- 增加了功能 "Remove Analysis"(移除分析),可针对 Selection/Function/Executable*
*- 增加了命令快捷方式*
*- 增加了新图标*
*- 增加了将配置保存到 .ini 文件的功能*
*- 十六进制参数值大写化*
*- 重构了功能 "Analyze Executable"(分析可执行文件)(对当前可执行文件进行完整分析)*
*- 重构了菜单*
*- 新的“关于”对话框现在显示版本号以便跟踪更新*
*- 一些小错误修复*
*- 修复并合并了一些 API 定义文件*
*- 速度和稳定性改进*
***xAnalyzer 2.2***
*- 增加了分析进度指示器*
*- 增加了新的分析深度模式*
*- 现在只有在不存在备份数据库时才执行自动分析*
*- 修复了错误*
***xAnalyzer 2.1***
*- 针对未定义函数和内部子程序的通用参数*
*- 智能函数注释和参数(仅处理堆栈上有参数的函数)。这允许 xAnalyzer 通过仅处理和注释那些具有实际参数的函数,从而提供更清晰的代码视图*
*- 检测具有 CALL -> DYNAMIC_MEMORY -> API 模式的间接函数调用*
*- 检测具有 CALL -> REGISTER/REGISTER + DISPLACEMENT -> API 模式的间接函数调用*
*- 检测具有 CALL -> JMP -> JMP -> API 模式的间接函数调用*
*- 自动循环检测*
*- 修复了小错误*
*- 代码整理*
***xAnalyzer 2.0***
*- 支持 x64 位*
*- 支持 x64 位下 API 调用参数顺序的变化*
*- 支持 API 调用中的 PDB 文件额外信息*
*- 支持直接/间接 API 调用*
*- 支持对主模块代码的静态 API 函数调用*
*- 修复了定义文件中几个错误的 API 调用参数顺序。现在可以正确检测和注释更多调用*
*- 一些改进和更优的代码编写*
*- 解决了各种错误*
***xAnalyzer 1.2***
*- 更新了 API 定义文件*
*- 增加了对 vc6+ 可执行文件的支持*
***xAnalyzer 1.1***
*- 修复了由于在循环中使用 BASIC_INSTRUCTION_INFO 结构之前/之后未正确清理而导致无法在 VC++ 可执行文件上显示 API 信息的问题*
*- 添加/更新了 API 定义文件*
*- 修复了错误*
***xAnalyzer 1.0***
*- 初始发布* ## 贡献指南 欢迎各种形式的贡献,不仅是 PR(拉取请求),也包括错误报告、文档等。 请牢记以下几点: - **错误报告**:确保您运行的是最新版本的插件和 x64dbg,同时确保除了 xAnalyzer 插件外没有加载其他插件。如果问题仍然存在:请提交一个记录清晰的问题,包含明确的标题和尽可能多的信息,以便复现问题并予以解决。 感谢使用 xAnalyzer 插件……祝大家逆向工程愉快!
标签:API调用检测, Conpot, DAST, OllyDbg替代, UML, Windows安全, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 代码分析, 凭证管理, 函数参数识别, 客户端加密, 客户端加密, 快速连接, 恶意软件分析, 插件开发, 汇编语言, 调试器插件, 软件开发, 逆向工程, 静态分析