Обратный инжиниринг массива байтов кода MSIL - PullRequest
0 голосов
/ 17 октября 2010

Есть ли способ взять кусок кода MSIL, сохраненный в виде потока байтов, и преобразовать его в код более высокого уровня (например, C #)?

Редактировать: инструкции MSIL, которые не являются целой сборкой

Спасибо,

Джон

Ответы [ 5 ]

1 голос
/ 25 декабря 2011

Короче говоря, вы не можете "кусок кода CIL" декомпилировать его на язык высокого уровня. Помимо языка высокого уровня, вы даже не сможете правильно его декомпилировать. Поскольку CIL не означает только набор инструкций, некоторые инструкции имеют метатокены в качестве операнда. Метатокены - это просто целочисленные ссылки для некоторых объектов (типов, методов, строк и т. Д.). Эта информация хранится в сборке. Даже если мы игнорируем эту информацию, существует другая проблема: обработка исключений. Нет никаких инструкций «попробуй» и «поймай» (но есть и так далее). Для определения блоков try-catch / finally вам снова понадобится сборка. Потому что эта информация хранится как пара со смещением длины (границы блоков сохраняются) в сборке.

0 голосов
/ 17 октября 2010

Не уверен, что это сработает, но ILDASM звучит примерно так:

MSIL Disassembler является сопутствующим инструментом для MSIL Assembler (Ilasm.exe). Ildasm.exe берет переносимый исполняемый файл (PE), который содержит код промежуточного языка Microsoft (MSIL), и создает текстовый файл, подходящий для ввода в Ilasm.exe.

Обратите внимание на требование, чтобы файл был PE-файлом, поэтому для чего-либо практического это все равно будет управляемая сборка.


Поскольку эти инструкции низкого уровня, они не обязательно будут соответствовать непосредственно высокоуровневому коду - даже отражатель не даст вам точного исходного кода.

Вам может потребоваться написать собственный инструмент для достижения этой цели, поскольку сборка будет содержать некоторую потенциально требуемую информацию (например, ссылочные сборки).

0 голосов
/ 17 октября 2010

Да, используйте .NET Reflector.

http://www.red -gate.com / продукты / отражатель /

0 голосов
/ 17 октября 2010

Mono.Cecil предлагает некоторые функции анализа:http://www.mono -project.com / Cecil Не уверен, может ли он анализировать чистый код IL.

0 голосов
/ 17 октября 2010

Reflector делает именно это ... так что да, это возможно, при условии, что у вас есть правильный контекст (для разрешения токенов типа и т.код может полностью отличаться от исходного кода, но у него будет та же семантика (если в генераторе кода нет ошибок).

...