【问题标题】:QT Applications - Replacing embedded resourcesQT 应用程序 - 替换嵌入式资源
【发布时间】:2016-06-16 18:35:33
【问题描述】:

是否可以替换嵌入式资源 [e.g. Linux [ELF] 二进制文件中的样式、图像、文本]?

我注意到我可以更改文本,但如果我输入更多文本或删除文本,则会出现分段错误。我还没有通过 ELF 规范,但我想知道这是否可能。

我设法使用mediaextract 从二进制文件中提取图像 项目,但我需要在不破坏二进制结构的情况下做相反的事情。

【问题讨论】:

  • 有趣的问题。出于好奇,为什么需要替换的数据不能存储在可执行文件之外?
  • QSS(QT 样式表)资源嵌入在二进制文件中,因此我需要一种方法来替换它们,因为我目前没有源代码
  • 我的意思是 qss 样式类引用的 qrc 条目,例如

标签: c++ linux qt binary


【解决方案1】:

这个答案是针对 Qt 的资源系统(.qrc、rcc)的。

来自the docs:

目前,Qt 总是将数据直接存储在可执行文件中,即使在 Windows、macOS 和 iOS 上,操作系统都提供了对资源的原生支持。这可能会在未来的 Qt 版本中改变。

所以是的,Qt 资源包含在二进制文件中。

rcc'ing .qrc 文件会生成一个 .cpp 文件,其中包含(主要)简单的 char 数组,这些数组表示资源数据、资源名称和其他一些元数据。

编译这样的 .cpp 文件会在二进制文件中创建字节字段。

您可以在二进制文件中更改此类资源,但方式非常有限。

  • 对于初学者来说,如果二进制文件包含任何类型的自检(如散列数据部分并将其与某些预先计算的散列进行比较),您将无法以合理的方式更改数据。

  • 如果您的数据与原始数据的字节长度不同,则不能简单地替换它,因为它会改变二进制文件的内部布局并使相对地址无效。

    李>
  • 如果用较短的字符串替换,最后可能会使用零填充。

资源默认被压缩(ZIP 格式)。可以关闭压缩。

  • 如果在编译期间打开了压缩(您似乎无法控制),您需要创建新数据,将其压缩到与原始数据相同的长度。

【讨论】:

  • 感谢您的回答。通过将图像字节替换为 2 年前的确切字节数,我或多或少地做了我想做的事
  • 我知道这个问题已经存在两年了,但它没有得到解答,并且确实引起了其他人的兴趣(从投票中可以看出)。
  • 两年前我并没有什么不好的意思。非常感谢你的回答。学习更多总是很好
猜你喜欢
  • 2011-01-15
  • 2011-07-05
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 2011-10-30
  • 2010-12-28
相关资源
最近更新 更多