Pull to refresh

Реверсинг .Net приложений. Часть 0

Lumber room
Перед вами первая статья из цикла «Реверсинг .Net приложений», в которой мы не будем работать с MSIL, не будем снимать пакеры и протекторы, и не встретимся с обфусцированным кодом. Всем этим мы займемся в будущих статьях, а пока мы пощупаем несколько основных инструментов и по традиции решим несложный крэкми.


Платформа .Net в текущем состоянии крайне уязвима:

1. Программы, написанные для .Net, компилируются не в native, а в байт-код платформы .Net, названный MSIL (MicroSoft Intermediate Language).

IL код компилируется непосредственно перед запуском. Такая технология получила название Just-in-time compilation (JIT, компиляция «на лету»).

2. Все программы содержат метаданные.
«Метаданные (metadata) — это данные, описывающие другие данные. В нашем контексте — это набор программных элементов ЕХЕ-файла, таких как типы и реализации методов.»

Именно благодаря метаданным, а точнее их особым свойствам в среде .Net мы можем с легкостью получить исходники программ.

2.1 Метаданные в .Net обязательны и универсальны.
«Каждая программа в среде .Net, помимо кода на языке MSIL обязательно содержит метаданные, описывающие как её в целом (манифест), так и каждый тип, содержащийся в ней.»

2.2 Метаданные в .Net общедоступны.
«Доступ к метаданным могут получить любые программные компоненты и любые инструменты программирования.»

2.3 Метаданные в .Net исчерпывающи.
«Метаданные содержат подробнейшую информацию о каждом типе: его имя, типы и имена его полей, описание свойств и методов со всеми их параметрами и возвращаемыми значениями. Здесь же хранится информация о доступности (видимости) всех членов класса и об их атрибутах. Метаданные хранят не только информацию о интерфейсе экспортируемых классов. Такие детали реализации, как структура защищённых полей, описания защищённых методов и других компонентов, также могут быть извлечены из метаданных.»

Подробнее о структуре метаданных в .Net можно почитать здесь, а мы тем временем приступим непосредственно к практике. Для работы нам понадобится:
  • .Net reflector
  • Visual C# Express(или другая удобная для вас IDE)
  • Минимальное знание любого ЯП с C-подобным синтаксисом, либо понимание «как оно там происходит»(для анализа и редактирования кода)

