羽云十六进制编辑器 WIKI
写在前面
本页面是对WingHexExplorer2
的引导页面,通知用户当前的项目情况,提供帮助文档的指引。软件v2.0.0
正式版已在2024/12/23
发布,v2.1.0
预计已在2024/2/16
发布。欢迎感兴趣的同志来参与和贡献代码。
目前该项目的 GitHub Pages 已初步上线,后续将逐步完善,该博客将作为国内快速访问的简介入口。
简介
一个自由的强大免费的十六进制编辑器,基于 QT C++ 进行开发,作者是寂静的羽夏。
如有 Bug, 欢迎反馈到 Github 上,如果你访问这有困难的话,也可以反馈到 Gitee 上。如果实在不行,可以通过我的 博客园 上公告栏的任意一种联系方式来告诉我。不过我还是希望你反馈到 Github 上方便我写递交注释的。
开源不易,也欢迎赞助或者参与代码和文档贡献,我默认会将您放入鸣谢标签的内容进行鸣谢。
许可证:AGPL-3.0
该软件经过长时间的迭代,目前成为了一个高自定义性、功能强大的十六进制编辑器。它具有以下功能特点:
- 基础的十六进制编辑查看编辑功能
- 支持打开 TB 级别的超大文件 (仅 64 位程序)
- 支持 标注(颜色标记、书签标记) ,且可以保存为工程文件以下次打开
- 自由定义布局、保存和导出自己常用布局 , 自由切换 不同布局用于不同分析目的
- 支持 克隆编辑 ,在 同一时刻对同一个文件 对不同的地方进行浏览和编辑
- 现代的 Ribbon 菜单 ,方便醒目的找到自己想要的功能
- 十六进制视图自由缩放(Ctrl+滚轮),对标题、地址栏和解码字符串栏可以自由显示和隐藏
- 对常见的数据类型进行实时解码
- 支持校验和计算
- 极速查找字节和 ASCII 字符串
- 友好的标注可视化
- 多选区支持 (按住 Shift 会增加选区,Alt 会裁剪选区。在含有多个选区的情况下,不按住任何键拖放的选区会在鼠标释放按键之后消失。按住 Ctrl 选区会取消原有的选择的内容,同时按住 Shift 和 Alt 视为 Ctrl 的操作)
- 强大的脚本系统 ,用于批量分析二进制数据(AngelScript)
- 强大的插件系统 ,只须头文件就可以开发插件,实现对软件的较高自由度定制和增强,并提供组件注册和基础的脚本系统函数绑定
- 内置脚本编辑器 ,提供代码填充(目前只提供全局函数)和调试功能,并且支持 ClangFormat 对代码进行格式化
- 内置暗黑和浅色主题
最新发布日志
该仓库仅提供基于 QT6 的十六进制编辑器安装包,对于 Windows 采用 InnoSetup 安装包。对于 Linux 采用 run 自解压安装文件进行安装,请在终端使用命令行使用 root 权限进行,若要卸载请到/opt/WingHexExlorer2
下进入终端使用 root 权限执行uninstall.sh
完成卸载。 在 Linux 上,如果你有对应的编译环境,我不推荐使用 run 安装文件方式。 因为为了保证安装包的通用性,我在里面部署了大量的库,包括对应的 glic 和 ld-linux和对可执行文件做了patch
,让文件总体积膨胀,这是一个很不划算的事情。建议使用mkinstaller
下的pyscript
进行安装。
本软件不会以任何理由主动向你收取费用,你通过下载渠道给的费用一分钱也不会到我这里,请注意。
如有 Bug ,请到Github
或者Gitee
提交issue
。如果有功能建议,也可以通过issue
,不过我更建议 到 Github 的 discussion 区提交 。
该工具的定位是对二进制的编辑和分析。欢迎热心的大佬一起共建基础开源工具。
目前只有我一个人开发,我不可能能够把每个功能做好测试,尤其是做 高风险 的操作,点名在 root 权限下操作文件。
我可能不会对每个 Bug 能够积极响应,不过对大家的建议和需求我会尽可能地尽早回复和评估处理。
其实v2.0.0
我原本打算让内置脚本编辑器使用体验很顺滑,主要是代码auto-complete
提示很好用,但由于我精力有限,我只提供了内置公共方法提供了填充支持,对于局部变量类型的支持,我没有做。这个是最麻烦的一件事,首先我得很清楚AngelScript
的编译流程。现在我只是懂得了大概,对于类型推断这个还是挺复杂的。更不幸的是,AngelScript
的语法树生成、变量类型推断和字节码生成被融合在一块,导致我首先为了效率第一步做的就是只保留语法树生成和变量推断的部分。而它生成的信息不足以我去做auto-complete
,我还需要添加一些跟源码绑定的信息才能够正常实现。我甚至为了这件事买了本《编译原理》去研究,但目前项目的热度不足以支持我用爱继续发电把我之前都没做过的这个事情继续做下去。 当然,如果Github
上星过800
,Gitee
星过1000
倒是可以考虑考虑,不过不要刷,星星数目多了也不给我带来什么物质上的东西,:)。
插件版本兼容性
软件版本分为三个部分,对插件重点关注中间的数字,也就是次版本号。当数字发生变化时,那说明插件的 API 发生改变,已经不兼容。对于我想要单文件实现插件开发,我目前没有很好的办法做兼容处理,那就先这样。
更新内容
以下是相对于上一个版本的增强和修复日志:
注意事项
- 历史记录不兼容,请清空原有的历史纪录以避免出现问题
- 原有的插件已经完全不兼容
文件编辑
- 移除对区域文件的支持
- 移除对驱动器打开的支持
- 新增工作区转化功能
- 优化新建文件逻辑
- 修复新建文件导出之后被标记为已保存的问题
- 修复新建文件保存没有正确更新状态
- 修复工作区的保存和导出问题
- 修复工作区加载颜色标注问题
- 新增文件设备驱动插件打开
- 移除十六进制编辑页中故障的字符串非 ASCII 解码
- 增加文字解码的多选区支持
- 修复填充字节和填充空字节只填充一个字节的问题
- 增加多选区的支持
- 元数据编辑机制改为选区模式机制
- 修复文件切换导致文件状态(如撤销)不正确的问题
- 修复克隆文件的机制缺陷问题
- 重构文件搜索显示,修复文字编码修改搜索不应用的问题
- 数值标签页内新增字符串片段显示
- 修改书签的可视化
- 修复书签在每行第一个可视化问题
- 书签可以通过选区删除
- 修复文件历史记录在打开文件不自动记录的问题
- 修复在超出 int 表示范围的地址修改字节得到的结果不对的问题
插件系统
- 重构插件元数据,使其充分发挥作用,能够正确描述插件信息
- 修复插件系统函数因未注册导致调用无响应
- 增加/移除/调整 API 接口以方便维护和扩展
- 修复脚本注册失败导致脚本引擎无法可用的问题
- 修复脚本注册类型转化不正确导致的崩溃或非正确值返回
- 增加脚本注册的校验,以阻止错误的注册
- 新增非安全脚本函数注册,充分拓展脚本功能
- 新增脚本枚举注册
- 更改修复插件编辑组件的注册方式
- 修复插件编辑组件的 API 无作用的问题
- 新增文件设备驱动插件支持
- 插件的文件操作为可撤销操作
脚本系统
- 现在脚本数组可以使用数组样式编写,比如原先必须只能用
array<int>
现在可以int[]
- 增强代码填充功能,修复代码填充问题,支持关键字、已注册类成员和方法填充(变量的类型填充需自己确认)
- 优化重构代码函数提示
- 重构脚本控制台机制
- 移除冗余无效的脚本片段管理器
- 移除几乎无用的断点指示器
- 优化文件保存的变化指示
- 修复代码格式化撤销崩溃的问题
- 修复死循环代码导致程序无响应
- 实现脚本编辑器原本未实现的只读和引号/括号匹配填充
- 修复脚本编辑器因重绘导致的崩溃
- 修复脚本编辑器的光标移动问题
- 优化调试器和调试体验
- 编译的预处理器能够正确的处理 pragma 语句
- 修复脚本控制台能被全选清空的问题
- 增加 assert 和 assert_x 断言功能
- 可视化组件脚本支持鼠标单击和双击事件
- 颜色类支持通过名称来构造
- 移除不兼容的第三方 Json 绑定,使用 QT 的 Json 处理类作为绑定
- 修复文件类的兼容性崩溃,仅保留读取功能
- 修复调用第三方命令函数导致的软件卡死,移除危险的命令
- 现在宏的功能已可以正常使用,可以通过宏判断拓展或者某些功能可以正常使用。
- 修复因代码格式化导致断点丢失和自动滚动到行首
- 优化代码编辑器编辑体验,处于调试状态的脚本将不可编辑
- 修复官方脚本字典类不支持无符号数的缺陷
用户交互
- 更换打开文件系列图标
- Ribbon 菜单下拉菜单提示
- 增大空白填充让 UI 显得不那么拘谨难看
- 启动窗体有了边界
- 新增可视化系列组件的导出功能
- 脚本符号查看器可以排序查看
- 优化颜色标记的显示,使用对比色凸显
- 优化标注元数据信息显示
- 回归状态栏右下角文件状态指示
- 文件编辑页右键菜单增加“显示包含目录”和“文件信息”
- 修复多语言支持的问题
- 新增繁体中文的支持
- 优化开源协议的展示
- 更换程序单例库,以防止在 Linux 上异常退出导致程序无法再次启动的问题
- 给标签和元数据删除和清空增加结果提示
- 修复新加插件的注册组件在程序二次启动会被悬浮的问题
- 新增软件崩溃报告提示(需要编译时带调试符号,否则栈跟踪无法使用)
内置插件
- 新增脚本数组和脚本字典的创建和删除服务
- 新增 WingCStruct,提供基础的 C 风格的二进制分析接口和服务
其他
- Win 上增加 wingpro 文件关联
- 更新上游组件
- 完善测试插件
- 新增共享内存打开测试插件
- 插件模板调整
有关说明
- 移除驱动器和局部文件:虽然是个小遗憾,但我不想花大量精力放到上面了,在我编写调试的时候发现了大量的平台特定的问题,不如直接放手交给社区。你可以实现 设备驱动插件 将这两个功能带回来,这也是为什么我要新增这类插件的原因。
- 脚本编辑器十六进制编辑 ASCII 区域不支持多编码:是这样的了。原先我新增没测试完整就上了,导致因为字体宽度导致溢出,也不能很好的对应字节数量,就又移除了。
- 代码声明的类和方法等提示没有:等 Github 啥时候 star 过千再说。
已知问题或缺陷
软件有些是已知问题,由于影响不大且不好解决的或者不提供支持维护的,就会被列到这里面。我不会主动去尝试修复它,因为我只要列到这里面,对于很多问题,我已经做了大量的尝试,但没有很好的解决。如果是上游问题,等上游解决之后,我有时间的时候同步一下就解决了。如果不是,那就等热心大佬 PR 吧。
对于第 3-4 问题,你可以通过非安全的注册方式来实现,但是,你需要很清楚 AngelScript 的通用调用机制,并且确保你对类型的转化和解引用操作都是正确的,确保返回值指针有效性,因为这个模式下不会有任何检查,否则指针会让你飞起来(感兴趣可以阅读
WingAngelAPI::script_call
相关代码)。
- 32 位程序下运行使用如果有问题:不提供支持,但如果解决,可 PR 。
- 脚本调试时首次断下或者进入函数需要连续按两下才执行:AngelScript 解释器在调试时似乎首次会连续发送相同的消息,导致处理时有问题,我没研究明白,不太想 workaround 了,等上游解决吧。
- 脚本安全注册方式返回值不支持数组和列表:是这样的,这个实现太麻烦了,如果要支持,我只能支持 QVariantList 作为返回值容器,但是,我不一定知道 QVariantList 装的东西是什么,进一步校验和转化也是很麻烦的问题。
- 脚本安全注册方式不支持引用:是这样的,实现方式不支持引用,要引用就需要指针,但我没有提供这个机制,反射也反射不出来。
- 代码提示做的不够好,没那么完美:是这样的,我并不擅长去做代码智能提示。去做好代码提示是一个团队做的事情,而不是整个软件都需要我去做的。AngelScript 的代码提示相关、词法分析相关的就没有 C++ 实现我可以直接去改的。而自己要去做是一个特别苦的一个差事。YACC 我也不太会,我也不想因为这个而带入大量复杂的库。我觉得只要做好基本的,能好用一点就够了。如果你介意,自己去实现,然后测试很好用之后,然后 PR 给我。
- 代码高亮比较一般:原因同
5
。要想很好的代码高亮就需要对代码进行词法分析,而我不擅长做这个,累了,不打算做了。
软件设计
由于软件随着更新越来越复杂,尤其在功能和机制上。为了提高用户体验和使用易用性,大幅度提高了机制的复杂度,这里做一个备忘,也方便大家如果找到软件缺陷时对照。下面的文本说明会随着更新会有调整。
区域机制
你用鼠标选择的字节编辑,以及颜色标记都遵守区域机制。区域机制包含对区域的增减、合并切割。当区域在老的区域编辑时,原有的数据会被覆盖,这个会在颜色标记会有体现。
历史文件机制
软件支持历史文件,历史文件包含着详情信息。当软件启动时,会检查文件是否存在,如不存在则会被自动去除。当软件启动时存在,但打开时不存在,也会被剔除,但会有提示。与此同时,该编辑器新增一个设备驱动插件,用于拓展编辑器支持的打开类型。 对于设备驱动插件打开的文件,将不会存放在历史文件记录中。
历史文件中在菜单中会显示它的图标(注意是文件关联的图标,如果是可执行程序,在 Win 下不是软件的资源图标,而是一个空白图标),不包含路径的文件名以及后续括号里包含的 Mime 类型名。当光标悬浮在菜单项目时,会显示上次打开的详情信息,包含详细路径以及文件相关属性(是否为工程、是否是区间打开等)。
插件机制
这个是程序中最复杂的一个机制,它强力支持了插件开发给软件功能带来的巨大可能性,与此同时保证了一定的安全性。但是,插件是需加载的可执行文件,它由操作系统进行,它并不运行在沙盒中,所以本软件的插件系统并不能保证其所有的安全性。 加载到插件系统的插件将具有等同于主程序的权限,所有的插件都会以主程序的凭证去执行指令。 所以请一定要自行保证插件来源的合法性,不要加载未知插件,不要把程序相关插件目录(plugin 和 devdrv)权限放到普通用户就能修改,保证不要在管理员权限/root权限下加载任何插件。做好这些事就可以基本避免被执行恶意代码的可能性。
当主程序崩溃时,请检查日志。如有非内置插件,请禁用所有插件之后,重复操作排查。插件的开发者需要保证自己的插件质量,做好调试,避免插件的异常连带主程序一起崩溃。
插件是基于 QT Plugin 以及其信号和槽来实现的相关 API,这样做可以保证如有 QT 开发环境,仅需头文件就可以开发相关插件。但这样也给带来了一些特殊限制,因为所有的 API 都是被信号和槽机制控制,你不能像常规插件一样随意调用函数。这种设计可以保证插件的每一个 API 调用都可以被跟踪(虽然我没有具体实现跟踪方式),给管理插件带来了很多方便。
插件机制很多机制,这里仅列常规插件,而非设备驱动插件,因为它还是太简单了。
元数据加载机制
每个插件都会有一个由 json 文件表达的元数据,里面包含了该插件在未加载插件系统就应该知道的插件信息。通过这些信息,插件系统就可以决定是否要加载插件,以及处理插件依赖问题。
插件应该包含的信息如下(以测试插件为例):
{
"Id": "TestPlugin",
"Version": "0.0.1",
"Vendor": "WingCloudStudio",
"Dependencies": [
],
"Author": "wingsummer",
"License": "AGPL-3.0",
"Url": "https://github.com/Wing-summer/WingHexExplorer2"
}
- Id:必须。是插件唯一标志符,只能由字母、数字和下划线组成,并且开头不能是数字,为插件系统自动加载多语言支持的依据。这个规则是和 C 语言标志符是一样的。
- Version:必须。插件版本。
- Vendor:可选。生产商。这个通常用来填写组织名或者公司名。
- Dependencies:可选。依赖。如果插件必须依赖其他其他插件的服务,则在这里填写,依赖的格式如下:
{
"Id" : "SomeOtherPlugin",
"Version" : "2.3.0"
}
- Author:可选。作者名。
- License:可选。协议名。建议不要把协议详情写到里面了。
- Url:可选。网页地址。可以用于填写主页网址用作宣传或者提供下载服务。
插件加载机制
插件经过校验通过之后,会创建插件实例。创建完毕后,为插件开通基础 API(日志相关以及 UI 相关),然后调用插件初始化函数,初始化完毕后,就开始执行相应的注册命令,开通所有 API 供插件使用。
详细的加载机制就不再赘述。
插件事件注册机制
插件系统提供了事件注册功能,每个事件会对应某个回调函数。如下是支持的事件:
enum class RegisteredEvent : uint {
None, // 无事件
AppReady = 1u, // 主程序就绪
AppClosing = 1u << 1, // 主程序正在关闭
SelectionChanged = 1u << 2, // 选区发生改变
CursorPositionChanged = 1u << 3, // 光标位置发生改变
FileOpened = 1u << 4, // 文件打开
FileSaved = 1u << 5, // 文件保存
FileSwitched = 1u << 6, // 当前文档被切换
FileClosed = 1u << 7, // 文件被关闭
ScriptPragma = 1u << 8, // 脚本编译触发到需要自己处理的 pragma
PluginFileOpened = 1u << 9, // 文件被打开(插件调用 API,只有自身的事件)
PluginFileClosed = 1u << 10, // 文件被关闭(插件调用 API,只有自身的事件)
ScriptUnSafeFnRegistering = 1u << 11, // 启用不安全脚本函数注册
};
插件服务机制
所有的插件都可以注册独属于自己的服务。这个服务由 QT 的反射机制提供支持。只需要在需要注册的服务函数声明前添加WING_SERVICE
即可。
当前文档机制
主程序会有自己的当前文档,插件的当前文档可以和主程序保持一致,也可以保持不一致。插件所有的文档操作都是在当前文档进行的。
插件文件机制
当插件想要进行写文档内容时,必须需要先打开获取句柄。获取句柄之后就可以写内容了。对于和主程序当前文档进行读操作和非需合并操作,无需打开获取句柄进行读写。
插件 API 机制
插件加载时的插件 API 机制看加载部分。除文件读写 API,其他所有的都要在主线程操作,也就是非异步,否则会被拒绝。只有文件读写可以异步处理,并且保证原子性。
脚本函数注册机制
插件可以给 AngelScript 脚本注册函数,不过目前支持的还是比较有限的。
FAQ
-
为啥不在搜索结果增加筛选排列功能(其他表格类控件同理):
答:功能很好,但是在数据量很大的情况下,很卡,但我没有精力和经验来处理这个事情。 -
在 Linux 下我直接 clone 仓库编译不通过:
答:如果你 QT 和 CMake 都装好的话,本软件使用的布局组件 Qt-Advanced-Docking-System 有依赖需要装好,请详细看一下它的 ReadMe。当然你也要注意你的 QT 版本。 -
该软件和 WingHexExplorer 有什么区别,我还可以继续使用 WingHexExplorer 这个软件吗?
答:新版软件具有更强大的布局组件、跨平台和 UI 统一性。功能上自带 AngelScript 脚本引擎,相比于 Python 可能会有更好的 API 兼容性和速度(未测试),并且可以具有更好的 API 权限管控,会更安全一些。还有它更擅长处理多文件编辑,你可以对同一个文件同时在不同位置进行预览/编辑,这就是“克隆”功能。十六进制编辑器还增加了 Ctrl + 鼠标滚轮原生缩放支持。该软件对任意编辑中的文件窗体隐藏,哈希值计算,对书签更好的可视化以及标记的可视化和更好的插件支持,以及进一步的 Bug 修复。在 v2.0.0 规划完成发布之后,还会有深度配合的代码编辑器和调试器,正好是一个小型的 AngelScript IDE。这些都是 WingHexExplorer 软件所不具备的功能,这里还有很多小细节没说,这个软件会更加专业,也会更加好用。
WingHexExplorer 这个软件仍旧是能用的,但还是有点小 Bug,只要你不是深度使用是不会有问题的,比如预览和简单的编辑普通文件。但它有 Bug,我也不会去修了。 -
该软件和 WingHexExplorer 兼容吗?
答:项目文件是可以兼容的,但插件还是按照老约定,采用不兼容处理,因为变化太大了。 -
为什么不能够在有标注的情况下增删字节?
答:因为内部是通过偏移决定标注的渲染,你增删了但我没有额外处理肯定会偏移导致不准了,这需要你手动修改了。不过在 v2.0.0 规划中决定完善这个功能,解除这个限制提醒。
版本规划
v3.0.0
版本是 “赞助” 版本,当收到的指定赞助金额满足一定程度来开发该功能时,我将主动花费我的业余时间来完成这件事情。当然 PR 也是可以算作“赞助内容”,毕竟是贡献代码,以下所有的功能都接受 PR 。如果你想要通过赞助金额来支持该项目来开发功能的话,请注明备注该任务名称,我将会在该篇日志更新,金额达到之后就开始进入排队开发。如果注明仅 PR 的,则不接受金额赞助开发。一旦受赞助的功能开始开发,原则上不退款。这些赞助内容将会以 AGPL-3.0 开源发布。 目前考虑到的内容如下:
- 尝试增加 AngelScript 对 QT 用户界面组件的绑定尝试,可以通过脚本实现插件。(若指明赞助该功能 450 RMB,增加窗体、标签、按钮、文本框支持,其他暂不支持,除非 PR)
- 为脚本解释器增加 JIT。(目前仅 PR)
- 类似 QtCreator 的代码提示和填充。(仅 PR)
- 更多的 AngelScript 脚本模块标准库。(仅 PR)
- 为 AngelScript 增加宏的条件编译,拓展宏的功能。(100 RMB)
- 打开操作系统内的进程。(100 RMB)
- 脚本运行更好的报错。(100 RMB)
- 更好的脚本调试器。(120 RMB)
- 外部可自定义主题以及可更换图标。(100 RMB)
- 该软件提供的 AngelScript addon 提供完全的 Generic Call 支持。(100 RMB)
- 脚本设置页代码高亮样式可以实现使用用户界面进行新建编辑。(100 RMB)
- 插件注册脚本函数更强大的类型支持。(200 RMB)
- 脚本编辑器的代码片段管理器支持。(100 RMB)
- 更好的代码高亮。(仅 PR)
当然也可以通过赞助来让我开发插件,插件可以选择开源和闭源,但如果赞助低于 500 RMB的,插件仅可选择开源,但可以自选开源基金会认可的开源协议。
目前测试插件还没有完全完成,因为我比较忙, 最近半个月我将不会软件主体相关部分 ,插件和文档相关内容也不会很快跟上。过了 2025/1/5 之后, 我暂定一月一更新,如果没有 Bug 就下一个月。如果有恶性 Bug 一周一更,暂且就这样了 。
帮助文档
目前推荐 Github,不过目前仍处于编辑开发状态,还是不全。Gitee 我也同步上去了,但是,若图显示不出来,请启用Github
加速工具(比如Watt ToolKit
或者devSideCar
等),因为图片链接来源于Github
。
发行版下载
Github: https://github.com/Wing-summer/WingHexExplorer2/releases
Gitee: https://gitee.com/wing-cloud/WingHexExplorer2/releases
本文来自博客园,作者:寂静的羽夏 ,一个热爱计算机技术的菜鸟
转载请注明原文链接:https://www.cnblogs.com/wingsummer/p/18286419
