Сейчас на форуме: tyns777, bezumchik (+4 невидимых)

 eXeL@B —› Вопросы новичков —› Помощь с keygen .NET
Посл.ответ Сообщение

Ранг: 1.5 (гость), 5thx
Активность: 0.02=0.02
Статус: Участник

Создано: 25 ноября 2019 17:37 · Поправил: Odin
· Личное сообщение · #1

Прошу помощи подскажите плз нашел в программе проверку серийника
можно ли написать кейген если в программе зашито ввиде байтового массива SecretKey и Iv
или нужно свой ключ генерить, патчить и только потом кейген писать?
Можно конечно пропатчить и забыть но хочется кейген написать

Используется TripleDES c этими параметрами:
CipherMode: CBC
Padding: PKCS7
SecretKey Length: 24
Iv Length: 8
InputBlockSize: 8
OutputBlockSize: 8

При вводе левого серийника из 32-х символов выбрасывается System.Security.Cryptography.CryptographicException: Bad Data.
при вызове метода cryptoStream.FlushFinalBlock()

п.с. познания в крипте минимальные

Вот процедура проверки серийника
Code:
  1. private KeyState CheckKey(string key) { // key length: 32 chars
  2.          byte[] buffer = new byte[key.Length / 2];
  3.          int num = 0;
  4.          for (int i = 0; i < key.Length; i += 2) {
  5.                  try {
  6.                         buffer[num] = Convert.ToByte(key.Substring(i, 2), 16);
  7.                  } catch {
  8.                         return KeyState.InvalidKey;
  9.                  }
  10.                  num++;
  11.          }
  12.          MemoryStream memoryStream = new MemoryStream();
  13.          CryptoStream cryptoStream = null;
  14.          try     {
  15.                  cryptoStream = new CryptoStream(memoryStream, 
  16.                         new TripleDESCryptoServiceProvider().CreateDecryptor(SecretKey, Iv), CryptoStreamMode.Write);
  17.          } catch {
  18.                  cryptoStream = null;
  19.                  return KeyState.Unknown;
  20.          }
  21.          byte[] arr = null;
  22.          if (cryptoStream != null) {
  23.                  try {
  24.                         cryptoStream.Write(buffer, 0, buffer.Length);
  25.                         cryptoStream.FlushFinalBlock(); // <---- System.Security.Cryptography.CryptographicException: Bad Data.
  26.                         memoryStream.Position = 0L;
  27.                         arr = memoryStream.ToArray();
  28.  
  29.                         cryptoStream.Close();
  30.                         memoryStream.Close();
  31.                  } catch {
  32.                         return KeyState.InvalidKey;
  33.                  }
  34.          }
  35.          if (arr[0] != _licenseVersion[0] || arr[1] != _licenseVersion[1] || arr[2] != _licenseVersion[2] ||
  36.         arr[3] != _licenseVersion[3]) {
  37.         return KeyState.WrongProductKey;
  38.     }
  39.  
  40.     if (arr[6] != byte_0[arr[4], arr[5]] && arr[9] != byte_0[arr[7], arr[8]]) {
  41.         return KeyState.WrongKey;
  42.     }
  43.          return KeyState.OK;
  44. }               


или --> https://pastebin.com/J7jDvPtC <--



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 25 ноября 2019 18:29
· Личное сообщение · #2

Odin пишет:
хочется кейген написать

но
п.с. познания в крипте минимальные
Забавно читать такие откровения. Для начала можно было бы погуглить про DES и предоставить в топике свои рассуждения на эту тему. По возможности их уже дополнят, скорректируют. Но раз даже этого минимума нет, то попробую за тебя начать:

Odin пишет:
зашито ввиде байтового массива SecretKey и Iv

Если известен секретный ключ (SecretKey) / вектор инициализации (Iv) - судя по всему, никаких проблем нет.

