我正在尝试从 dll 文件中删除时间戳和日期。 详细说明:- 我正在尝试将文件制作为可重现的二进制文件 (要求:-每当我清理并重建它时,md5sum 必须与文件匹配) 在上面的例子中,每次只有一个dll不匹配,原因是时间戳和日期每次都不同 所以我尝试了以下方法 c:\temp> ildasm/all/text file1.exe |查找/v“时间日期戳:”|查找/v "MVID"> file1.txt
c:\temp> ildasm/all/text file2.exe |查找/v“时间日期戳:”|查找/v "MVID"> file2.txt
c:\temp> fc file1.txt file2.txt
比较文件 file1.txt 和 FILE2.TXT 值匹配 所以我在linux中找到了Ildasm的等价物 -> monodis 我能够得到相同的结果,但无法重用该文件
我尝试使用 ilasm 重新组装,但没有成功..
有什么建议吗?
尼尔
最佳答案
为了将时间戳“固定”为给定值,您只需编辑 .dll/.exe 文件的 PE32 header 即可。时间戳是一个小端 32 位整数,位于文件开头的偏移量 0x88(PE32 header 的偏移量 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(如上所述),而是使用对于不同模块实际上不同的 GUID(例如,从源代码的 SHA1 哈希派生)。
我相信您了解弄乱模块版本控制可能存在危险,并且需要极其谨慎地进行此类操作,尤其是当您意外生成具有相同 MVID 的两个不同程序集时。
关于linux - 有没有办法在linux中去除dll文件中的时间戳和日期?有可用的工具吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17545411/