Dot-Net
*.ni.dll.aux 文件的格式是什麼?
*.ni.dll.aux中找到的文件的格式(數據佈局)是C:\Windows\assembly\NativeImages_v4.0.30319_64什麼?我了解這些是由ngen.exe. 它們包含哪些數據?
分析表明它是一種相當簡單的格式(正如 Hans Passant 指出的那樣)。它有一個類型字,後跟一個長度字,分為 3 個級別:文件級別、記錄級別和數據級別(為了清楚起見,這些是我使用的任意術語)。
這是一個概述:
jcomeau@aspire:~/stackoverflow/17681514$ ./job.py System.Net.ni.dll.aux 00000005 (00000204): 0b000000bc0000000d000000...00000000000000000000cccc 0000000b (000000bc): 0d0000005000000053797374...00000000000000000000cccc 0000000d: (00000050) 'System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\x00\xcc\xcc' 00000007: (00000004) '\t\x11\x00\x00' 00000002: (00000008) '\x00i,\x03c]\xcd\x01' 00000008: (00000014) '\xf3\xd8#\x08\xf7\x08\x9a$1\x11\xb8\x18Rv\xf4@\xa1y\xb2.' 0000000a: (00000024) '\x011.0.23-106002268\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc' 00000004 (00000098): 010000004c0000006d73636f...00000000000000000000cccc 00000001: (0000004c) 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\x00' 00000003: (00000010) '\x9d\xa5\xbb3\xcd\x1c4\xb7\x85\x1c\x08\x8f\x0c\xf7I\xcc' 0000000a: (00000024) '\x011.0.23-106002119\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc' 00000004 (00000098): 010000004c00000053797374...00000000000000000000cccc 00000001: (0000004c) 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\x00\xcc\xcc' 00000003: (00000010) '\xe30[\xdb\xd0>\xf9\x19\x05\x1a\xa7\xf2x:\xc3*' 0000000a: (00000024) '\x011.0.23-106003331\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc'這是轉儲上述內容的腳本(增量開發):
jcomeau@aspire:~/stackoverflow/17681514$ cat job.py #!/usr/bin/python import sys, os, struct def dump(infile): data = read(infile) filelength = len(data) filetype, length, data = next(data) assert filelength == length + 8 print '%08x (%08x): %s' % (filetype, length, snippet(data)) lengthcheck = 8 while data: recordtype, recordlength, data = next(data) lengthcheck += 8 + recordlength #debug('remaining data: %s' % snippet(data)) record, data = data[:recordlength], data[recordlength:] print ' %08x (%08x): %s' % (recordtype, recordlength, snippet(record)) recordcheck = 0 # not 8 because record header was already not counted while record: subrecordtype, subrecordlength, record = next(record) recordcheck += 8 + subrecordlength datum, record = record[:subrecordlength], record[subrecordlength:] print ' %08x: (%08x) %s' % (subrecordtype, subrecordlength, repr(datum)) assert recordcheck == recordlength assert lengthcheck == filelength def next(data): 'each chunk is a type word followed by a length word' if not data: typeword, length = 0, 0 elif len(data) > 16: typeword = struct.unpack('<I', data[:4])[0] length = struct.unpack('<I', data[4:8])[0] else: raise Exception('Invalid data length %d' % len(data)) return typeword, length, data[8:] def read(filename): input = open(filename, 'rb') data = input.read() input.close() return data def snippet(data): snippet = data[:12].encode('hex') if len(data) > 12: snippet += '...' if len(data) > 24: snippet += data[-12:].encode('hex') return snippet def debug(message): if __debug__: if message: print >>sys.stderr, message return True if __name__ == '__main__': for infile in sys.argv[1:]: dump(infile)每條記錄都有一個子記錄類型 0xa,它似乎是一個版本號。子記錄類型 0x3 可能是一個 GUID,僅根據其長度來判斷。類型 0x1 和 0xd 是描述性的。我不知道 0x7 和 0x2 可能是什麼子記錄類型。也許 0x7 是匹配 .dll 的 32 位偏移量,但 0x2 類型中的 64 位數字對我來說沒有什麼特別的建議。類型 0x8,20 字節長,可能是某種類型的雜湊。也許其他人可以填補空白。
如您所見,字元串值以 0x0 加 0xcccc 結尾。記錄類型 0xa 多為字元串數據,但前面有一個 0x1 字節,長度固定為 0x24,所以用額外的 0x0s 填充。其他記錄類型(但不是全部)也以 0xcccc 結尾。
這些文件是通過Google搜尋“index.of dll.aux”獲得的,在這裡可以找到:http://www.badelement.co.uk/Movies/Storage/Win-7-Pro_64/Windows/assembly/NativeImages_v4。 0.30319_64/System.Net/d79a634a4d873717e2dab52d827ba985/