Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

Видеокурс программиста и крэкера 5D 2O17
(актуальность: декабрь 2O17)
Свежие инструменты, новые видеоуроки!

  • 400+ видеоуроков
  • 800 инструментов
  • 100+ свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь


Взлом трёх виртуальных машин (crackme с VM), часть 2




Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

ev1l^4 Page 8 15.02.2011




KeyGenMe by Ms-Rem:

Исследование и написание генератора серийных номеров.


Автор: ev1l^4

// Вступление


Эта статья в большей степени про обзор, чем про исследование keygenme от Ms-Rem, в котором основной защитой является эзотерический язык программирования BrainFuck, а именно сам алгоритм проверки и вывода данных исполняется на нём. По совокупности своей это машина Тьюринга, абстрактный исполнитель, в которой каждый шаг исполнения элементарен.




// Обзор keygenme


 			00401116 			  > /66:AD         			LODSW
 			00401118 			  . |E8 6C000000   CALL 00401189                            ; 			keygenme.00401189
 			0040111D 			  . |AA            STOSB
 			0040111E 			  . |49            DEC ECX
 			0040111F 			  .^\75 F5         JNZ SHORT 00401116                       ; 			keygenme.00401116
 			

Перевод полученных чисел в hex-значения.


 			0040113E 			  .  8BBD 30410000 MOV EDI, DWORD PTR [EBP+4130]
 			00401144 			  .  8D85 34410000 LEA EAX, DWORD PTR [EBP+4134]
 			0040114A 			  .  50            PUSH EAX
 			0040114B 			  .  56            PUSH ESI
 			0040114C 			  .  57            PUSH EDI                                 ; 			ntdll.7C910738
 			0040114D 			  .  8D85 8E030000 LEA EAX, DWORD PTR [EBP+38E]
 			00401153 			  .  50            PUSH EAX
 			00401154 			  .  E8 B9000000   CALL 00401212                            ; 			keygenme.00401212
 			

Вызов исполнителя PCODE.

Прототип BrainFuckProc PROTO sPcode: DWORD, BFBuffer:DWORD, InData:DWORD, OutData:DWORD




8 команд языка Brainfuck:

> перейти к следующей ячейке

< перейти к предыдущей ячейке

+ увеличить значение в текущей ячейке на 1

- уменьшить значение в текущей ячейке на 1

. напечатать значение из текущей ячейки

, ввести извне значение и сохранить в текущей ячейке

[ если значение текущей ячейки нуль, перейти вперёд по тексту программы на ячейку, следующую за соответствующей ] (с учётом вложенности)

] если значение текущей ячейки не нуль, перейти назад по тексту программы на ячейку, следующую за соответствующей [ (с учётом вложенности)


8 команд исполнителя PCODE, только 5 и 6 заменены местами в этом исполнителе PCODE.


// Обзор алгоритма проверки данных


Судя по материалу из Википедии, мы имеем дело с компилятором из простых команд, вроде – zero(), add(k) и тд. в BrainFuck код, который исполняет алгоритм проверки данных и выводит соответствующие значение.

Для понимания алгоритма пишется простой декомпилятор из PCODE в asm-код, затем asm-код оптимизируется по размеру – сокращаются одинаковые куски кода, начиная от больших кусков к малым, вставляются в отдельные процедуры и немного оптимизируется код сложений и вычитаний.

Результат в архивах #big_code.zip и #small_code.zip.

Исследуя small_code бинарный файл можно выделить цикл и несколько блоков похожих на elseif.

Если интересно отладить важные блоки, то для установки на них точек останова прилагается скрипт SetBPs.osc.




 			Repeat
 			{
 				1: 			//Init strings
 				2: 			//Get Data
 				3: 			Serial[0] + 0xC - Serial[4]; // True result == NULL
 				4: 			Serial[2] - (Serial[0] + Serial[3] + 0x54); // True result == NULL
 				5: 			Serial[1] - (szName[0] + szName[1] + Serial[4]); // True result == 			NULL
 				6: 			Serial[5] - (szName[8] + szName[4] - szName[2]); // True result == 			NULL
 				7: for 			(i=9, Sum=0; i > 0; i--), Sum += szName[i];
 				8: 			Serial[8] - Sum; // True result == NULL
 				9: 			(Sum + 0x48) - Serial[9]; // True result == NULL
 				10: 			Serial[7] - (Serial[6] + 0x33 + Sum);
 				11: 			//Set true result
 				12: 			//Set false result
 				13: 			//Out result, set out True
 			}
 			until OUT == True
 			

Примерно такой код выполняется в keygenme. Цифрами прономерованы elseif-блоки. Генератор серийных номеров написать к такому алгоритму проверки данных не составит труда, в любом случае он прилагается.


// Заключение


Как видим, алгоритм проверки данных очень простой, но зато в каком исполнении! Не будим судить о способе разбора алгоритма, хороший он или плохой, так или иначе он дал толчок в исследовании алгоритма - keygenme решён.


// Приложение


#ms_rem_keygenme.zip – KeyGenMe в оригинальном и распакованном виде.

#big_code.zip – Декомпилятор BF Pcode в асм-код.

#small_code.zip – Оптимизированный вариант декомпилированного кода и скрипт.

#keygenme.zip – Упрощённый варинат keygenme на masm.

#keygen.zip – Генератор серийных номеров на masm.

#wiki_turing_bf.zip – Материал из Википедии по машине Тьюринга и BrainFuck.



Скачать статью "Взлом трёх виртуальных машин (crackme с VM), часть 2" в авторском оформление + файлы.



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS