rpmrebuild

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):

👉 rpmrebuild - GitHub

(由于是 Fork 仓库,GitHub 默认搜索不到,请直接点击链接或使用 fork:true 语法搜索)

相关推荐
AlfredZhao1 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3102 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
A小辣椒4 天前
TShark:Wireshark CLI 功能
linux
A小辣椒4 天前
TShark:基础知识
linux
AlfredZhao4 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao5 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334665 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪5 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql