.net - formato - como cambiar la extension de un video
¿Cuál es el formato de los archivos `*.ni.dll.aux`? (1)
¿Cuál es el formato (diseño de datos) de los archivos *.ni.dll.aux
que se encuentran en C:/Windows/assembly/NativeImages_v4.0.30319_64
? Entiendo que estos son archivos auxiliares generados por ngen.exe
. ¿Qué datos contienen?
el análisis muestra que es un formato bastante simple (como señaló Hans Passant). tiene una palabra de tipo seguida de una palabra de longitud en 3 niveles: a nivel de archivo, nivel de registro y nivel de referencia (estos son términos arbitrarios que estoy usando para mayor claridad).
Este es un resumen:
jcomeau@aspire:~//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''
Aquí está el script (desarrollado de forma incremental) que vuelca lo anterior:
jcomeau@aspire:~//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)
cada registro tiene un tipo de subregistro 0xa que parece ser un número de versión de orden. el tipo de subrecordio 0x3 puede ser un GUID, solo a juzgar por su longitud. Los tipos 0x1 y 0xd son descriptivos. No tengo idea de qué tipos de subrecordio 0x7 y 0x2 pueden ser. quizás 0x7 es un desplazamiento de 32 bits en la .dll coincidente, pero el número de 64 bits en el tipo 0x2 no me sugiere nada en particular. tipo 0x8, 20 bytes de longitud, podría ser algún tipo de hash. Quizás otros puedan llenar los espacios en blanco.
Los valores de cadena, como puede ver, terminan en 0x0 más 0xcccc. el tipo de registro 0xa es en su mayoría datos de cadena, pero precedido por un byte de 0x1 y una longitud fija de 0x24, por lo que se rellena con 0x0s adicionales. Otros tipos de registro, pero no todos, también terminan en 0xcccc.
los archivos se obtuvieron mediante una búsqueda en Google de "index.of dll.aux", y se encuentran aquí: http://www.badelement.co.uk/Movies/Storage/Win-7-Pro_64/Windows/assembly/NativeImages_v4.0.30319_64/System.Net/d79a634a4d873717e2dab52d827ba985/