2013-07-09 47 views
-3

我想從一個dll文件中去除時間戳和日期。 詳細說明: - 我試圖使文件作爲二進制可重複 (要求: - 每當我清理和重建它,md5sum必須匹配的文件) 在上述情況下,只有一個DLL是不匹配每次,原因是時間郵票和日期每次都有所不同 所以我嘗試以下 c:\ temp> ildasm/all/text file1.exe | find/v「時間日期戳:」| find/v「MVID」> file1.txt是否有任何方法去除Linux中的dll文件中的時間戳和日期?是否有任何工具可用?

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的反彙編 - > monodis 我能得到相同的結果,但是我無法再使用該文件

我嘗試使用ILASM但沒有工作重新組裝..

有什麼建議?

尼爾

+2

這個問題還不清楚。 DLL的只有Windows,而不是Linux(它們是共享對象'.so')。此外,該元數據不能被*剝離*,它只能被改變。 – trojanfoe

+0

剝離什麼時間戳?通過DLL文件,你的意思是一個Windows DLL或更通用的術語,在Unix世界中稱爲「共享對象」? – Joni

+0

我使用交叉編譯器「mcs」編譯windows dll。由於時間戳和日期信息,生成的dll不是二進制可重複的。如果這被剝奪了sha1sum匹配所有版本。那麼有沒有辦法去除這些信息。 – user2563994

回答

1

爲了在給定的值設置爲「修復」的時間戳,您只需編輯該.dll/.exe文件的PE32頭。時間戳是從文件開頭(PE32頭的偏移量8)開始的偏移量爲0x88的小端32位整數。

但是,這只是其中的一部分。您還需要設置程序集內每個模塊的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的不同程序集時。

相關問題