1.工具简介:rpmrebuild
rpmrebuild是一款经典的LinuxRPM包逆向与重构工具。
它的核心能力在于:在没有源代码(SRPM)的情况下,直接对已有的二进制.rpm包进行拆包、编辑和重新打包。
在进行软件跨平台移植、安全组件二次适配或临时修改某些内置配置文件时,如果你手头只有一个打好的二进制包,利用它的--edit-whole或--change-files等功能,可以非常方便地进入沙箱修改文件并原地生成新包。
2.踩坑与报错排查
在最近处理一批由第三方跨平台工具打出来的RPM包时,发现官方原生版本的rpmrebuild存在两个严重的问题:
问题一:解包阶段直接崩溃,报错rpm2cpio:Nosuchfile
报错表现:
执行拆包命令时,工具直接报错退出:
rpm2cpio::Nosuchfileordirectory
(RpmUnpack)rpm2cpiofailed,tryingrpm2archive,thismighttakelongtime
原因分析:
使用strace抓取底层系统调用后发现,传给rpm2cpio的参数是个空字符串。翻阅官方rpmrebuild.sh源码发现这是一个低级的变量名Bug:原作者在重构解压模块的RpmUnpack函数时,误将存储包路径的全局变量$RPMREBUILD_PAQUET写成了未被赋值的$PAQUET。
处理方案:
在源码中将相关的$PAQUET变量彻底修正为正确的$RPMREBUILD_PAQUET。
问题二:跨架构(非标架构)打包报错setarch:未识别的架构
报错表现:
当处理一些带有amd64(Debian系惯用命名)或aarch64标签的跨平台包时,工具会报错:
setarch:amd64:未识别的架构
#或者在rpmbuild阶段报错:
错误:没有找到可供构建的兼容构架
原因分析:
rpmbuild拥有极其严格的构建环境校验(会去查对/usr/lib/rpm/rpmrc字典),它默认不认识amd64这种非标称呼。而rpmrebuild脚本试图调用setarch去模拟环境,在真正的异构或非标命名面前直接失效报错。
处理方案:
对源码进行深度改造。彻底废弃了原脚本中脆弱的setarch逻辑,并在参数解析器中原生引入了--force-arch参数。其底层逻辑是:在动态生成SPEC文件后,使用sed强行删除BuildArch属性让rpmbuild失去校验基准,随后通过命令行参数将用户指定的target和宏变量强行注入,实现无视宿主机物理架构的"强制交叉重打包"。
3. 开箱即用的修复版获取
如果你也遇到了上述报错,或者需要处理复杂的跨架构RPM包重构,为了避免浪费时间去踩这些上古bash脚本的坑,可以直接使用我修复并增强后的版本。
增强版主要特性:
修复了空变量导致解压失败的致命Bug。
原生引入--force-arch=<arch>参数,完美绕过rpmbuild的严苛校验,实现 amd64等非标架构或异构架构的直接重压包
获取方式(GitHub):
(由于是 Fork 仓库,GitHub 默认搜索不到,请直接点击链接或使用 fork:true 语法搜索)