找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 458|回复: 23

[发布] [26-7-5] binmay 完美版,二进制搜索替换命令工具

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式
本帖最后由 2010hook 于 2026-7-5 00:00 编辑

原作者:Sean Loaring,Slore
原地址:https://github.com/slorelee/binmay

2026-07-04_235637.png

近期,DeepSeek 编程能力增强了,我令其以高级编程专家角色多次优化源码,结果喜人。

一、全局状态彻底整合,消除散落的全局变量
  • 原始版:大量全局变量(verbose、UseBinaryP、pukebuf、plen、matches 等),函数间通过隐式全局通信,测试与复用困难。
  • 优化版:全部状态归入 struct app_config,在 main() 中实例化,通过参数传递。配置文件备份路径、临时文件等字段一清二楚。
  • 收益:逻辑内聚,可重入,为多线程或库化打下基础。


二、内存管理从“用完就扔”升级为“有借有还”
  • 原始版:自制的 f_malloc 内含错误类型转换,且所有动态分配均未释放,完全依赖操作系统回收。出错时直接 abort/exit。
  • 优化版:直接使用标准 malloc 并检查返回值;为所有结构体提供对称的 _new/_free 函数。主流程通过 goto cleanup 确保所有路径释放资源。
  • 收益:零内存泄漏,批量处理上百文件不会耗尽资源,长期运行稳定。


三、错误处理:从“自爆”变成“层层上报”
  • 原始版:大量 abort()、exit(1),遇到任何问题立即终止程序,不留任何恢复余地。
  • 优化版:函数返回值统一为 0 成功 / -1 失败,错误逐层向上传播。main() 根据返回值决定清理和退出码,即使出错也会尝试保留现场。
  • 收益:在批处理脚本中可捕获退出码,不再因单个文件错误而中断整个流程。


四、原地更新(-u/-U)实现了原子写入,杜绝数据损坏
  • 原始版:直接重命名原文件为 .org,然后在原路径上写新文件。若中途失败,原始文件已改名,数据可能永久丢失。
  • 优化版:先输出到临时文件(原文件名.binmay-tmp),所有处理成功后再完成重命名链。失败时保留原文件与临时文件,并在控制台给出明确恢复指令。
  • 收益:符合“原子写入”原则,彻底防止因磁盘满、断电等意外导致文件损坏。


五、I/O 性能大幅提升,适应大文件与长模式
  • 原始版:缓冲区 1KB,搜索/替换模式上限 1KB。处理大文件(如固件镜像)时频繁系统调用。
  • 优化版:I/O 块大小提升至 128KB,模式长度上限同步增至 128KB。首字符匹配滤除大部分。
  • 收益:处理上百 MB 的文件时,性能提升百倍;可应对超长二进制特征码搜索与替换。


六、Windows 平台兼容性专项加固
  • 原始版:完全忽略 Windows 文本模式换行转换问题;错误引入 <sys/unistd.h>。
  • 优化版:启动时通过 set_binary_mode() 将 stdin/stdout/stderr 设为二进制模式(_O_BINARY);使用条件编译处理平台差异。
  • 收益:在 Windows 上彻底避免 0x0A → 0x0D 0x0A 的破坏性转换,保证二进制操作正确性。


七、命令行解析更严谨,用户操作更友好
  • 新增 -h 帮助选项,提供标准帮助入口。
  • -b 强制前置:必须出现在所有字符串参数之前,防止后期参数解析歧义,否则直接报错。
  • 互斥检测:-i/-o 与 -u/-U 不可混用,并给出明确错误提示。
  • 文件名长度检查:使用 sizeof 和 FNAME_MAX 防止缓冲区溢出。
  • 错误信息:输出包含程序名、选项,更符合 GNU 风格。


八、搜索替换引擎算法更精确、更高效
  • 符号位修正:所有位运算操作统一转换为 unsigned char,避免 0x80 以上字节因符号扩展产生错误。
  • 大小写兼容:hex 转换函数 hval 现在同时支持大小写字母 A-F/a-f。
  • 搜索加速:masked_string_seek 增加“首字节快速跳过”判断,不匹配时直接跳过后面的逐字节比较。


