2013-07-16 10 views
22

Was ist das Format (Datenlayout) von *.ni.dll.aux Dateien in C:\Windows\assembly\NativeImages_v4.0.30319_64 gefunden? Ich verstehe, dass dies Hilfsdateien sind, die von ngen.exe erzeugt werden. Welche Daten enthalten sie?Was ist das Format von `* .ni.dll.aux` Dateien?

+4

gibt es nicht viel drin, nur eine Liste aller abhängigen Baugruppen mit einem Spieß von Daten für jeder. Dies ist nirgendwo dokumentiert, könnte etwas mit .NET 4.5-Optimierungen zu tun haben, wie zum Beispiel der profilgesteuerten Optimierung. Welches Problem versuchen Sie zu lösen? –

+0

Ist das nicht Off-Topic? – dhein

Antwort

2

Analyse zeigt, dass es ein ziemlich einfaches Format ist (wie Hans Passant darauf hingewiesen hat). Es hat ein Typwort, gefolgt von einem Längenwort auf 3 Ebenen: auf der Dateiebene, der Aufzeichnungsebene und der Bezugsebene (dies sind willkürliche Begriffe, die ich zur besseren Übersicht verwende).

Dies ist eine Übersicht:

[email protected]:~/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\[email protected]\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' 

hier ist das Skript (entwickelt inkrementell), die die oben Dumps:

[email protected]:~/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) 

jeder Datensatz hat einen subrecord Typ 0xa, die eine Versionsnummer zu sein scheint von Art. Der Subrecord-Typ 0x3 könnte eine GUID sein, nur aufgrund seiner Länge. Die Typen 0x1 und 0xd sind beschreibend. Ich habe keine Ahnung, welche Subrecord-Typen 0x7 und 0x2 sein können. vielleicht ist 0x7 ein 32-Bit-Offset in die passende .dll, aber die 64-Bit-Zahl im Typ 0x2 deutet nichts auf mich an. Typ 0x8, 20 Bytes lang, könnte eine Art von Hash sein. vielleicht können andere die Lücken ausfüllen.

String-Werte, wie Sie sehen können, enden in 0x0 plus 0xcccc. Record-Typ 0xa ist meist String-Daten, aber mit einem 0x1-Byte und einer festen Länge von 0x24 vorangestellt, so dass es mit zusätzlichen 0x0s aufgefüllt wird. andere Record-Typen, aber nicht alle, enden ebenfalls in 0xcccc.

die Dateien wurden durch eine Google-Suche nach „index.of dll.aux“ erhalten, und hier gefunden: http://www.badelement.co.uk/Movies/Storage/Win-7-Pro_64/Windows/assembly/NativeImages_v4.0.30319_64/System.Net/d79a634a4d873717e2dab52d827ba985/