ZBLOG

二进制文件新增原本没有的属性

在 Windows 二进制文件(如 .exe.dll)中新增原本不存在的属性,需要直接修改其版本信息资源(Version Information Resource)。以下是具体方法和注意事项:


方法 1:通过资源脚本(.rc)重新编译

适用场景

  • 你有源代码和编译环境(如 Visual Studio)。
  • 需永久添加新属性。

步骤

  1. 编辑 .rc 文件
    StringFileInfo 块中添加新字段:
    1. VERSIONINFO
    2. FILEVERSION 1,0,0,0
    3. PRODUCTVERSION 1,0,0,0
    4. BEGIN
    5. BLOCK "040904b0" // English (US), Unicode
    6. BEGIN
    7. VALUE "OriginalField", "Value\0" // 原有字段
    8. VALUE "NewCustomField", "NewValue\0" // 新增自定义字段
    9. END
    10. END
  2. 重新编译项目
    编译器会将新字段嵌入二进制文件。

方法 2:动态修改已存在的二进制文件

适用场景

  • 无源代码,需直接操作二进制文件。
  • 注意:会破坏数字签名。

步骤(使用 Win32 API)

  1. 检查现有版本信息
    GetFileVersionInfo + VerQueryValue 确认是否已有版本资源:

    1. DWORD dummy;
    2. DWORD size = GetFileVersionInfoSize("target.exe", &dummy);
    3. if (size == 0) {
    4. // 无版本信息块,需从头创建
    5. }
  2. 构造新的版本信息资源
    若原文件无版本信息或需新增字段,需手动构造完整的资源数据。
    格式参考:MSDN Version Information Structure

  3. 更新资源
    使用 BeginUpdateResource + UpdateResource: “`cpp HANDLE hUpdate = BeginUpdateResource(“target.exe”, FALSE);

// lpData: 指向包含新字段的完整版本信息数据(VS_VERSIONINFO结构) UpdateResource(

  1. hUpdate,
  2. RT_VERSION,
  3. MAKEINTRESOURCE(VS_VERSION_INFO),
  4. MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
  5. lpData,
  6. dwSize);

EndUpdateResource(hUpdate, FALSE);

  1. ---
  2. ### *关键细节*
  3. 1. **数据结构要求**
  4. 新增字段必须符合 `VS_VERSIONINFO` 结构,包括:
  5. - `StringFileInfo`:字符串表(如 `040904b0`)。
  6. - `VarFileInfo`:语言和编码标识。
  7. 2. *示例新增字段*
  8. 假设原文件无任何属性,新增一个自定义公司名:
  9. ```rc
  10. VERSIONINFO
  11. FILEVERSION 1,0,0,0
  12. BEGIN
  13. BLOCK "040904b0"
  14. BEGIN
  15. VALUE "CompanyName", "ZeroSound Education\0"
  16. VALUE "CustomField", "Added Dynamically\0"
  17. END
  18. END
  1. 工具辅助
  • *Resource Hacker*:可视化添加字段。
  • *Visual Studio*:右键 .exe → Properties → Details → Edit via .rc.
  1. 签名问题
    修改后需重新签名:
  1. signtool sign /f mycert.pfx /p password target.exe

完整代码片段

若需要动态构造并插入全新版本信息块,可参考以下伪代码逻辑:

  1. // 1. Build VS_VERSIONINFO structure manually (binary format)
  2. BYTE* lpData = BuildCustomVersionInfo("MyApp", "2.0", ...);
  3. // 2. Update binary file
  4. HANDLE hRes = BeginUpdateResource("app.exe", FALSE);
  5. UpdateResource(hRes, RT_VERSION, ..., lpData);
  6. EndUpdateResource(hRes, FALSE);
  7. // Helper function to generate binary data
  8. BYTE* BuildCustomVersionInfo(...) { /* Pack strings+structure */ }

提供具体需求后可进一步优化代码!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23103

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?