eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


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

Русский / Russian English / Английский

Сейчас на форуме: (+2 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Основной форум —› Анализ VM
Посл.ответ Сообщение

Ранг: 35.1 (посетитель)
Статус: Участник

Создано: 26 декабря 2015 10:39 New!
Цитата · Личное сообщение · #1

Чувствую не дождусь я ответов с crackmes.de, поэтому попробую спросить у местного комьюнити.
Сразу оговорюсь я не пишу "новый протектор" но хочу чтобы кто-то проанализировал мою небольшую наработку.
Выполнена в виде кейгенми.
Меня устроит (как результат атаки на приложение) обычная валидная пара (логин-серийник).
Ну а если кто-то сможет реализовать полный кейген - даже не знаю что и сказать.
Приложени сишное, при компиляции забыл указать совместимость в XP (поэтому если кто на XP будет дебажить - в заголовке там с шестерки на пятерку поправьте поля MajorOperatingSystemVersion и MajorSubsystemVersion).
И еще - это не результат работы навесняка - это то что выдает стандартный компилер

{ Атач доступен только для участников форума } - keygenme.zip

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

| Сообщение посчитали полезным: SReg


Ранг: 488.4 (мудрец)
Статус: Участник

Создано: 26 декабря 2015 12:27 New!
Цитата · Личное сообщение · #2

я даже смотреть не буду.. логика любой ВМ.. это перенос одного кода в другой. сложность его реверса, пропорциаонально переписыванию движка. на этом ВСЕ. более продвинутые ВМ интерпритируют код в другую архитектуру.. но это ничего не меняет.. грубо говоря.. я возьму код х86 и портну в АРМ.. или Z80.. те.. типа ебитесь друзья реверсеры..но это ничего не меняет.. если реверсер стырил двиг ВМ и востановил примитивы.. да.. долго.. да нудно.. разово делать это не выгодно.. а если прот комерческий, то возможно имеет смысл

Ранг: 35.1 (посетитель)
Статус: Участник

Создано: 26 декабря 2015 12:38 New!
Цитата · Личное сообщение · #3

Не здесь все просто, ядро - два виртпроцессора с 1 инструкцией, эмулирующие muv, and, or, not, xor, add, shl, shr
Движок родной коммерческий, (применялся и работает в моем проекте, правда в виде стековой VM) после внедрения которого AlexVel и спрыгнул с взлома (7 лет как прошло, кстати - только щас осознал .
А это чуть другая архитектура которую не стыдно и в открытый доступ отдать.

Ранг: 95.7 (постоянный)
Статус: Участник

Создано: 26 декабря 2015 12:39 New!
Цитата · Личное сообщение · #4

Code:
  1. 0040BE22   .  897C24 20     MOV DWORD PTR [ESP+20],EDi

Поправил значение регистра EDI с 283A6F4E на 21736559 и все.Нет смысла париться с вм ради того, чтобы изменилось слово в мессаджбоксе

Ранг: 35.1 (посетитель)
Статус: Участник

Создано: 26 декабря 2015 12:45 New!
Цитата · Личное сообщение · #5

unknownproject ну, этож не кракми, а все-же кейгенми
Но адрес правки верный

Добавлено спустя 11 минут
Года полтора назад я MsRem-овскую вм анализировал.
http://habrahabr.ru/post/218887/
Свою постарался облегчить (билдил не с всеми настройками) чтобы по сложности была примерно на этом-же уровне. Так что думаю, у профи сильных затруднений возникнуть не должно (темболее антидампа и антиотладки нет в принципе).

Ранг: 382.5 (мудрец)
Статус: Участник

Создано: 26 декабря 2015 13:06 New!
Цитата · Личное сообщение · #6

Ну, ждём тогда коммерческих применений. Вещь могучая - ничо там не понятно.

Ранг: 35.8 (посетитель)
Статус: Участник

Создано: 26 декабря 2015 13:08 New!
Цитата · Личное сообщение · #7

Байт-кода как такового не увидел. Вирт. контекст - x64, переменные на стэке. Вся вм - простыня примитивных операций над переменными, стрелка пирса, дублирование проверок на ветвлениях. Видел все это уже, не интересно. Теоретически, хороший оптимизатор (я все мечтаю о таком) может это все свернуть при должной сноровке.

Ранг: 35.1 (посетитель)
Статус: Участник

Создано: 26 декабря 2015 13:10 New!
Цитата · Личное сообщение · #8

Как статью наваяю, думаю много где появится (в том числе и в коммерции) - особливо у новичков в защите, бездумно сующих в проект все подряд

Добавлено спустя 2 минуты
Psalmopoeus Pulcher пишет:
Теоретически, хороший оптимизатор (я все мечтаю о таком) может это все свернуть при должной сноровке.

Пробовал оптимизатором еще на этапе реализации - не сворачивает (разве что в компиляции под арм - но это уже особенность). И да - там пирс и шеффер (чередуются).


Ранг: 315.6 (мудрец)
Статус: Участник
born to be evil

Создано: 26 декабря 2015 13:26 New!
Цитата · Личное сообщение · #9

Rouse_
в ГС уже совсем писать нечего, раз время появилось свободное?

Ранг: 35.1 (посетитель)
Статус: Участник

Создано: 26 декабря 2015 13:43 New!
Цитата · Личное сообщение · #10

ajax так новый год

Ранг: 271.6 (наставник)
Статус: Модератор
CrackLab

Создано: 26 декабря 2015 14:54 New!
Цитата · Личное сообщение · #11

оффтоп
Rouse_ пишет:
бездумно сующих в проект все подряд

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

Ранг: 35.8 (посетитель)
Статус: Участник

Создано: 27 декабря 2015 00:48 New!
Цитата · Личное сообщение · #12

exel@b : 9CC8596B77D9410831000000004635
KeyGen: 4BC226B66EC349033200000000464B

| Сообщение посчитали полезным: SReg, v00doo, Rouse_, 4kusNick, DICI BF, sefkrd


Ранг: 35.1 (посетитель)
Статус: Участник

Создано: 27 декабря 2015 01:58 New!
Цитата · Личное сообщение · #13

Шикарно Рассказывай

Ранг: 35.8 (посетитель)
Статус: Участник

Создано: 27 декабря 2015 10:30 New!
Цитата · Личное сообщение · #14

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

Ранг: 35.1 (посетитель)
Статус: Участник

Создано: 27 декабря 2015 10:48 New!
Цитата · Личное сообщение · #15

Обалдеть, обошел обе контрольных суммы, соль и ксоренную константу "Yes!" разместил в правильное место, да еще за такое маленькое время
Респект


Ранг: 515.2 (!)
Статус: Участник
Победитель турнира 2010

Создано: 27 декабря 2015 11:38 New!
Цитата · Личное сообщение · #16

Psalmopoeus Pulcher сильно в теме по поводу ВМ. Помнится его задание во втором туре контеста 2010.
https://exelab.ru/f/contest/
В описании задания прямо было написано "Алгоритм проверки довольно прост, чего не скажешь о виртуальной машине, на которой он исполняется ;)".

Ранг: 35.1 (посетитель)
Статус: Участник

Создано: 27 декабря 2015 12:09 New!
Цитата · Личное сообщение · #17

Да я уже понял
Кстати "Psalmopoeus Pulcher", для полноты картины кейген сделаешь?

Ранг: 35.8 (посетитель)
Статус: Участник

Создано: 27 декабря 2015 13:07 New!
Цитата · Личное сообщение · #18

Кеген, то кеген, пара строк.. Вот, еще вчера пьяненький написал. Комментарии снарядил.
Code:
  1. import random
  2.  
  3. name = raw_input('Your name: ')
  4.  
  5. #какой то ключ, нужен для расчетов
  6. magic = random.randint(1, 127)
  7.  
  8. #Расчет первой части серийника на основе введенного имени и magic. 8 символов
  9. crc = magic
  10. for i in range(len(name)): crc = (crc * ord(name[i]) * 2) ^ magic
  11. serial = "{0:X}".format(crc).rjust(8, '0')[-8:]
  12.  
  13. #Далее идет 2 символа magic
  14. serial += "{0:X}".format(magic).rjust(2, '0')
  15.  
  16. #Вторая часть серийника. Константа зашифрованная от первой части и magic
  17. serial += "{0:X}".format(ord(serial[0]) ^ (magic + 1) ^ 0x98).rjust(2, '0')
  18. serial += "{0:X}".format(ord(serial[1]) ^ (magic + 2) ^ 0x7B).rjust(2, '0')
  19. serial += "{0:X}".format(ord(serial[2]) ^ (magic + 3) ^ 0x31).rjust(2, '0')
  20. serial += "{0:X}".format(ord(serial[3]) ^ (magic + 4) ^ 0x72).rjust(2, '0')
  21.  
  22. #Надо полагать, случайная часть серийника
  23. serial += '00000000'
  24.  
  25. #Расчет контрольной суммы.
  26. crc = 0
  27. for i in range(len(serial)): crc = (crc + ord(serial[i]) * (+ 1)) % 0xFFFF
  28. serial += "{0:X}".format(crc).rjust(2, '0')
  29.  
  30. print('Your serial: %s' % serial)

Ранг: 35.1 (посетитель)
Статус: Участник

Создано: 27 декабря 2015 13:18 · Поправил: 27 декабря 2015 13:26 Rouse_ New!
Цитата · Личное сообщение · #19

Да в принципе оно, константы я да - упустил малеха, а ты заметил.
Вот оригинал:

Code:
  1. function GenerateSN(const Login: AnsiString): AnsiString;
  2. var
  3.   I: Integer;
  4.   Sn: Integer;
  5.   StartValue: Byte;
  6.   Crc: Word;
  7. begin
  8.   StartValue := 0;
  9.   while StartValue = 0 do
  10.     StartValue := Random($FF) mod 128;
  11.   Sn := StartValue;
  12.   for I := 1 to Min(8, Length(Login)) do
  13.     Sn := (Sn * (Byte(Login[I]) shl 1)) xor StartValue;
  14.   Result := IntToHex(Sn, 8) + IntToHex(StartValue, 2);
  15.  
  16.   Result := Result + IntToHex($C1 xor Byte(Byte('Y') xor Byte(Result[1]) xor (StartValue + 1)), 2);
  17.   Result := Result + IntToHex($1E xor Byte(Byte('e') xor Byte(Result[2]) xor (StartValue + 2)), 2);
  18.   Result := Result + IntToHex($42 xor Byte(Byte('s') xor Byte(Result[3]) xor (StartValue + 3)), 2);
  19.   Result := Result + IntToHex($53 xor Byte(Byte('!') xor Byte(Result[4]) xor (StartValue + 4)), 2);
  20.  
  21.   Result := Result + IntToHex($C1 xor Byte(Byte('N') xor Byte(Result[1]) xor (StartValue + 1)), 2);
  22.   Result := Result + IntToHex($1E xor Byte(Byte('o') xor Byte(Result[2]) xor (StartValue + 2)), 2);
  23.   Result := Result + IntToHex($42 xor Byte(Byte(':') xor Byte(Result[3]) xor (StartValue + 3)), 2);
  24.   Result := Result + IntToHex($53 xor Byte(Byte('(') xor Byte(Result[4]) xor (StartValue + 4)), 2);
  25.  
  26.   Crc := 0;
  27.   for I := 1 to 26 do
  28.     Crc := Crc + (Byte(Result[I]) * I);
  29.  
  30.   Result := Result + IntToHex(Crc, 4);
  31. end;

Ранг: 271.6 (наставник)
Статус: Модератор
CrackLab

Создано: 27 декабря 2015 16:01 New!
Цитата · Личное сообщение · #20

OKOB пишет:
Помнится его задание во втором туре

искал примерно год назад, но так и не нашел. если осталось у кого - просьба выложить.

Ранг: 35.1 (посетитель)
Статус: Участник

Создано: 27 декабря 2015 16:08 · Поправил: 27 декабря 2015 16:10 Rouse_ New!
Цитата · Личное сообщение · #21

Да, мне тоже интересно было бы


Ранг: 307.7 (мудрец)
Статус: Участник

Создано: 27 декабря 2015 16:12 · Поправил: 27 декабря 2015 16:22 mysterio New!
Цитата · Личное сообщение · #22

https://exelab.ru/f/contest/

upd: Раз удалено, тогда получите и распишитесь

| Сообщение посчитали полезным: SReg, Rouse_


Ранг: 271.6 (наставник)
Статус: Модератор
CrackLab

Создано: 27 декабря 2015 16:13 New!
Цитата · Личное сообщение · #23

mysterio спасибо кеп, там вообще-то ссылки не рабочие

Ранг: 35.1 (посетитель)
Статус: Участник

Создано: 27 декабря 2015 16:14 New!
Цитата · Личное сообщение · #24

mysterio там же не качается


Ранг: 515.2 (!)
Статус: Участник
Победитель турнира 2010

Создано: 27 декабря 2015 16:22 New!
Цитата · Личное сообщение · #25

Rouse_ пишет:
mysterio там же не качается



{ Атач доступен только для участников форума } - KeyGenMe_2010_task2.zip

| Сообщение посчитали полезным: SReg, Rouse_

 eXeL@B —› Основной форум —› Анализ VM

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

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS