有没有办法在linux中的dll文件中删除时间戳和日期?有什么工具可用吗?

时间:2013-07-09 10:02:17

标签: linux assembly mono disassembly

我正在尝试从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重新组装,但没有工作..

有什么建议吗?

尼尔

1 个答案:

答案 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的两个不同的程序集时。