首页 > 解决方案 > 如何在 c# setup 项目中嵌入客户端 ID?(从我的网站下载时)

问题描述

我有一个用c#开发的安装文件,当我的客户从我的网站下载并安装这个文件时,我无法理解哪些客户正在使用这个exe。我有一个设置文件,但我有 100 个客户端。我必须在下载安装文件时将客户的 ID 保存在某处,并在安装阶段将其显示给我的应用程序。我找不到怎么做。

标签: c#windowssetup-project

解决方案


您可以通过在客户下载可执行文件并且您知道客户 ID 时将客户 ID 注入可执行文件本身来执行此操作。如果您将客户 ID 数据附加到可执行文件的末尾,那么在启动可执行文件时,您可以让可执行文件自行读取并从其自己的二进制文件中解析客户 ID。这不会导致可执行文件的行为发生任何变化。

但是,如果您的可执行文件已签名,则这样做会使证书无效。为了缓解这种情况,您可以修改可执行文件的标头并调整一些值以考虑二进制文件的新大小。

必要的具体更改是:

  1. 定位 PE 标头 (PE) 的开头
  2. 跳过 COFF 标头(+=28 字节)
  3. 转到 Windows 特定的可选 PE 标头中的认证表条目(COFF 后 +=120 字节;总计 +=148 字节)
  4. 更改 IMAGE_DATA_DIRECTORY.Size 中定义的证书表的大小以添加有效负载的大小。
  5. 转到定义的 IMAGE_DATA_DIRECTORY.VirtualAddress 位置。这是文件中证书表的绝对位置。
  6. 再次更改标题的大小,在 PKCS1_MODULE_SIGN.dwLength
  7. 这通常应该是可执行文件的最后一部分;所以走到最后并添加有效载荷
  8. 可能计算文件的新校验和

如何在不使签名无效的情况下修改可执行文件的来源:https ://blog.barthe.ph/2009/02/22/change-signed-executable/


推荐阅读