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

标签 linux assembly mono disassembly

我正在尝试从 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/

相关文章:

php - 有什么办法可以将屏幕内容打印到网页上吗?

linux - 如何在 linux 中显示来自 bash 脚本的 GUI 消息框?

c - 关于 GDT 和流程

c# - 通过双击右键防止编辑 NSTextField

c# - 在 Mono LdapException 上运行 Exchange EWS

linux - 使用 bash 连接 .txt 文件

linux - 根据列匹配从两个输入文件创建输出文件

c - 如何编译 GCC 生成的 asm?

assembly - 零/符号扩展是空操作,那么为什么要对每种尺寸类型进行说明呢?

.net - .NET csc 和 Mono mcs 的兼容性