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 语法搜索)

相关推荐
M78佐菲9 小时前
c语言学习笔记:排序与查找方法整理
linux·c语言·笔记·学习·算法
ltl10 小时前
QUIC 协议拆解(上):为什么 TCP 改不动了
linux
Linux-lucky11 小时前
28-Linux学习之旅之Maven与Nexus制品库
linux·运维·学习·nginx·tomcat·maven
敲代码还房贷14 小时前
VMware17 + Ubuntu22.04 共享 完整步骤
linux·python·ubuntu
King of fraud14 小时前
Linux 下 MySQL 基础操作:创建用户、数据库与权限管理实战
linux·数据库·mysql
实心儿儿15 小时前
Linux —— 传输层协议TCP
linux·服务器·tcp/ip
祖力5515 小时前
Linux应用软件编程:目录IO与framebuffer
linux·运维·算法·framebuffer·目录io
词却15 小时前
Linux基础:常用基本命令与软件包管理
linux
2401_8906034016 小时前
Linux 进程控制
linux·运维·服务器
啦啦啦啦啦zzzz17 小时前
时间轮定时器
linux·服务器·网络·c++·定时器