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

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

Ранг: 2.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 декабря 2010 14:49 · Поправил: criogen
· Личное сообщение · #1

Доброе время суток. Нужна ваша помощь в созданием(если это возможно) кейгена. Сборка без обфускации.
В ней есть метод который проверяет ключ. Ключ состоит из инфомации о лицензии(структура) и её подписи. подпись находиться в диапазоне ключа 0х0-0х88, ключ находиться в реестре в Base64.
Вот этот метод:
Code:
  1.                 try
  2.                 {
  3.                     byte[] buffer = Convert.FromBase64String(this.GetData(key)); //Структура
  4.                     
  5.                     byte[] rgbSignature = Convert.FromBase64String(this.GetSign(key)); //Подпись структуры
  6.                     return VerifyHash("<RSAKeyValue><Modulus>yNuZy4wH5P3B8z6JizxE8jCOcVi56/1pUEog qmBKb/oHzZoDknOZNS2Eezg90LjJPxht3wCzqWaL4EnpLa2KQmJYRUyxb3HawCFlmBmGIq 0gUuYs98j9qsD2HgxgzWT5tV0A5w==</Modulus><Exponent>AQAB</Exponent></RSA KeyValue>", SHA1.Create().ComputeHash(buffer), rgbSignature);
  7.                 }
  8.                 catch
  9.                 {
  10.                 }
  11.  

Функция
Code:
  1.         public static bool VerifyHash(string puk, byte[] rgbHash, byte[] rgbSignature)
  2.         {
  3.             byte[] buffer = null;
  4.             byte[] buffer2 = null;
  5.             XmlTextReader reader = new XmlTextReader(new StringReader(puk));
  6.             while (reader.Read())
  7.             {
  8.                 if (reader.NodeType == XmlNodeType.Element)
  9.                 {
  10.                     if (((reader.Name == "Modulus") && reader.Read()) && (reader.NodeType == XmlNodeType.Text))
  11.                     {
  12.                         buffer = Convert.FromBase64String(reader.Value);
  13.                     }
  14.                     if (((reader.Name == "Exponent") && reader.Read()) && (reader.NodeType == XmlNodeType.Text))
  15.                     {
  16.                         buffer2 = Convert.FromBase64String(reader.Value);
  17.                     }
  18.                 }
  19.             }
  20.             uint[] a = new uint[] { 1 };
  21.             uint[] b = Parse(rgbSignature);
  22.             uint[] numArray3 = Parse(buffer);
  23.             if (buffer2.Length != 3)
  24.             {
  25.                 throw new Exception();
  26.             }
  27.             int num = (buffer2[0] + (buffer2[1] * 0x100)) + (buffer2[2] * 0x10000);
  28.             while (num > 0)
  29.             {
  30.                 if ((num % 2) > 0)
  31.                 {
  32.                     a = Devide(Multiply(a, b), numArray3);
  33.                 }
  34.                 num = num >> 1;
  35.                 b = Devide(Multiply(b, b), numArray3);
  36.             }
  37.             byte[] bytes = GetBytes(a);
  38.  
  39.             int num2 = bytes.Length - rgbHash.Length;
  40.  
  41.             for (int i = 0; i < rgbHash.Length; i++)
  42.             {
  43.                 if (rgbHash[i] != bytes[num2 + i])
  44.                 {
  45.                     return false;
  46.                 }
  47.             }
  48.             return true;
  49.         }


Вот ссылка на сборку: http://www.multiupload.com/UNH96Y7R79

Modulus: C8-DB-99-CB-8C-07-E4-FD-C1-F3-3E-89-8B-3C-44-F2-30-8E-71-58-B9-EB-FD-69-50-4A-20-AA-60-4A-6F-FA-07-CD-9A-03-92-73-99-35-2D-84-7B-38-3D-D0-B8-C9-3F-18-6D-DF-00-B3-A9-66-8B-E0-49-E9-2D-AD-8A-42-62-58-45-4C-B1-6F-71-DA-C0-21-65-98-19-86-22-AD-20-52-E6-2C-F7-C8-FD-AA-C0-F6-1E-0C-60-CD-64-F9-B5-5D-00-E7

Exponent: 010001

У меня возникли такие вопросы:
1. Modulus(100 байт) и Експонента не малая, значит ли это кейген невозможно сделать? Как могут помочь в этом валидные ключи?
2. Я пробывал в функцию передавать валидные ключи(от более старых версий) но время их проверки слишком велико( два вложеных цикла) значит ли это что это не то место где проверяеться серийник? По коду всё указывает именно на это место.



3. Кроме этой функции в программе релизованная стандартная для .NET компонентов проверка лицензии(абстрактный класс наследник от LicenseProvider). Как с ней можно бороться без патчинга, т.е. как её заставить сгеренерить валидную лицензию или хотябы узнать какая реализация проверки ключа?
4. Как отладить сборку, не .exe ? Т.е. вызвать определенный метод в библиотеке? Какие отладчики лучше для этого использовать и можно ли как-то в Visual Studio?
5. Еще там есть структура UserData она идет после подписи RSA, в ней первые 20 байт не используються почему и где они могут использоваться я ненашел, но такая же размерность SHA1 хэша, возможно ли что это он и должен в них храниться? В проверки подписи последние её 20 байт сравниваться тоже с SHA1 хэшом.

Интересует именно вариант без патчинга.
Заранее спасибо за помощь.



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 29 декабря 2010 15:43 · Поправил: Vovan666
· Личное сообщение · #2

RSA 800bits без патчинга никак,а с патчем можно просто подменить Modulus и генерить "валидные" лицензии.



Ранг: 2.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 декабря 2010 19:51
· Личное сообщение · #3

Vovan666 пишет:
RSA 800bits без патчинга никак

Даже если есть "валидная" лицензия?



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

Создано: 29 декабря 2010 21:04
· Личное сообщение · #4

criogen пишет:
Даже если есть "валидная" лицензия?


Если нету грубых ошибок в реализации - то ничего не меняет.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 30 декабря 2010 09:53
· Личное сообщение · #5

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

-----
Yann Tiersen best and do not fuck




Ранг: 2.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 декабря 2010 16:28 · Поправил: criogen
· Личное сообщение · #6

Спасибо, с ключем я разобрался. А с пунктами 3-5 можете подсказать?
И еще вопрос по поводу алгоритма проверки подписи:
Code:
  1.  
  2.                 if ((num % 2) > 0)
  3.                 {
  4.                     a = Devide(Multiply(a, b), numArray3);
  5.                 }
  6.                 num = num >> 1;
  7.                 b = Devide(Multiply(b, b), numArray3);


a и b это P и Q в RSA ? Это и есть большие числа?




Ранг: 2.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 января 2011 20:23 · Поправил: criogen
· Личное сообщение · #7


Еще один вопрос, как бороться с
:


// This item is obfuscated and can not be translated.


в Рефлекторе? в IL он показывает код, но не транслирует в язык высокого уровня. После ildasm, ilasm не собирает, выдает "***** FAILURE ***** " и всё. Есть какой-то инструмент который сможет сдампить эту процедуру и пришить её потом в сборке?


 eXeL@B —› Вопросы новичков —› .NET + RSA = keygen?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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