2013-04-10 5 views
1

Итак, у моего работодателя есть эта старая программа .NET/C#, которую необходимо переписать и для которой исходный код был потерян. Он был разработан бывшим сотрудником, но они не были здесь годами. Может быть, это был надзор с их стороны или, может быть, это не так - на данный момент это не имеет большого значения.Ограничения. Декомпиляторов .net

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

пытается декомпилировать .NET, как пытаться сделать миниатюрный файл js доступным для чтения? С мини-js вы можете отложить код до определенного заранее определенного стандарта кодирования, и вы можете переименовать переменные в соответствии с тем, какие функции, присваивающие им значения, называются, но вы все равно будете потерять много информации. Вы теряете имена переменных и любые комментарии, которые разработчик сделал.

Это справедливая аналогия?

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

+0

Знаете ли вы, что бинарные файлы были запутаны? –

+1

Что вы сделали, чтобы ваш босс так сильно вас ненавидел, что он дал вам этот проект? – ChrisA

+1

Что-то лучше, чем ничего. Почему бы вам не попробовать? На бесплатной странице http://www.telerik.com/products/decompiler.aspx показан довольно чистый код. – Paparazzi

ответ

1

Локальные имена переменных не требуются для отражения, поэтому их отбрасывают. На самом деле, на уровне байт-кода нет реальных локальных переменных, только стеки. То же самое касается комментариев - они не сохраняются.

Вы можете использовать MSIL Disassembler (Ildasm.exe), чтобы увидеть, что на самом деле остается в исполняемом файле. Имена strNN и т. Д. Генерируются декомпилятором, чтобы немного помочь вам восстановить логику кода.

2

Примечание. Большинство из того, что я говорю, основано на Java, но, как я понимаю, CLR работает практически так же.

В основном, способ, которым он работает, заключается в том, что компилятор преобразует исходный код в формат, известный как байт-код, который затем может быть выполнен виртуальной машиной. Как правило, компиляторы не беспокоят оптимизацию кода, который они генерируют, поскольку в любом случае он будет оптимизирован во время выполнения VM. Поэтому, если код был скомпилирован стандартным компилятором и не был запутан, перевод в байт-код очень прямой и предсказуемый, что означает, что вы можете декомпилировать его в разумно выглядящий источник.

Однако вы все равно потеряете все, что в основном является синтаксическим сахаром. Компилятор будет включать только материал, необходимый для выполнения. К счастью, поддержка отражения (и отладка, если включена) означает, что в байт-коде будет сохранено много информации об исходном уровне, возможно, через дополнительные метаданные. Но такие вещи, как пробелы и комментарии, недоступны даже с отражением, поэтому нет способа восстановить их.

Аналогия с миниатюрным JS не является точной, но она по-прежнему полезна. В случае Javascript исходные файлы являются входом в виртуальную машину, поэтому нет видимой промежуточной стадии байт-кода. Минимизация - результат перехода оптимизатора и переформатирование исходного кода, но он все еще является исходным кодом. С другой стороны, в обоих случаях потерянная информация является результатом того, что инструмент не сохраняет ее из-за того, что она не нужна для выполнения.

Если файлы были обфускации, то все это выходит из окна. Обфускаторы сознательно испортили шаблоны, введенные компилятором, и удалят все необязательные метаданные, которые они могут. Вы часто можете декомпилировать запутанный код, но это будет беспорядок и не несет полезной информации исходного источника, например, форматирования и имен переменных.