Как стать автором
Обновить

Комментарии 28

Тоже пользуюсь dotPeek. Добавлю, что от Telerik тоже есть бесплатный декомпилятор JustDecompile.
Добавил =) Не пользуюсь и пропустил. У него свое ядро или Cecil?
Cecil похоже, но я им тоже не пользуюсь. Субъективно код от dotPeek лучше.
While и Do-While циклы перепутаны.
точно, спасибо -)
на КДПВ тоже перепутано ;)
У меня возникла мысль создать пост с множеством графиков и текстов так, чтобы содержимое не имело никакого смысла, но выглядело бы круто. Мне интересно, вышел бы такой пост в топ Хабра? -))) Я про то что только вы заметили это =)))
много ли мОлодежи помнит Блок-Схимника?
Заниматься декомпиляцией не приходилось, после прочтения аж руки зачесались попробовать. Спасибо.
Милости просим в harmony core =) Там как раз все в полу-рабочем состоянии, есть над чем потрудиться =)
Спасибо, за приглашение. Как будет свободное время гляну.
Я лично хотел бы поиграться с декомпиляцией на языке Nemerle. Мне кажется, на нем процесс пошел бы гораздо приятнее. Язык же как раз для таких вещей создан
Спасибо, очень познавательная статья! Вроде бы и ничего сложного, но работу по созданию декомпилятора нужно проделать немалую.
Интересно, спасибо.
Только, если не ошибаюсь, Ldind_i4 загружает значение на стек с указанного в параметре адреса. Константы загружают инструкции Ldc.
Кстати, всегда было интересно, есть ли разница в скорости инструкций ldc.i4.5, ldc.i4.s 5 и ldc.i4 5. Или разница только в размере кода. (Пробовал измерять, короткие формы вроде чуть быстрее, но не уверен в правильности измерения)
Точно =) Писал по памяти =)
De4dot будете описывать? :)
Я бы почитал конкретно про dnlib — она больше подходит по теме (и, в отличие от cecil, куда более устойчива к обфускации) :)
Посмотрел на оба продукта. Да, в теме больше dnlib. Но разбор полетов в De4Dot мне также нравится. Как работает деобфускация кода — не менее интересная тематика.
Плюсую, про то как работает de4dot я тоже с удовольствием бы почитал.
Отличная статья. Писал декомпилятор 1С-опкода примерно по такому же принципу. Все работает идеально, пока не применены специальные средства защиты.
Как обстоят дела в вашем случае, если .Net-сборка обфусцирована?
С обфускацией не работал, но тут необходимо применять своего рода пре-процессинговые матчеры. Т.е. подготавливать код к основным алгоритмам:
  1. Выявить переменные, которые сеттятся один раз, и от которых зависит flow.
    	var x = false;
    	if(x) { DoSomeStrangeWork(); }
  2. Переход к следующей инструкции организовать так, чтобы пропускать безусловные переходы (т.е. чтобы след инструкция была = инструкции по адресу безусл. перехода). Искать вызовы методов, которые вызываются только из одного места и при этом private, после чего инлайнить их. Ну и т.д. =)
Ну и потом, опять же, можно перетянуть алгоритмы с того же De4dot, который упоминался немного выше
Ждем следующей статьи! А то эта часть так неожиданно закончилась, я только-только вчитался и вник, как уже конец…
Интересно, что в списке текущих средств, кроме Reflector-а — остальные, ну можно назвать «новички».
А как же 9Rays-овский Spices.Net Decompiler (представляющий visual decompiler, не то что бы ух, но для представления интересен), а как же Dis# (с интересной функцией inplace) — российского происхождения? Подревнее будут. Reflector тут вообще должен идти как №1 — ветеран, экс-супер-мега популярный декомпилер.
Почему упомянул «новички» — дело тут в базе кейсов кода. Понятно, что в данной статье описаны, ну просто совсем базовые вещи, однако даже разница продуцируемого компиляторами MSIL версий от .Net 1.1 и 2.0 и далее — есть. Плюс кейсы от различных экзотических и не очень конструкций кода.
Далее — MSIL продуцируемый VB-компилятором и c# (и уж про managed c++ можно что-то сказать) — это серьезное испытание для декомпилятора, то есть конверсии c#->c#, VB->VB неплохи будут, но вот c#->VB уже будет вызывать сложности (это также — множество кейсов).
Ну и вообще — вот очередной девелопер взялся за декомпилятор(а то как-то мне уже кажется здесь история про yet another cd-ejector. Не ищите здесь ворчливости, просто вопрос декомпиляции — это вопрос тысяч и тысяч кейсов. Базово конечно будет работать, а дальше? Откуда кейсы брать?). Какие задачи он ставит перед собой (ну the best decompiler in the world, отринем)? Попыток-то много было, все-таки история вопроса — а ж с 2003 года(это для .Net decompiers конечно), у того же телерика — это попытка, а мне кажется сначала для собственных нужд они его делали, а вот RedGate купившее Reflector уже и так признавалось, что покупка себя не отбила и не отобьет (Лутц Ройдер просто продал им, и ушел в консальтинг, а они еще и за миллион бакинских купили неплохой обфускатор из базовых — SmartАssembly в попытке рынок забрать, сейчас явно проблемы у ребят). Даже на RSDN разрабатывали коллективно свой декомпилер.
Ну да, и при ответе на вопрос, действительно стоит в список задач поставить пункт «как быть с обфусцированными сборками?»/ Он тут одновременно превращает декомпилятор в инструмент для не очень моральных, с точки зрения производителя, персон. Да, декомпилятор — инструмент двойного назначения. Однако и многие производители обфускаторов обозначают в списке фичей — «защита от Reflector», что тоже важно для защищающих свой код компаний.
Да, я даже более развернуто задал бы вопрос:
Не боитесь ли вы исков от компаний-вендоров (или от банкстеров — у них полно .Net кода), когда они узнают, что их know-how код был reverse engineered при помощи вашего декомпилятора?
Спасибо за развернутый комментарий =) Статья прежде всего о «как», а не «чем», ну и не про все декомпиляторы знаю, на самом деле. Inplace — офигенная вещь, спасибо за наводку =)

Telerik и JB — ответ на платный Reflector. Ответ на вопрос «насколько сложно сделать декомпилятор». Они сделали его очень быстро. Исков не боюсь: я уже задавал вопрос в JB. Они были не против если без большой критики буду описывать некоторые части. Ну и большинство вещей я все-таки опишу с open-source решений. Благо они практически полностью присутствуют в закрытых.

Разработка своего — just for fun. Потому что интересно и это — хобби. Не более того.
Telerik и JB — ответ на платный Reflector.

По Telerik-у — насколько я знаю, не совсем так. Они давно на это заглядывались, в 2007-8-х годах, казалось, что это эльдорадо, и в те года они хотели купить сторонний (опять же по примеру RedGate, RG признались о своей неудачной покупке по-моему в 2010-м).
Разработка своего — just for fun. Потому что интересно и это — хобби. Не более того.

На мой взгляд лучше позиционироваться на роли инструмента восстановления кода (утраченного), конвертера кода из одного языка в другой — в этом основная польза этого инструмента. В таком случае и целеполагание будет точным.
Ну, удачи. Будем посмотреть :)
ildasm использовать не пробовали?
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.