如何替换在 Windows 窗体中定义的位图和图片?(Win32 Delphi x86)

逆向工程 德尔福
2021-06-26 22:42:09

我知道这似乎是一个非常明显的问题,但请耐心等待。

我有这个用 Borland Delphi 2010 编写的编译游戏可执行文件,它基于 Win32 平台并在 x86 中编译。它使用 Windows 窗体作为 UI。

我大量搜索并使用 Resource Hacker 和 IDR 来完成该程序。两者似乎都能很好地检测所有 Windows 窗体(IDR 好一点),我可以在这里查看原始结构:

在此处输入图片说明

在此处输入图片说明

这里有两种类型的定义:Picture.Data& Bitmap尽管它们仍然是位图,但似乎两者的格式略有不同。

这是一个带有位图的示例表单(form_menu):https ://pastebin.com/raw/r81sJRyq

这是一个带有 Picture.Data (form_submenu) 的示例表单:https ://gist.githubusercontent.com/sjain882/d33e261480d0f13c442ffb4b84d1d1ed/raw/0d188b2ed1673757e512236672/c6736672c8882c673c675c670csubmend

向下滚动到BitmapPicture.Data区域。这里有十六进制图像的 ASCII 表示。事实证明,Delphi 有自己的自定义图像标题,这在 Bitmap 和 Picture.Data(后者是07 54 42 69 74 6D 61 70之间有所不同

然而,这是整个事情的标题,它似乎是一堆位图聚集在一起,在一个 {} 括号区域中。位图本身具有42 4D.

所以...考虑到所有这些信息,我在 IDA Pro 中打开了程序集并搜索了这些标题,许多不同的类型,不同的长度。但我发现的只是这个:

在此处输入图片说明

鉴于这个“标题”之后是什么,我相信它只是一些字符串,高度怀疑它是一个实际的位图。

所以,这让我认为 Windows 窗体在某处有自己的编码,而不仅仅是存储原始位图。

有什么好的方法可以代替这些吗?我真的很感激任何想法。我遇到了如何在 exe 中替换位图(图像)?,但没有什么结果......

如果我可以更改整个窗口形式(如框的尺寸等)和图像格式,以允许透明度/alpha,那也太棒了!

提前致谢!

1个回答

Delphi 使用的不是“Windows 窗体”(一个 .Net 框架),而是一个名为 VCL(可视化组件库)的自定义 UI 框架。表单使用称为 DFM 的格式,并且存在可以提取和编辑它们的编辑器,例如DFM Editor

如果您想手动编辑它们,您可以在 VCL 源代码 (IIRC streams.pas) 中了解表单是如何序列化的位图数据可能存储为原始像素,没有任何标题(宽度/高度等元数据由表单描述提供),这就是您找不到签名的原因。