Что такое формат байт-кода в C #? - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь интегрировать дизассемблер IL в свое приложение дизассемблера ( Android-дизассемблер ), но я не смог найти некоторые библиотеки, выполняющие дизассемблирование CIL. Поэтому я пытаюсь разработать простой дизассемблер для CIL. Поэтому я искал через Интернет (переполнение стека, Google, Википедия и т. Д.). Однако я не смог выяснить, как код сборки CIL становится байт-кодом.

Я открыл приложение C # в бинарном редакторе (предсказывая, что смогу найти читаемый человеком исходный код IL), но я смог найти только некоторые двоичные файлы внутри него.

Как выглядит байт-код C #?

например. Байты инструкций X86 имеют переменную длину:

NOP = 0x90,
JMP = 0xEB 0xxx 0xxx 0xxx 0xxx, ...

к настоящему времени я могу найти только коды операций для каждой инструкции (https://en.wikipedia.org/wiki/List_of_CIL_instructions). Но я хочу знать, как операнды применимы и к кодам операций.

(например, 88 /r для mov, не только 88.)

1 Ответ

5 голосов
/ 17 марта 2019

Я могу порекомендовать эту книгу:

Эксперт .NET 2.0 IL Ассемблер Серж Лидин

https://www.amazon.com/Expert-NET-Assembler-Serge-Lidin/dp/1590596463

Также ILSpy - очень популярный декомпилятор с открытым исходным кодом:

https://github.com/icsharpcode/ILSpy

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

Кажется также, что ILDasm (дизассемблер MSIL, поставляемый с Visual Studio) с открытым исходным кодом:

https://github.com/dotnet/coreclr/tree/master/src/ildasm

Надеюсь, что это поможет вам.

...