我有一个用c#开发的安装文件,当我的客户从我的网站下载并安装这个文件时,我无法理解哪些客户正在使用这个exe。我有一个设置文件,但我有100个客户端。我必须保持客户的ID某处,同时下载安装文件,并在安装阶段显示它到我的应用程序。我不知道该怎么做。
您可以通过在客户正在下载可执行文件并且您知道客户ID的时刻将客户ID注入可执行文件本身来做到这一点。如果您将客户ID数据附加到可执行文件的末尾,那么在可执行文件启动时,您可以让可执行文件读取自身,并从其自身的二进制文件中解析客户ID。这不会对可执行文件的行为造成任何改变。
但是,如果您的可执行文件已签名,那么这样做将使证书无效。为了缓解这种情况,您可以修改可执行文件的头文件,并调整一些值,以考虑到二进制文件的新大小。
需要进行的具体更改如下:
- 定位PE头(PE)的起始位置
- 跳过COFF报头(+=28字节)
- 转到Windows特定可选PE标头中的认证表项(COFF后+=120字节);总+=148字节)
- 修改IMAGE_DATA_DIRECTORY中证书表的大小。Size:添加有效载荷的大小。
- 去位置定义IMAGE_DATA_DIRECTORY.VirtualAddress。这是证书表在文件中的绝对位置。
- 再次更改头的大小,在PKCS1_MODULE_SIGN.dwLength
- 这通常应该是可执行文件的最后一部分;所以到最后添加payload
- 可能计算文件的新校验和
如何修改可执行文件而不使签名无效的源代码:https://blog.barthe.ph/2009/02/22/change-signed-executable/