Odin пишет:
KeyState CheckKey(string key) { // key length: 32 chars

Это вводимая строка, которая преобразовывается в байты, затем расшифровывается. Результат отгружается в массив, с которым происходят побайтовые сравнения внизу.

Odin пишет:
32-х символов выбрасывается System.Security.Cryptography.CryptographicException: Bad Data.

Наверноеж, формат должен быть в hex, учитывая процедуру конвертации (ex: 010203AABBCCF1)

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


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

Создано: 25 ноября 2019 18:57 · Поправил: sefkrd
· Личное сообщение · #3

У тебя есть ключ и вектор..
Тебе нужно выполнить вместо TripleDESCryptoServiceProvider().CreateDecryptor(SecretKey, Iv) --> TripleDESCryptoServiceProvider().CreateEncryptor(SecretKey, Iv) данных, подходящих под условие двух последних if..
Длина криптованой строки не должна превышать 16 байт(не влезешь в длину ключа активации)
Типа:
Code:
  1. public static void Save(string str = "твои данные для ключа")
  2.         {
  3.             try
  4.             {
  5.                 MemoryStream memoryStream = null;
  6.                 CryptoStream cryptoStream = null;
  7.                 try
  8.                 {
  9.                     memoryStream = new MemoryStream();
  10.                     cryptoStream = new CryptoStream(memoryStream, new TripleDESCryptoServiceProvider().CreateEncryptor(key, iv), CryptoStreamMode.Write);
  11.                 }
  12.                 catch (Exception)
  13.                 {
  14.                 }
  15.                 if (cryptoStream != null)
  16.                 {
  17.                     using (StreamWriter streamWriter = new StreamWriter(cryptoStream))
  18.                     {
  19.                         streamWriter.Write(str);
  20.                     }
  21.                     byte[] bytes = memoryStream.ToArray();
  22.                     File.WriteAllBytes("key.bin", bytes);
  23.                 }
  24.             }
  25.             catch (Exception ex)
  26.             {
  27.                 Console.WriteLine("Error: " + ex.Message, "Unable to write file ");
  28.             }
  29.         }

А уже в key.bin будет твой ключ в формате hex.(32)

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

Ранг: 1.5 (гость), 5thx
Активность: 0.02=0.02
Статус: Участник

Создано: 25 ноября 2019 19:04
· Личное сообщение · #4

ELF_7719116 пишет:
Это вводимая строка, которая преобразовывается в байты, затем расшифровывается. Результат отгружается в массив, с которым происходят побайтовые сравнения внизу.


Спасибо, это мне понятно из кода также читал немного про TripleDES но не понятно почему при расшифровке ключа даже в формате hex выкидывает исключение такое ощущение что в коде чего-то не хватает код получен после обработки в de4dot до этого он был обфусцирован.

ELF_7719116 пишет:
Наверноеж, формат должен быть в hex, учитывая процедуру конвертации (ex: 010203AABBCCF1)


Да формат в hex но например строка "48656C6C6F576F726C6448656C6C6F57" тоже выдает CryptographicException: Bad Data.



Ранг: 51.8 (постоянный), 58thx
Активность: 0.03=0.03
Статус: Участник

Создано: 25 ноября 2019 19:45
· Личное сообщение · #5

Odin пишет:
но не понятно почему при расшифровке ключа даже в формате hex выкидывает исключение

Паддинг?



Ранг: 1.5 (гость), 5thx
Активность: 0.02=0.02
Статус: Участник

Создано: 25 ноября 2019 19:59 · Поправил: Odin
· Личное сообщение · #6

Prober пишет:
Паддинг?


Да по описанию эксепшена это связано с Padding но валидный ключ имеет же такой же формат поэтому не понятно как-то будет работать если даже валидный ключ подсунуть.

Немного почитал стало ясно вроде как sefkrd указал выше если сделать E(SK, IV) то нужный паддинг сам добавиться при шифровании.

Теперь не понятно другое как обычно поступают чтоб получить данные, подходящих под условие ведь выходной массив данных после шифрования без патча я не могу изменять.



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 25 ноября 2019 21:27
· Личное сообщение · #7

Odin пишет:
данные, подходящих под условие ведь выходной массив данных после шифрования без патча я не могу изменять.
Ничего не требуется патчить в самой программе. Т.к. в кейгене выполняется цепочка этих же операций наоборот: данные в массив изначально задаются с твоей стороны и подбираются, согласно последнему условию И граничному условию - длинне массива, который не должен превышать 16 байт. Потом это все шифруется TrippleDES.CreateEncryptor с известным SecretKey и Iv, затем преобразовавается в строку. Программа выполнит обратные действия.
По существу, необходимо знать _licenseVersion и убедиться, что найденная функция - единственная, которая чекает серийник и остальные байты в массиве не сравниваются с другими константами.

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

Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 26 ноября 2019 17:57
· Личное сообщение · #8

В рамках темы про DES. Возможно, несколько дурацкий вопрос: как связаны IP и IPi - т.е. как вторая из первой и обратно получается для des_permute?




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

Создано: 26 ноября 2019 18:08
· Личное сообщение · #9

ELF_7719116
Привет! Вот в этом и "гебус" ..



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 26 ноября 2019 20:02
· Личное сообщение · #10

sefkrd пишет:
гебус

Полагаю, для sbox, PS обратные таблицы в паблике него существуют?!



Ранг: 1.5 (гость), 5thx
Активность: 0.02=0.02
Статус: Участник

Создано: 28 ноября 2019 15:20 · Поправил: Odin
· Личное сообщение · #11

sefkrd, ELF_7719116 Большое спасибо за ликбез! Благодаря вам написал свой первый кейген

Мучился и не мог понять как разрабы проверку серийника сделали помимо TripleDES и т.д. т.е. в программе есть форма с TextBox-ми максимальное кол-во символов 32 в формате hex даже в отладчике проверил что на вход метода:

Code:
  1. private KeyState CheckKey(string key)


доходят эти самые 32 символа без изменений.

Но вот проблема в том что когда я делаю в кейгене ENCRYPT(SecretKey, IV)
на выходе я получаю 48 символов (32 символа + 16 символов добавляет Padding.PKCS7)
a в форму только ведь 32 символа можно ввести!
Если при ENCRYPT указать Padding.None то я получаю 32 символа
но тогда метод CheckKey выше выкидывает CryptographicException: Bad Data. так как патчить
код чтоб сделать Padding.None в программе я не хотел стал искать дальше оказалось что
эта форма фейковая!
Активатиция осуществляется через зашифрованный файл лицензии в котором хранится Key (48 символов) если
в поле записать ключ сгенерированный моим кейгеном и зашифровать файл обратно то программа
успешно активируется.

| Сообщение посчитали полезным: sefkrd, Jupiter, mak, daFix, ELF_7719116


Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 28 ноября 2019 15:56
· Личное сообщение · #12

Odin пишет:
написал свой первый кейген


Поздравляю!
Круто, когда неофит не останавливается, а доходит до конца!

Добавил твой пример в правила:
--> Правила подфорума "Вопросы новичков" <--

-----
EnJoy!


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


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