-3

我正在尝试从 dll 文件中删除时间戳和日期。详细说明:-我正在尝试将文件制作为可复制的二进制文件(要求:-每当我清理和重建它时,md5sum 必须与文件匹配)在上述情况下,每次只有一个 dll 不匹配,原因是时间戳和日期每次都不同,所以我尝试了以下 c:\temp> ildasm /all /text file1.exe | find /v "时间-日期戳:" | 查找 /v "MVID" > file1.txt

c:\temp> ildasm /all /text file2.exe | find /v "时间-日期戳:" | 查找 /v "MVID" > file2.txt

c:\temp> fc file1.txt file2.txt

比较文件 file1.txt 和 FILE2.TXT 的值是匹配的,所以我在 linux 中找到了 Ildasm 的等价物 - > monodis 我能够得到相同的结果,但我无法重用该文件

我尝试使用 ilasm 重新组装但没有用..

有什么建议吗?

尼尔

4

1 回答 1

1

为了将时间戳“修复”为给定值,您只需编辑 .dll/.exe 文件的 PE32 标头即可。时间戳是一个 little endian 32 位整数,位于文件开头的偏移量 0x88(PE32 标头的偏移量 8)。

然而,这只是其中的一部分。您还需要设置程序集中每个模块的 MVID(模块版本 ID)。您可以使用 Mono.Cecil 执行此操作:

using System;
using Mono.Cecil;

public class Program {
  public static void Main() {
    string infile = "in.exe";
    string outfile = "out.exe";
    Guid guid = Guid.Parse("12345678-1234-1234-1234-1234567890ab");
    AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(infile);
    ModuleDefinition mod = asm.MainModule;
    mod.Mvid = guid;
    asm.Write(outfile);
  }
}

请注意,如果程序集中只有一个模块(常见情况),上述代码只会执行您想要的操作。如果您有多个模块,则需要遍历mod.Modules().

您还不需要使用固定的 GUID(如上),但对于不同的模块实际上是不同的(例如,从源代码的 SHA1 哈希派生)。

我相信您明白,弄乱模块版本控制可能很危险,并且需要非常小心地进行此类操作,尤其是当您意外生成具有相同 MVID 的两个不同程序集时。

于 2013-07-12T11:13:28.563 回答