ZBLOG

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

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


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

适用场景

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

步骤

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

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

适用场景

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

步骤(使用 Win32 API)

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

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

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

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

   hUpdate,
   RT_VERSION,
   MAKEINTRESOURCE(VS_VERSION_INFO),
   MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
   lpData,
   dwSize);

EndUpdateResource(hUpdate, FALSE);


---

### *关键细节*
1. **数据结构要求**  
   新增字段必须符合 `VS_VERSIONINFO` 结构,包括:
   - `StringFileInfo`:字符串表(如 `040904b0`)。
   - `VarFileInfo`:语言和编码标识。

2. *示例新增字段*  
   假设原文件无任何属性,新增一个自定义公司名:
```rc
VERSIONINFO
FILEVERSION    1,0,0,0
BEGIN
    BLOCK "040904b0"
    BEGIN
        VALUE "CompanyName", "ZeroSound Education\0"
        VALUE "CustomField", "Added Dynamically\0"
    END 
END 
  1. 工具辅助
  • *Resource Hacker*:可视化添加字段。
  • *Visual Studio*:右键 .exe → Properties → Details → Edit via .rc.
  1. 签名问题
    修改后需重新签名:
signtool sign /f mycert.pfx /p password target.exe 

完整代码片段

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

// 1. Build VS_VERSIONINFO structure manually (binary format)
BYTE* lpData = BuildCustomVersionInfo("MyApp", "2.0", ...);

// 2. Update binary file 
HANDLE hRes = BeginUpdateResource("app.exe", FALSE); 
UpdateResource(hRes, RT_VERSION, ..., lpData); 
EndUpdateResource(hRes, FALSE); 

// Helper function to generate binary data 
BYTE* BuildCustomVersionInfo(...) { /* Pack strings+structure */ } 

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?