27.11.2014 Views

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

взлом<br />

SHARPDEVELOP В ДЕЙСТВИИ<br />

Выполняется куча каких-то проверок и сравнений,<br />

которым надо удовлетворить. Мое же<br />

внимание привлекла последняя инструкция<br />

this.txt.Text = Conversions.ToString(Encrypt.<br />

ParseandDecrypt("fm`{f}kpwrn"));.<br />

Ну да, при правильном раскладе в текстбокс<br />

попадает значение, представляющее собой расшифрованную<br />

строку «fm`{f}kpwrn». Собственно<br />

алгоритм расшифровывания реализуется функцией<br />

ParseandDecrypt из класса Encrypt. Дальше<br />

можно либо разбираться в алгоритме (зачем<br />

оно нам надо?), либо скопировать код функции и<br />

скомпилировать собственный проект, либо просто<br />

сделать один верный прыжок.<br />

Запускаем reflexil из меню Tools и видим IL-код.<br />

Нужно идентифицировать место последнего if и<br />

прыгнуть с него на выявленную команду. В IL нет<br />

операторов ветвления, поэтому они реализуются<br />

в виде последовательности простых команд сравнения<br />

и прыжков. Здесь все как в ассемблере.<br />

Итак, ищем последний переход перед выводом<br />

MessageBox с сообщением nope.<br />

Локализация перехода<br />

IL_00f2: ldc.i4 0x1ca<br />

IL_00f7: ceq<br />

IL_00f9: or<br />

IL_00fa: brfalse.s IL_0110<br />

058<br />

IL_00fc: ldstr "nope"<br />

IL_0101: ldc.i4.s 64<br />

IL_0103: ldstr "sorry"<br />

IL_0108: call valuetype<br />

[Microsoft.VisualBasic]Microsoft.<br />

VisualBasic.MsgBoxResult<br />

[Microsoft.VisualBasic]<br />

Microsoft.VisualBasic.<br />

Interaction::MsgBox(object,<br />

valuetype [Microsoft.VisualBasic]<br />

Microsoft.VisualBasic.MsgBoxStyle,<br />

object)<br />

Меняем brfalse на brtrue, чтобы прыжок совершить,<br />

ну а чтобы избежать проверки else if,<br />

меняем адрес IL_0110 на IL_013d.<br />

Вывод решения в текстбоксе формы<br />

IL_013d: ldarg.0<br />

IL_013e: callvirt instance class<br />

[System.Windows.Forms]System.<br />

Windows.Forms.TextBox app14.<br />

goes::get_txt()<br />

IL_0143: ldstr "fm`{f}kpwrn"<br />

IL_0148: call object app14.Encr<br />

ypt::ParseandDecrypt(string)<br />

IL_014d: call string<br />

[Microsoft.VisualBasic]Microsoft.<br />

VisualBasic.CompilerServices.<br />

Conversions::ToString(object)<br />

IL_0152: callvirt instance void<br />

[System.Windows.Forms]System.<br />

Windows.Forms.TextBox::set_<br />

Text(string)<br />

IL_0157: ret<br />

В левой панели кликаем на название бинарника,<br />

затем нажимаем кнопку Save as и сохраняем его<br />

под именем app14_patched. Запускаем, вводим<br />

любую фразу и в текстбоксе получаем кодовое<br />

слово ihatethereg!!!<br />

НАМ НЕ СТРАШЕН<br />

СЕРЫЙ ВОЛК<br />

Неужели все действительно так просто? На самом<br />

деле и да, и нет. Если мы (и еще туева хуча людей)<br />

знаем о возможности восстановления кода, об<br />

этом должны были позаботиться в Microsoft. Да и<br />

другие конторы не прочь предоставить решения<br />

по защите от анализа и реверса. В целом так и<br />

есть, только решения эти далеко не всегда обеспечивают<br />

реальную защиту.<br />

Начнем с обфускации. В поставку Visual Studio<br />

входит утила под названием Dotfuscator. Ее<br />

задача — усложнить работу реверсера за счет<br />

изменения имен классов, методов и переменных,<br />

XÀÊÅÐ 07 /127/ 09

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!