Подтвердить что ты не робот

Каков формат `*.ni.dll.aux` файлов?

Каков формат (расположение данных) файлов *.ni.dll.aux, найденных в C:\Windows\assembly\NativeImages_v4.0.30319_64? Я понимаю, что это вспомогательные файлы, сгенерированные ngen.exe. Какие данные они содержат?

4b9b3361

Ответ 1

Анализ

показывает, что это довольно простой формат (как указал Ханс Пассант). он имеет слово типа, за которым следует слово длины на трех уровнях: на уровне файла, уровне записи и уровне данных (это произвольные термины, которые я использую для ясности).

Это обзор:

[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'

вот script (разработанный поэтапно), который выгружает вышеупомянутое:

[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)

каждая запись имеет тип подзадачи 0xa, который, как представляется, является номером версии. subrecord type 0x3 может быть GUID, просто судя по его длине. типы 0x1 и 0xd являются описательными. Я не знаю, какие типы субресурсов 0x7 и 0x2 могут быть. возможно, 0x7 - это 32-разрядное смещение в соответствующем .dll, но 64-разрядное число в типе 0x2 не предлагает мне ничего особенного. тип 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/