На данный момент помимо .Net reflector существует еще несколько популярных декомпиляторов .Net сборок и приложений:
  • DisSharp Decompiler (http://netdecompiler.com) — платный, в наличии деобфускатор, разработчики заявляют, что работает в несколько раз быстрее аналогов. Лично мне не понравился, хотя и справился с несколькими подопытными программами.
  • Salamander .Net decompiler (http://www.remotesoft.com/salamander/) — может когда-то и был конкурентом рефлектору, но сейчас мы его отправим в архив, Change Log обрывается в начале 2008 года. Платный.
  • Spices.Net Decompiler (http://www.9rays.net/Downloads.aspx) — единственный из нашего списка, способный потягаться с рефлектором. В наличии неплохой деобфускатор, оптимизатор кода, интеграция с VS и прочие плюшки. Минус — платный.
  • Если вы по каким-то причинам не можете воспользоваться рефлектором, в вашем распоряжении несколько подобных программ, но будьте готовы к тому, что результат декомпиляции в каждой из них может отличаться.

Терзать мы будем «ReWrit's Crackme #9 .Net Noob Challenge». Он довольно простой, так что проблем с ним не возникнет.

Скачиваем архив с crackme. Внутри, помимо нужного нам файла, лежит readme.txt с «брифингом». Запускаем .Net reflector, далее File -> Open -> ReWrit's Crackme #9 noob challenge.exe, после этого в поле программы появится открытый нами файл.

image

Далее ПКМ -> Disassemble, и мы почти у цели.

image

Как и заявлено разработчиком, reflector может с одинаковым успехом декомпилировать .net приложения на разные ЯП. Чтобы убедиться в этом, выделите любой метод, и в выпадающем списке смените C#, к примеру, на Delphi. Также reflector может быть использован для эффективной конвертации кода между C# и VB.Net.
Вернемся к нашему crackme, для достижения цели остался всего один шаг. ПКМ на ReWrits cm9 Noob Challenge -> Export…

image

Проект экспортирован без ошибок, но так бывает не всегда, в некоторых случаях рефлектор может потребовать недостающие файлы или библиотеки. В таком случае придется указать к ним путь вручную. Теперь запускаем IDE, в моем случае это Visual C# Express 2010, открываем экспортированный из рефлектора проект, студия предлагает преобразовать проект под текущую версию среды, соглашаемся. С ходу нажимаем F5 и вуаля, программа работает. В «боевых» условиях так бывает не всегда, то рефлектор неправильно экспортирует, то проект криво преобразуется в студии, то и вовсе в системе не хватает какого-то компонента. Но все это не имеет значения, если мы получили львиную долю исходного кода.
Итак, на этом основная часть статьи завершатся. Мы узнали, почему же так уязвима платформа .Net, познакомились с одним из множества способов получить исходный код программ, написанных для .Net, а также получили навыки работы с очень мощной утилитой .Net Reflector. Дальше идет необязательная часть, в которой будет решение трех уровней crackme, а оставшиеся два вам предстоит решить самостоятельно.

Теперь мы можем закрыть запущенный из студии крекми и вернуться к коду программы. Двойной щелчок по Form1.cs и неожиданно видим ошибку:

image

но нас это не пугает, нажимаем «Перейти к коду». Заостряем свое внимание на обработчиках нажатия кнопок, в них происходит все самое интересное. Обусловимся, что button'ы будем называть кнопками, textbox'ы — ТБ, а messagebox'ы так и оставим в покое. Запускаем оригинальный crackme, в нем мы будем проверять полученные решения, пока его свернем и вернемся к коду программы. Обработчик нажатия первой кнопки выглядит следующим образом:

private void button1_Click(object sender, EventArgs e)
{
string str = "486752416871754464";
string str2 = "";
while (str.Length > 0)
{
str2 = str2 + Convert.ToChar(Convert.ToUInt32(str.Substring(0, 2), 0x10)).ToString();
str = str.Substring(2, str.Length - 2);
}
if (this.textBox1.Text == str2)
{
this.Nag_Timer1.Start();
this.textBox2.ReadOnly = false;
}
else
{
MessageBox.Show("Wrong Password!", "Error");
}
}

Тут введенная нами строка после преобразования и некоторых операций сравнивается с изначально заданной строкой, которая также терпит преобразования. В случае их равенства стартует таймер нага и снимается атрибут readonly со следующего ТБ, во всех остальных — выскакивает messagebox с уведомлением о неправильном пароле. Заменяем MessageBox.Show(«Wrong Password!», «Error»); на MessageBox.Show(str2, «Error»); нажимаем F5, вводим что-нибудь в первый ТБ, нажимаем «Ок» и получаем messagebox с правильным паролем. Вводим его в ТБ измененной программы, нажимаем ок, после чего станет доступен второй ТБ. Но пока не спешим вводить пароль в свернутый оригинал crackme. В измененной программе тем временем стартует таймер, вызывающий наг.

Наг — назойливое окно, выскакивающее через определенный промежуток времени (либо при запуске), призывающее зарегистрировать программу. Встречается в основном в триальных программах и «шароварах».

У нас уже выскочило несколько нагов и пора бы их убрать. Не закрывая программу, смотрим на обработчик второй кнопки и видим прямое сравнение введенного текста с переменной, содержащей «0x7fffffff». Число в переменной указано в шестнадцатеричной форме, нам же нужна десятеричная запись этого числа. Можно воспользоваться стандартным калькулятором. Сначала перевести в режим «Программист»(в Win7 это так называется), нажимаем «Hex» вводим «0x7fffffff», тыкаем «Dec». 2147483647 и является паролем, который отключает наг и дает доступ к третьему ТБ. Третье задание предлагаю вам решить самостоятельно.

Надеюсь, что вы уже решили третье задание, значит мы можем продолжать. В readme сказано, что на четвертом уровне нам предстоит патчить файл, так и поступим. Смотрим обработчик четвертой кнопки, недолго думая, меняем «if (this.textBox6.Text == str2)» на if (this.textBox6.Text == «crack»), пароль для четвертого уровня — crack. Пятый вам предстоит решить самостоятельно.

На этом статья заканчивается, благодарю за внимание.
Tags:
Hubs:
Total votes 29: ↑27 and ↓2 +25
Views 1.6K
Comments Comments 5