在 Windows 系统中,二进制文件(如 .exe
或 .dll
)的“详细信息”属性(如文件描述、版本、版权等)存储在版本信息资源(Version Information Resource)中。要修改这些属性值(例如将字段 A
改为 B
),需要通过以下步骤操作:
方法 1:直接修改 .rc
资源文件并重新编译
适用场景
- 你有源代码和编译环境(如 Visual Studio)。
- 需要永久修改属性。
步骤
找到资源脚本文件(
.rc
)
通常在项目中包含类似resource.rc
的文件,其中定义了版本信息块。修改字符串字段
在StringFileInfo
块中,将目标属性值从A
改为B
:BEGIN
BLOCK "040904b0" // English (US), Unicode
BEGIN
VALUE "FileDescription", "Original Value A\0" // 改为 "New Value B\0"
VALUE "CompanyName", "Old Company\0" // 其他字段...
END
END
重新编译项目
编译器会将更新后的资源嵌入到二进制文件中。
方法 2:动态修改已存在的二进制文件
适用场景
- 没有源代码,需直接修改已编译的二进制文件。
- 注意:会破坏数字签名,需重新签名。
步骤(使用 Win32 API)
使用
BeginUpdateResource
打开文件HANDLE hUpdate = BeginUpdateResource("target.exe", FALSE);
if (hUpdate == NULL) {
DWORD err = GetLastError();
// Handle error...
}
准备新的版本信息数据
需要生成一个完整的版本信息资源块(格式与.rc
相同)。可以通过以下方式:- 手动构造:按 MSDN Version Information Structure 格式填充二进制数据。
- 替换字符串表:提取原资源,修改特定字段后回写。
更新资源
// lpData: 指向新版本信息数据的缓冲区
// dwSize: 数据大小
if (!UpdateResource(
hUpdate,
RT_VERSION, // 资源类型为版本信息
MAKEINTRESOURCE(VS_VERSION_INFO), // 资源ID
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), // Language ID
lpData,
dwSize)) {
DWORD err = GetLastError();
// Handle error...
}
提交更改并关闭句柄
if (!EndUpdateResource(hUpdate, FALSE)) { // FALSE = Apply changes
DWORD err = GetLastError();
// Handle error...
}
关键注意事项
权限要求
需管理员权限才能修改其他用户的二进制文件。备份文件
直接修改二进制可能损坏文件,建议提前备份。数字签名失效
修改后会破坏签名,需用signtool.exe
重新签名:
signtool sign /fd sha256 /a /f mycert.pfx /p password target.exe
- 工具推荐
- *Resource Hacker*:可视化编辑二进制文件的资源。
- *Visual Studio*:内置资源编辑器。
完整示例代码
如果需要动态替换文件中某个特定字段(如将 CompanyName
从 “A” 改为 “B”),可以结合:
GetFileVersionInfo
+VerQueryValue
(读取原值)。- *构造新数据*后调用
UpdateResource
.
提供具体需求字段后,我可给出针对性代码片段!
内容由零声教学AI助手提供,问题来源于学员提问