Сейчас на форуме: -Sanchez- (+7 невидимых)

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

Ранг: 35.1 (посетитель), 1thx
Активность: 0.010
Статус: Участник

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

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

0419_26.12.2015_EXELAB.rU.tgz - keygenme.zip

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

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

Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

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

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

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 35.1 (посетитель), 1thx
Активность: 0.010
Статус: Участник

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

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



Ранг: 95.1 (постоянный), 247thx
Активность: 0.260.01
Статус: Участник

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

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

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


-----
TEST YOUR MIGHT




Ранг: 35.1 (посетитель), 1thx
Активность: 0.010
Статус: Участник

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

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

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



Ранг: 431.7 (мудрец), 389thx
Активность: 0.730.32
Статус: Участник

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

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



Ранг: 35.8 (посетитель), 23thx
Активность: 0.030
Статус: Участник

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

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



Ранг: 35.1 (посетитель), 1thx
Активность: 0.010
Статус: Участник

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

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

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

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




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

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

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

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 35.1 (посетитель), 1thx
Активность: 0.010
Статус: Участник

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

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



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

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

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

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



Ранг: 35.8 (посетитель), 23thx
Активность: 0.030
Статус: Участник

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

exel@b : 9CC8596B77D9410831000000004635
KeyGen: 4BC226B66EC349033200000000464B

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

Ранг: 35.1 (посетитель), 1thx
Активность: 0.010
Статус: Участник

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

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



Ранг: 35.8 (посетитель), 23thx
Активность: 0.030
Статус: Участник

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

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



Ранг: 35.1 (посетитель), 1thx
Активность: 0.010
Статус: Участник

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

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




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

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

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

-----
127.0.0.1, sweet 127.0.0.1




Ранг: 35.1 (посетитель), 1thx
Активность: 0.010
Статус: Участник

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

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



Ранг: 35.8 (посетитель), 23thx
Активность: 0.030
Статус: Участник

Создано: 27 декабря 2015 13:07
· Личное сообщение · #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 (посетитель), 1thx
Активность: 0.010
Статус: Участник

Создано: 27 декабря 2015 13:18 · Поправил: Rouse_
· Личное сообщение · #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;




Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

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

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

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



Ранг: 35.1 (посетитель), 1thx
Активность: 0.010
Статус: Участник

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

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




Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

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

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

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

-----
Don_t hate the cracker - hate the code.


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

Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

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

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



Ранг: 35.1 (посетитель), 1thx
Активность: 0.010
Статус: Участник

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

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




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

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

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



7603_27.12.2015_EXELAB.rU.tgz - KeyGenMe_2010_task2.zip

-----
127.0.0.1, sweet 127.0.0.1


| Сообщение посчитали полезным: SReg, Rouse_
 eXeL@B —› Основной форум —› Анализ VM
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати