我正在尝试从dll文件中删除时间戳和日期。 详细说明: - 我正在尝试将文件作为二进制文件重现 (要求: - 每当我清理并重建它时,md5sum必须与文件匹配) 在上面的例子中,每次只有dll不匹配,原因是时间戳和日期每次都不同 所以我尝试了以下 C:\ TEMP> ildasm / all / text file1.exe | find / v“时间戳日期:”| find / v“MVID”> FILE1.TXT
C:\ TEMP> ildasm / all / text file2.exe | find / v“时间戳日期:”| find / v“MVID”> FILE2.TXT
C:\ TEMP> fc file1.txt file2.txt
比较文件file1.txt和FILE2.TXT 价值观是匹配的 所以我在linux中为Ildasm找到了一个等价物 - > monodis 我能够得到相同的结果,但我无法重复使用该文件
我试图用ilasm重新组装,但没有工作..
有什么建议吗?
尼尔
答案 0 :(得分:1)
为了将时间戳“修复”到给定值,您只需编辑.dll / .exe文件的PE32标头即可。时间戳是一个小端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的两个不同的程序集时。