九、代码结构清晰化,可维护性飞跃
  • 清除所有未实现的函数声明(open_outfile 等)。
  • 拆分 process_string 为 process_string_default,内部按格式前缀路由。
  • 移除全局依赖,所有函数通过参数获取配置(如 binflag)。
  • 删除残留的调试宏 DEBUG。
  • 将 strcpy/strcat 全部替换为长度受限的 snprintf 或预先校验,杜绝栈溢出。


十、边界条件与空值防御
  • 明确拒绝空搜索字符串,防止逻辑错误。
  • 只给替换不给搜索时直接报错退出。
  • load_file 和 buffered_read 增加 ferror 检测,区分 EOF 与读取错误。
  • fread 返回值判断修正(fread 返回 size_t,不会是负数)。


总结:这是一次工程级重构,在保持原有功能的同时,将可靠性、安全性、可移植性和性能提升到了生产环境标准。

binmay.7z

20.78 KB, 下载次数: 36, 下载积分: 无忧币 -2

TinyCC 编译

发表于 5 天前 | 显示全部楼层
感谢分享,赞~
回复

使用道具 举报

发表于 5 天前 来自手机 | 显示全部楼层
感谢分享辛苦了
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
最近接触最多的是 dUP 的搜索替换功能。它可以使用 ?? 代表通配符,而且可以是间断的。
例如:以其他字节为依据,将 DD 替换为 XX
AA BB ?? DD ?? FF -> ?? ?? ?? XX ?? ??

点评

发出来给我试试  发表于 5 天前
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
功能强大的工具。
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
压缩包内的 binmay.exe 和 binmay2.exe
啥区别

点评

分别为原版和优化版。32位的谁还用?你也别整双版了  详情 回复 发表于 5 天前
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
另外编译的,都是64位版本,,是否也提供下32位版本的
回复

使用道具 举报

发表于 5 天前 来自手机 | 显示全部楼层
谢谢分享binmay 优化版,二进制搜索替换命令工具
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
本帖最后由 chishingchan 于 2026-6-30 20:53 编辑

7.png

搜索模式中的字符也可以用通配符 ?? 来代替!
替换模式中自动将搜索模式中相同的字节使用 ?? 来代替。
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
感谢分享
回复

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
BEIKING 发表于 2026-6-30 20:25
压缩包内的 binmay.exe 和 binmay2.exe
啥区别

分别为原版和优化版。32位的谁还用?你也别整双版了

点评

是这样,我经常用批处理使用这工具修改文件,从通用性来说当然是集成32位的通用  详情 回复 发表于 5 天前
这个不能够绝对!现观还有 %99 软件都是同时支持双架构的,需要跟大势。  发表于 5 天前
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
整理得超用心,这份资源太实用了
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
2010hook 发表于 2026-6-30 22:58
分别为原版和优化版。32位的谁还用?你也别整双版了

是这样,我经常用批处理使用这工具修改文件,从通用性来说当然是集成32位的通用
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
这款软件很实用,感谢楼主大大了
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
能使用命令行?
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
还没用过呢,尝尝鲜
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
支持发布,谢谢

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
感谢楼主分享binmay 优化版!
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
哎呀,还有这么一个命令行下修改二进制文件的工具,现在才知道,惭愧啊。
回复

使用道具 举报

 楼主| 发表于 昨天 16:10 | 显示全部楼层
忍不住发布完美版,聚焦于架构优雅性,无可挑剔。主要改进:

1. 配置结构体 `app_config` 聚拢所有选项,`parse_args()` 独立解析。
2. 统一错误码 `binmay_err` 枚举,所有函数返回明确错误类型。
3. 匹配回调机制:`do_search_replace` 不再混合替换/打印逻辑,而是接受回调,实现策略解耦。
4. 组合构造器 `masked_string_new_from()` 减少未初始化状态。
5. `main` 精简为清晰的流程控制。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层
一股逗包味道。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-7-5 04:32

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表