Сейчас на форуме: Magister Yoda, johnniewalker, Kybyx, vsv1, r0lka, -Sanchez-, testrev1337 (+3 невидимых)

 eXeL@B —› Крэки, обсуждения —› Взлом программы написанной на .NET с зашифрованными с помощью SHA строками
Посл.ответ Сообщение

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

Создано: 08 апреля 2011 03:19 · Поправил: fl4r3
· Личное сообщение · #1

Здравствуйте. Вторая тема которую я создаю здесь за 2 года, но я опять не справляюсь (если кому то интересно, то предыдущая тема здесь:https://ssl.exelab.ru/f/action=vthread&forum=2&topic=15222&page=0). Есть весьма узкоспециализированный софт. Ломаю лично для себя. Программа весьма объемная. Строки внутри хешированы SHA. Декомпилятор .NET выдает исходный код без проблем (кроме хешированных строк, конечно). Кросс референсы не бьются. Всего существует несколько различных лицензий для этой программы, каждой из версий присваивается значение const int:
1) datalogger = -1
2) Developer = 4
3) Free = 0
4) Pro_Demon = 1
5) Pro_Ostrich = 2
6) Tuner = 3
Все это хранится в eCtune.Data->eCtuneVersions.

В меню программы есть Help->Registration. Есть привязка к Machine ID. Но я думаю можно обойтись и без написания кейгена, а просто поправить проверку версии при старте, хотя конечно это помогло бы получать новые обновления для этой программы.

Надо найти где при запуске программы проверяется версия и поправить код. Под отладчиком отказывается работать.

Цель: заполучить версию Tuner.

Пожалуйста, тыкните носом, куда копать. Заранее благодарен.

Сам софт можно скачать по ссылке: http://websrv.ectune.com/ectune.setup.current.zip



Ранг: 128.8 (ветеран), 21thx
Активность: 0.060.05
Статус: Участник

Создано: 08 апреля 2011 05:22
· Личное сообщение · #2

"Строки внутри зашифрованы с помощью SHA"

SHA - это хеш , а не алгоритм шифрования



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

Создано: 08 апреля 2011 07:35 · Поправил: fl4r3
· Личное сообщение · #3

Ок, криптографическая хеш-функция, только не вижу пользы от поста. Я думаю понятно, что имелось ввиду.



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

Создано: 08 апреля 2011 09:28
· Личное сообщение · #4

Строки с помощью SAE деобфусцируются как раз без проблем.
Основная проблема, как по мне, потом переподписать или убрать подпись файла строгим именем, чтобы запустить поправленый .ехе.
Еще поубирать все ловушки типа -
Code:
  1. internal bool m0005b5(enum04d p0)
  2. {
  3.     FileInfo info = new FileInfo(Application.StartupPath + @"\license.xml");
  4.     if (!info.Exists && (this.m0005c5() != eCtuneVersions.Pro_Demon))
  5.     {
  6.         MessageBox.Show("hack");
  7.         this.m0005b6(" ", "Hacked Version Warning; GetOpt(); fn.exists false", enum0153.f000d33);
  8.         this.m0005b7(enum0153.f000d3b);
  9.         this.m0005b3();
  10.         this.m0002e6();
  11.         m000442();
  12.     }
  13.     if (((this.m0005c5() != eCtuneVersions.datalogger) && (this.m0005c5() != eCtuneVersions.Free)) && !this.m0005c7())
  14.     {
  15.         if (this.f000d1c != this.f000d1d)
  16.         {
  17.             this.m0005b6(" ", "Hacked Version Warning; GetOpt() LicExpDate", enum0153.f000d33);
  18.             this.m0005b7(enum0153.f000d3b);
  19.             m000442();
  20.         }
  21.         if (this.f000d17 != this.f000d18)
  22.         {
  23.             this.m0005b6(" ", "Hacked Version Warning; GetOpt() LicID", enum0153.f000d33);
  24.             this.m0005b7(enum0153.f000d3b);
  25.             m000442();
  26.         }
  27.         if (this.f000d19 != this.f000d1a)
  28.         {
  29.             this.m0005b6(" ", "Hacked Version Warning;GetOpt() LicType", enum0153.f000d33);
  30.             this.m0005b7(enum0153.f000d3b);
  31.             m000442();
  32.         }
  33.     }




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

Создано: 08 апреля 2011 10:39 · Поправил: fl4r3
· Личное сообщение · #5

uncleua
За SAE спасибо, правда у меня не получилось получить читабельные строки все равно, видимо я что то делаю не так, никогда не пользовался SAE. При попытке деобфусцировать получаю:
"Could not load file or assembly 'eCtune, Version=0.0.2.3, Culture=neutral, PublicKeyToken=6ab39c1170c85a55' or one of its dependencies. Strong name validation failed. (Exception from HRESULT: 0x8013141A)"
Кстати, чем был получен приведенный выше код?



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

Создано: 08 апреля 2011 10:43
· Личное сообщение · #6

С помощью SAE 13.2 все строки нормально получаются. Выбираешь экзешник, в контекстном меню нажимаешь deobfuscator и всё



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

Создано: 08 апреля 2011 10:51
· Личное сообщение · #7

Kaimi
Ок, выбрал другие опции деобфусцирования. Процесс пошел. Спасибо.



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

Создано: 08 апреля 2011 10:58
· Личное сообщение · #8

Не знаю, получаю ошибку (если только не выбрать вариант в опциях Flow without boolean function, который не дает никакого эффекта в деобусцировании строк):

Could not load file or assembly 'eCtune, Version=0.0.2.3, Culture=neutral, PublicKeyToken=6ab39c1170c85a55' or one of its dependencies. Strong name validation failed. (Exception from HRESULT: 0x8013141A)
at System.Reflection.Assembly.nLoadFile(String path, Evidence evidence)
at System.Reflection.Assembly.LoadFile(String path)
at SimpleAssemblyExplorer.AssemblyUtils.LoadAssemblyFile(String assemblyFile)
at SimpleAssemblyExplorer.Deobfuscator.DeobfBoolFunction(String assemblyFile, MethodDefinition searchInMethod)
at SimpleAssemblyExplorer.Deobfuscator.DeobfFlow(String file, MethodDefinition method)
at SimpleAssemblyExplorer.Deobfuscator.HandleConstructor(TypeDefinition type, String file)
at SimpleAssemblyExplorer.Deobfuscator.HandleType(TypeDefinition type, String file)
at SimpleAssemblyExplorer.Deobfuscator.Deobf(AssemblyDefinition assemblyDef, String file)
at SimpleAssemblyExplorer.Deobfuscator.Go()
at SimpleAssemblyExplorer.frmDeobf.btnOK_Click(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Strong name validation failed. (Exception from HRESULT: 0x8013141A)




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

Создано: 08 апреля 2011 11:21 · Поправил: PE_Kill
· Личное сообщение · #9

fl4r3 тебе же написали

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


Как думаешь что означает строчка?:
fl4r3 пишет:
Strong name validation failed.


PS Походу SAE пытается что то изменить в сборке при деобфускации.

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




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

Создано: 08 апреля 2011 11:31 · Поправил: fl4r3
· Личное сообщение · #10

Проблема решилась запуском под Windows XP. На Windows 7 выдавало, то что я писал выше.

Продолжаю анализировать код. Любая помощь приветствуется.



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

Создано: 08 апреля 2011 23:04
· Личное сообщение · #11

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


Вот в этом не вижу проблемы. Можно анализировать деобфусцированный файл, а править исходный. Найти те куски из деобфусцированного файла в исходном не составляет труда. Ищем просто по последовательности HEX значений.



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

Создано: 09 апреля 2011 00:08
· Личное сообщение · #12

fl4r3 пишет:
Вот в этом не вижу проблемы.


Ну про то что файл можно править в НЕХ-се я, допустим, имею какое-то представление.
Вот только слабо верится, что поправленый подписаный файл запустится...



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

Создано: 09 апреля 2011 07:48 · Поправил: fl4r3
· Личное сообщение · #13

Поправил 20 байт в разных местах. Проверил. Работает. Верить\не верить не надо, надо проверять. А помощи в анализе всегда буду рад. Например анализу алгоритма проверки версии при запуске.




Ранг: 127.3 (ветеран), 44thx
Активность: 0.090
Статус: Участник

Создано: 09 апреля 2011 15:38
· Личное сообщение · #14

fl4r3 пишет:
Верить\не верить не надо, надо проверять

ну поди проверь на другой системе например.

-----
zzz




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

Создано: 09 апреля 2011 19:17
· Личное сообщение · #15

Как я уже писал, я ломаю для себя. Поэтому, то что он не запуститься где то еще, это абсолютно не критично. А вообще конечно можно написать кейген и это решит все проблемы. Правда программа при старте думает, что она PRO_Demon лицензия и не дает даже возможности вводить Serial ID, который генерируется на основе Machine ID и включает в себя и ваше имя и название компании и т.д.



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

Создано: 10 апреля 2011 07:28 · Поправил: fl4r3
· Личное сообщение · #16

Вообще, в принципе, единственное отличие версии от версии это активизация определнных меню. Сейчас они установлены в Enabled = false. При создании новой прошивки меню File->Save as Binary недоступно. Осталось локализовать участок кода отвечающий за проверку и установку этого меню в .Enabled = true. Насколько я понимаю мне надо искать коллекцию типа MenuItemCollection в коде?



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

Создано: 10 апреля 2011 08:22 · Поправил: fl4r3
· Личное сообщение · #17

Собственно вот интересный кусок кода:
Code:
  1. internal void m0001ae(enum061 p0, bool p1)
  2. {
  3.     try
  4.     {
  5.         DateTime time;
  6.         string fileName = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\TMSetp2.dbf";
  7.         string str2 = null;
  8.         string str3 = null;
  9.         bool flag = true;
  10.         FileInfo info = new FileInfo(fileName);
  11.         if (info.Exists)
  12.         {
  13.             StreamReader reader = new StreamReader(fileName);
  14.             str2 = reader.ReadToEnd();
  15.             reader.Close();
  16.             reader.Dispose();
  17.             reader = null;
  18.         }
  19.         else if (flag)
  20.         {
  21.             goto Label_0096;
  22.         }
  23.         if (!string.IsNullOrEmpty(str2))
  24.         {
  25.             str3 = this.m0001c4(str2, "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100) + "\r\n";
  26.         }

Строку h0nd@eC7un€ они используют как пароль, 473470 как соль, 2 - количество итераций. Строка h0nd@eC7un€ видимо по их мнению выглядит как завуалированное название программы

Сам алгоритм шифрования:
Code:
  1. internal string m0001c3(string p0, string p1, string p2, string p3, int p4, string p5, int p6)
  2. {
  3.     byte[] bytes = Encoding.ASCII.GetBytes(p5);
  4.     byte[] rgbSalt = Encoding.ASCII.GetBytes(p2);
  5.     byte[] buffer = Encoding.UTF8.GetBytes(p0);
  6.     byte[] rgbKey = new PasswordDeriveBytes(p1, rgbSalt, p3, p4).GetBytes(p6 / 8);
  7.     RijndaelManaged managed = new RijndaelManaged();
  8.     managed.Mode = CipherMode.CBC;
  9.     ICryptoTransform transform = managed.CreateEncryptor(rgbKey, bytes);
  10.     MemoryStream stream = new MemoryStream();
  11.     CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Write);
  12.     stream2.Write(buffer, 0, buffer.Length);
  13.     stream2.FlushFinalBlock();
  14.     byte[] inArray = stream.ToArray();
  15.     stream.Close();
  16.     stream2.Close();
  17.     return Convert.ToBase64String(inArray);
  18. }


и дешифрования:

Code:
  1. internal string m0001c4(string p0, string p1, string p2, string p3, int p4, string p5, int p6)
  2. {
  3.     if (p0 == null)
  4.     {
  5.         return null;
  6.     }
  7.     byte[] bytes = Encoding.ASCII.GetBytes(p5);
  8.     byte[] rgbSalt = Encoding.ASCII.GetBytes(p2);
  9.     byte[] buffer = Convert.FromBase64String(p0);
  10.     byte[] rgbKey = new PasswordDeriveBytes(p1, rgbSalt, p3, p4).GetBytes(p6 / 8);
  11.     RijndaelManaged managed = new RijndaelManaged();
  12.     managed.Mode = CipherMode.CBC;
  13.     ICryptoTransform transform = managed.CreateDecryptor(rgbKey, bytes);
  14.     MemoryStream stream = new MemoryStream(buffer);
  15.     CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Read);
  16.     byte[] buffer5 = new byte[buffer.Length];
  17.     int count = stream2.Read(buffer5, 0, buffer5.Length);
  18.     stream.Close();
  19.     stream2.Close();
  20.     return Encoding.UTF8.GetString(buffer5, 0, count);
  21. }


Несовпадения отлавливают эксепшеном по Out Of Bounds.

В директории %systemroot%\system32\ лежат два файла:
TMSetp.dbf и TMSetp2.dbf

Содержимое TMSetp.dbf = ј7ѓfЗ”у™РE‘°ПЇЙНЭUі и меняется при каждом запуске.

TMSetp2.dbf - пустой.



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

Создано: 10 апреля 2011 09:05 · Поправил: fl4r3
· Личное сообщение · #18

Формат файла license.xml:

Code:
  1. private void m0001b5(string p0, string p1)
  2. {
  3.     string key = p0;
  4.     if (key != null)
  5.     {
  6.         int num;
  7.         if (c000005.f0000b0 == null)
  8.         {
  9.             Dictionary<string, int> dictionary1 = new Dictionary<string, int>(0x12);
  10.             dictionary1.Add("Name", 0);
  11.             dictionary1.Add("Org", 1);
  12.             dictionary1.Add("Email", 2);
  13.             dictionary1.Add("LicID", 3);
  14.             dictionary1.Add("LicType", 4);
  15.             dictionary1.Add("LicExpDate", 5);
  16.             dictionary1.Add("LicKey", 6);
  17.             dictionary1.Add("LicPayType", 7);
  18.             dictionary1.Add("Ostrich0", 8);
  19.             dictionary1.Add("Ostrich1", 9);
  20.             dictionary1.Add("Ostrich2", 10);
  21.             dictionary1.Add("Ostrich3", 11);
  22.             dictionary1.Add("Ostrich4", 12);
  23.             dictionary1.Add("Ostrich5", 13);
  24.             dictionary1.Add("Ostrich6", 14);
  25.             dictionary1.Add("Ostrich7", 15);
  26.             dictionary1.Add("Ostrich8", 0x10);
  27.             dictionary1.Add("Ostrich9", 0x11);
  28.             c000005.f0000b0 = dictionary1;
  29.         }
  30.         if (c000005.f0000b0.TryGetValue(key, out num))
  31.         {
  32.             switch (num)
  33.             {
  34.                 case 0:
  35.                     this.f0003cb = p1;
  36.                     return;
  37.  
  38.                 case 1:
  39.                     this.f0003cd = p1;
  40.                     return;
  41.  
  42.                 case 2:
  43.                     this.f0003cc = p1;
  44.                     return;
  45.  
  46.                 case 3:
  47.                     this.f0003ce = this.m0001c4(p1, "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100);
  48.                     if (!this.f0003d8)
  49.                     {
  50.                         this.f0003cf = this.m0001c4(p1, "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100);
  51.                     }
  52.                     return;
  53.  
  54.                 case 4:
  55.                     this.f0003d0 = (eCtuneVersions) int.Parse(this.m0001c4(p1, "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100));
  56.                     if (!this.f0003d8)
  57.                     {
  58.                         this.f0003d1 = (eCtuneVersions) int.Parse(this.m0001c4(p1, "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100));
  59.                     }
  60.                     return;
  61.  
  62.                 case 5:
  63.                     this.f0003d3 = DateTime.Parse(this.m0001c4(p1, "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100), CultureInfo.InvariantCulture);
  64.                     if (!this.f0003d8)
  65.                     {
  66.                         this.f0003d4 = DateTime.Parse(this.m0001c4(p1, "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100), CultureInfo.InvariantCulture);
  67.                     }
  68.                     return;
  69.  
  70.                 case 6:
  71.                     this.f0003c7 = p1;
  72.                     return;
  73.  
  74.                 case 7:
  75.                     this.f0003d5 = (enum03d) int.Parse(this.m0001c4(p1, "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100));
  76.                     return;
  77.  
  78.                 case 8:
  79.                     this.f0003d2[0] = p1;
  80.                     return;
  81.  
  82.                 case 9:
  83.                     this.f0003d2[1] = p1;
  84.                     return;
  85.  
  86.                 case 10:
  87.                     this.f0003d2[2] = p1;
  88.                     return;
  89.  
  90.                 case 11:
  91.                     this.f0003d2[3] = p1;
  92.                     return;
  93.  
  94.                 case 12:
  95.                     this.f0003d2[4] = p1;
  96.                     return;
  97.  
  98.                 case 13:
  99.                     this.f0003d2[5] = p1;
  100.                     return;
  101.  
  102.                 case 14:
  103.                     this.f0003d2[6] = p1;
  104.                     return;
  105.  
  106.                 case 15:
  107.                     this.f0003d2[7] = p1;
  108.                     return;
  109.  
  110.                 case 0x10:
  111.                     this.f0003d2[8] = p1;
  112.                     return;
  113.  
  114.                 case 0x11:
  115.                     this.f0003d2[9] = p1;
  116.                     return;
  117.  
  118.                 default:
  119.                     return;
  120.             }
  121.         }
  122.     }
  123. }

Насколько я понял потом из этого файла создается файл lic.xml. Как видно часть полей хешируется SHA1, а именно:
LicID
LicType
LicExpDate
LicPayType

Похоже скоро можно будет писать генератор лицензий. Буду рад любой помощи. Пока не совсем понимаю где используется Machine ID. Есть подозрение что это LicKey.

Апдейт:
Попробовал создать файл license.xml по описаному выше шаблону найденному в коде. Получилось следующее:
Code:
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <License>
  3.          <Name>fl4r3</Name>
  4.          <Org>fl4r3 Corp</Org>
  5.          <Email>asdf@mail.ru</Email>
  6.          <LicID>1111-2222-3333-4444-5555</LicID>
  7.          <LicType>3</LicType>
  8.          <LicExpDate>2/16/2012 12:15:12 PM</LicExpDate>
  9.          <LicKey>39BC4A-4ABC67-67382A-2A29CF-CF217D-4F</LicKey>
  10.          <LicPayType>PayPal</LicPayType>
  11.          <Ostrich0></Ostrich0>
  12.          <Ostrich1></Ostrich1>
  13.          <Ostrich2></Ostrich2>
  14.          <Ostrich3></Ostrich3>
  15.          <Ostrich4></Ostrich4>
  16.          <Ostrich5></Ostrich5>
  17.          <Ostrich6></Ostrich6>
  18.          <Ostrich7></Ostrich7>
  19.          <Ostrich8></Ostrich8>
  20.          <Ostrich9></Ostrich9>
  21. </License>>


Теперь надо зашифровать функцией m0001c3 поля LicID, LicType, LicExpDate, LicPayType. Зашифрованный вид:
Code:
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <License>
  3.          <Name>fl4r3</Name>
  4.          <Org>fl4r3 Corp</Org>
  5.          <Email>asdf@mail.ru</Email>
  6.          <LicID>2/RynN2zNQjCGZKSYyGnWN8a76G3bzeCanfVHZCdBLA=</LicID>
  7.          <LicType>k9ZrF0Oo4vI7uysX2PSkMQ==</LicType>
  8.          <LicExpDate>MXwdAN8e+d6VWSx4mik2RbCblhGK2eADnqgrADINF+Q=</LicExpDate>
  9.          <LicKey>39BC4A-4ABC67-67382A-2A29CF-CF217D-4F</LicKey>
  10.          <LicPayType>ePn0PZFLbNorI8vAddDWUw==</LicPayType>
  11.          <Ostrich0></Ostrich0>
  12.          <Ostrich1></Ostrich1>
  13.          <Ostrich2></Ostrich2>
  14.          <Ostrich3></Ostrich3>
  15.          <Ostrich4></Ostrich4>
  16.          <Ostrich5></Ostrich5>
  17.          <Ostrich6></Ostrich6>
  18.          <Ostrich7></Ostrich7>
  19.          <Ostrich8></Ostrich8>
  20.          <Ostrich9></Ostrich9>
  21. </License>


Если подсунуть данную лицензию программе, то в %systemroot%\system32\ она создаст кроме TMSetp.dbf еще и непустой файл TMSetp2.dbf, но почти мгновенно его удалит и выйдет с ошибкой Contact eCtune(info@ectune.com) with MSGID 003H. Содержимое TMSetp.dbf:
Code:
  1. §хwЏNПs†®eA¬[OЩxk†ЎУu

Содержимое TMSetp2.dbf:
Code:
  1. gjP1bm8QYMleZMhZCd8UwEoiy6l67BW3r47s0IqFFeUnS3KuPjt5ddHQrz0AA4dK4QkwUPAuseMSltWzhx+bvDcs061e+bsysJd0gMbc7j8=

Хотя из данного кода:
Code:
  1.     StreamReader reader3 = new StreamReader(Application.StartupPath + @"\license.xml");
  2.     str = reader3.ReadToEnd();
  3.     reader3.Close();
  4.     reader3.Dispose();
  5.     reader3 = null;
  6.     try
  7.     {
  8.         str2 = this.m0001c4(str, "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100);
  9.         str = null;
  10.         StreamWriter writer = null;
  11.         writer = new StreamWriter(Application.StartupPath + @"\settings\lic.xml");
  12.         writer.Write(str2);

видно, что license.xml должен быть зашифрован, а его расшифрованный вариант будет храниться в lic.xml.

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


Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 10 апреля 2011 09:17
· Личное сообщение · #19

Пользуйся кнопкой "Правка", не создавай сообщения подряд.



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

Создано: 10 апреля 2011 12:04 · Поправил: fl4r3
· Личное сообщение · #20

Archer
Приношу извинения за нарушение правил форума. Замечания приняты.

Получается, что файл license.xml зашифрован целиком функцией m0001c3, а получившийся файл lic.xml содержит шифрованные с помощью той же функции значения LicId, LicType и т.д.? То есть насколько я понимаю логику разработчиков, они пошли данным путем, чтобы даже если пользователь во время запуска программы найдет файл lic.xml, то он увидит лишь криптованные строки. Вообщем, я написал криптор декриптор файла license.xml и lic.xml. Вот код:
Code:
  1. using System;
  2. using System.Xml;
  3. using System.IO;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Data;
  7. using System.Drawing;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Windows.Forms;
  11. using System.Security.Cryptography;
  12.  
  13. namespace WindowsFormsApplication2
  14. {
  15.     public partial class Form1 : Form
  16.     {
  17.         public Form1()
  18.         {
  19.             InitializeComponent();
  20.         }
  21.  
  22.         private string encryptUTF8(string p0, string p1, string p2, string p3, int p4, string p5, int p6) //m0001c3
  23.         {
  24.             byte[] bytes = Encoding.ASCII.GetBytes(p5);
  25.             byte[] rgbSalt = Encoding.ASCII.GetBytes(p2);
  26.             byte[] buffer = Encoding.UTF8.GetBytes(p0);
  27.             byte[] rgbKey = new PasswordDeriveBytes(p1, rgbSalt, p3, p4).GetBytes(p6 / 8);
  28.             RijndaelManaged managed = new RijndaelManaged();
  29.             managed.Mode = CipherMode.CBC;
  30.             ICryptoTransform transform = managed.CreateEncryptor(rgbKey, bytes);
  31.             MemoryStream stream = new MemoryStream();
  32.             CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Write);
  33.             stream2.Write(buffer, 0, buffer.Length);
  34.             stream2.FlushFinalBlock();
  35.             byte[] inArray = stream.ToArray();
  36.             stream.Close();
  37.             stream2.Close();
  38.             return Convert.ToBase64String(inArray);
  39.         }
  40.  
  41.         private string decryptUTF8(string p0, string p1, string p2, string p3, int p4, string p5, int p6) //m0001c4
  42.         {
  43.             byte[] bytes = Encoding.ASCII.GetBytes(p5);
  44.             byte[] rgbSalt = Encoding.ASCII.GetBytes(p2);
  45.             byte[] buffer = Convert.FromBase64String(p0);
  46.             byte[] rgbKey = new PasswordDeriveBytes(p1, rgbSalt, p3, p4).GetBytes(p6 / 8);
  47.             RijndaelManaged managed = new RijndaelManaged();
  48.             managed.Mode = CipherMode.CBC;
  49.             ICryptoTransform transform = managed.CreateDecryptor(rgbKey, bytes);
  50.             MemoryStream stream = new MemoryStream(buffer);
  51.             CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Read);
  52.             byte[] buffer5 = new byte[buffer.Length];
  53.             int count = stream2.Read(buffer5, 0, buffer5.Length);
  54.             stream.Close();
  55.             stream2.Close();
  56.             return Encoding.UTF8.GetString(buffer5, 0, count);
  57.         }
  58.  
  59.         private void encrypt_lic_xml()
  60.         {
  61.             string str = null;
  62.             string str2 = null;
  63.             XmlTextReader reader = null;
  64.             StringReader input = null;
  65.             StreamReader reader3 = new StreamReader("lic.xml");
  66.             str = reader3.ReadToEnd();
  67.             reader3.Close();
  68.             reader3.Dispose();
  69.             reader3 = null;
  70.             try
  71.             {
  72.                 str2 = this.encryptUTF8(str, "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100);
  73.                 str = null;
  74.                 StreamWriter writer = null;
  75.                 writer = new StreamWriter("license.xml");
  76.                 writer.Write(str2);
  77.                 writer.Close();
  78.                 writer.Dispose();
  79.                 writer = null;
  80.             }
  81.             finally
  82.             {
  83.                 if (input != null)
  84.                 {
  85.                     input.Close();
  86.                     input.Dispose();
  87.                     input = null;
  88.                 }
  89.  
  90.                 if (reader != null)
  91.                 {
  92.                     reader.Close();
  93.                     reader = null;
  94.                 }
  95.  
  96.                 GC.Collect();
  97.             }
  98.         }
  99.  
  100.         private void decrypt_license_xml()
  101.         {
  102.             string str = null;
  103.             string str2 = null;
  104.             XmlTextReader reader = null;
  105.             StringReader input = null;
  106.             StreamReader reader3 = new StreamReader("license.xml");
  107.             str = reader3.ReadToEnd();
  108.             reader3.Close();
  109.             reader3.Dispose();
  110.             reader3 = null;
  111.             try
  112.             {
  113.                 str2 = this.decryptUTF8(str, "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100);
  114.                 str = null;
  115.                 StreamWriter writer = null;
  116.                 writer = new StreamWriter("lic.xml");
  117.                 writer.Write(str2);
  118.                 writer.Close();
  119.                 writer.Dispose();
  120.                 writer = null;
  121.             }
  122.             finally
  123.             {
  124.                 if (input != null)
  125.                 {
  126.                     input.Close();
  127.                     input.Dispose();
  128.                     input = null;
  129.                 }
  130.  
  131.                 if (reader != null)
  132.                 {
  133.                     reader.Close();
  134.                     reader = null;
  135.                 }
  136.  
  137.                 GC.Collect();
  138.             }
  139.         }
  140.  
  141.         private void button1_Click(object sender, EventArgs e)
  142.         {
  143.             encrypt_lic_xml();
  144.         }
  145.  
  146.         private void button2_Click(object sender, EventArgs e)
  147.         {
  148.             decrypt_license_xml();
  149.         }
  150.  
  151.  
  152.     }
  153. }


Если успеть словить файл TMSetp2.dbf и дешифровать его то получим следующее содержимое:
Code:
  1. 39BC4A-4ABC67-67382A-2A29CF-CF217D-4F;04/10/2011 11:07:56;;5;13;

то есть MachineID.
Ребята, очень нужна ваша помощь, я стараюсь как могу, вроде все проясняется, но вот одно неизвестное поле ставит меня в тупик(LicKey, которое я принял равным MachineID, может быть ошибочно). А еще не понятно как на момент запуска программа определяет свой тип версии (Pro_Demon, Tuner, Developer и т.д.), потому что не похоже, что она берет это из файла лицензии.



Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 10 апреля 2011 13:21
· Личное сообщение · #21

Code:
  1. #  case 4:
  2. #                     this.f0003d0 = (eCtuneVersions) int.Parse(this.m0001c4(p1, "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100));

Не?



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

Создано: 10 апреля 2011 14:19 · Поправил: fl4r3
· Личное сообщение · #22

yanus0
Это то верно, но я не могу пока на 100% утверждать какой формат у XML файла license.xml. То есть сам криптор я написал и он работает, а что должно быть в самом файле еще до шифрования я могу только догадываться. В итоге постоянно вылетает эксепшн, который отлавливается программой, когда я пытаюсь своим криптованным файлом её кормить.

Есть файл XML с обычными настройками. Подсмотрел там формат. Исправил свой файл примерно так:
Code:
  1. <License>
  2.          <Name value="fl4r3" />
  3.          <Org value="fl4r3 Corp" />
  4.          <Email value="asdf@mail.ru" />
  5.          <LicID value="9TmSoznq8VhoT2C/OsqJF4FDvYYXJEQMWOevm5lApJw=" />
  6.          <LicType value="k9ZrF0Oo4vI7uysX2PSkMQ==" />
  7.          <LicExpDate value="8gR3H3uoCdVxlyVIDSr2ciogHiFl68RJqRZPmI5soFs=" />
  8.          <LicKey value="39BC4A-4ABC67-67382A-2A29CF-CF217D-4D" />
  9.          <LicPayType value="rIfw637ninc6ZHfTJnb/RA==" />
  10. </License>

Закриптовал. Подсунул программе. Все равно ловит эксепшн вот этот:
Code:
  1. catch (Exception)
  2.     {
  3.         string str4 = "Contact eCtune(info@ectune.com) with MSGID 003H";
  4.         this.m0001ad(enum061.f0003ee);
  5.         m0001af();
  6.         MessageBox.Show(str4, "eCtune", MessageBoxButtons.OK, MessageBoxIcon.Hand);
  7.         this.f0003d7 = true;
  8.         Application.Exit();
  9.     }

Сейчас буду пытаться поменять в коде на MessageBox.Show(exception.Message); чтобы понять, что же ей не нравиться. Основная проблема найти этот участок кода в exe файле.

А еще я знаю, что пока что в этой теме есть только один человек который способен мне помочь. Это zeppe1in



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

Создано: 10 апреля 2011 16:35 · Поправил: fl4r3
· Личное сообщение · #23

В предыдущее сообщение не влазило:

Насколько я понимаю, из этого куска кода(возможно так не тривильно понять, но запустите его на исполнение с промежуточным выводом и все станет понятно) из LicID генерируется строка такого же формата как MachineID. То есть по сути LicID введенный криптуется и сверяется с MachineID:
Code:
  1. private void m0001b1()
  2. {
  3.     if ("####-####-####-####-####" != null)
  4.     {
  5.     }
  6.     string str = this.m0001c6(m0001c5(m0001c7("####-####-####-####-####" + "-ECT", 7)));
  7.     string str2 = null;
  8.     for (int i = 0; i < 5; i++)
  9.     {
  10.         str2 = str2 + str.Substring(* 4, 6) + "-";
  11.         if (== 4)
  12.         {
  13.             str2 = str2 + str.Substring(30, 2);
  14.         }
  15.     }
  16.     this.f0003c6 = str2;
  17.     string str3 = this.f0003c6;
  18.     for (int j = str3.Length - 1; j >= 0; j--)
  19.     {
  20.         if (char.ToUpper(str3[j]) == '-')
  21.         {
  22.             str3 = str3.Remove(j, 1);
  23.         }
  24.     }
  25.     str3.Trim();
  26.     this.f0003c8 = this.m0001c3(this.m0001c6(m0001c5(m0001c7(str3, 15))), "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100);
  27. }
  28.  
  29. private string m0001c6(string p0)
  30. {
  31.     Encoder encoder = Encoding.Unicode.GetEncoder();
  32.     byte[] bytes = new byte[p0.Length * 2];
  33.     encoder.GetBytes(p0.ToCharArray(), 0, p0.Length, bytes, 0, true);
  34.     byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash(bytes);
  35.     StringBuilder builder = new StringBuilder();
  36.     for (int i = 0; i < buffer2.Length; i++)
  37.     {
  38.         builder.Append(buffer2[i].ToString("X2"));
  39.     }
  40.     return builder.ToString();
  41. }
  42.  
  43. private static string m0001c5(string p0)
  44. {
  45.     for (int i = 0; i < p0.Length; i++)
  46.     {
  47.         int startIndex = i * Convert.ToUInt16(p0[i]);
  48.         startIndex = startIndex % p0.Length;
  49.         char ch = p0[i];
  50.         p0 = p0.Remove(i, 1);
  51.         p0 = p0.Insert(startIndex, ch.ToString());
  52.     }
  53.     return p0;
  54. }
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  private static string m0001c7(string p0, int p1)
  61. {
  62.     StringBuilder builder = new StringBuilder();
  63.     p0 = m0001c9(p0);
  64.     for (int i = 0; i < p0.Length; i += p1)
  65.     {
  66.         int num;
  67.         if ((+ p1) > (p0.Length - 1))
  68.         {
  69.             num = p0.Length - i;
  70.         }
  71.         else
  72.         {
  73.             num = p1;
  74.         }
  75.         builder.Append(m0001c8(p0.Substring(i, num)));
  76.     }
  77.     return builder.ToString();
  78. }
  79.  
  80.  
  81.  
  82.  
  83. private static string m0001c8(string p0)
  84. {
  85.     StringBuilder builder = new StringBuilder();
  86.     for (int i = p0.Length - 1; i >= 0; i--)
  87.     {
  88.         builder.Append(p0[i]);
  89.     }
  90.     return builder.ToString();
  91. }
  92.  
  93.  
  94.  
  95.  private static string m0001c9(string p0)
  96. {
  97.     StringBuilder builder = new StringBuilder();
  98.     foreach (char ch in p0)
  99.     {
  100.         if (!char.IsLetterOrDigit(ch))
  101.         {
  102.             builder.Append(Convert.ToInt16(ch).ToString());
  103.         }
  104.         else
  105.         {
  106.             builder.Append(ch);
  107.         }
  108.     }
  109.     return builder.ToString();
  110. }

Теперь возникает вопрос как написать кейген для заданного MachineID. И всё же надо выяснить что такое LicKey в XML.



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

Создано: 11 апреля 2011 04:54 · Поправил: fl4r3
· Личное сообщение · #24

Алгоритм вычисления строки формата MachineID из LicID с моими комметариями. Там есть еще неполное обратное преобразование и я не знаю где оно используется и зачем.
Code:
  1. using System;
  2. using System.IO;
  3. using System.Security.Cryptography;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Data;
  7. using System.Drawing;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Windows.Forms;
  11.  
  12. namespace MD5HashCalculate
  13. {
  14.     public partial class Form1 : Form
  15.     {
  16.         public Form1()
  17.         {
  18.             InitializeComponent();
  19.         }
  20.  
  21.         private void m0001b1()
  22.         {
  23.             string str = this.m0001c6(m0001c5(m0001c7("1111-2222-3333-4444-5555" + "-ECT", 7))); // в str будет чистый MD5hash подготовленной строки. Прямое преобразование
  24.             string str2 = null;
  25.             for (int i = 0; i < 5; i++) //меняем формат строки и добавляем разделители
  26.             {                                                       //есть строка вида:                temp1 = 8E70D41C3D96FFADC6C762DAF0A8E5F7
  27.                                                                     //из нее генерируется строка вида: temp2 = 8E70D4-D41C3D-3D96FF-FFADC6-C6C762-F7
  28.                                                                     //тривильное пребразование. Каждый следующий блок начинается с символов которые стоят в конце предыдущего блока
  29.                                                                     //если заменить ее маской получится следующее:
  30.                                                                     //разбиваем ее по 6 байт AABBCC-CCDDEE-EEFFGG-GGHHII-IIJJKK-LL
  31.                                                                     // где LL = последние два символа строки temp1.
  32.                 str2 = str2 + str.Substring(* 4, 6) + "-";
  33.                 if (== 4)
  34.                 {
  35.                     str2 = str2 + str.Substring(30, 2);
  36.                 }
  37.             }
  38.             this.f0003c6.Text = str2;
  39.             string str3 = this.f0003c6.Text;
  40.             for (int j = str3.Length - 1; j >= 0; j--) //удаляем разделители
  41.             {
  42.                 if (char.ToUpper(str3[j]) == '-')
  43.                 {
  44.                     str3 = str3.Remove(j, 1);
  45.                 }
  46.             }
  47.             str3.Trim();
  48.             this.f0003c8.Text = this.m0001c3(this.m0001c6(m0001c5(m0001c7(str3, 15))), "h0nd@eC7un€", "473470", "SHA1", 2, "@1B2c3D4e5F6g7H8", 0x100); //обратное преобразование
  49.         }
  50.  
  51.         internal string m0001c3(string p0, string p1, string p2, string p3, int p4, string p5, int p6)
  52.         {
  53.             byte[] bytes = Encoding.ASCII.GetBytes(p5);
  54.             byte[] rgbSalt = Encoding.ASCII.GetBytes(p2);
  55.             byte[] buffer = Encoding.UTF8.GetBytes(p0);
  56.             byte[] rgbKey = new PasswordDeriveBytes(p1, rgbSalt, p3, p4).GetBytes(p6 / 8);
  57.             RijndaelManaged managed = new RijndaelManaged();
  58.             managed.Mode = CipherMode.CBC;
  59.             ICryptoTransform transform = managed.CreateEncryptor(rgbKey, bytes);
  60.             MemoryStream stream = new MemoryStream();
  61.             CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Write);
  62.             stream2.Write(buffer, 0, buffer.Length);
  63.             stream2.FlushFinalBlock();
  64.             byte[] inArray = stream.ToArray();
  65.             stream.Close();
  66.             stream2.Close();
  67.             return Convert.ToBase64String(inArray);
  68.         }
  69.  
  70.         private string m0001c6(string p0)                                       //ДЛЯ ЭНК:на вход получаем перемешанную строку вида 312455413143244544512E525354554TC
  71.         {                                                                       //ДЛЯ ДЕК:на вход получаем перемешанную строку вида D6F097E3F3C41CFD8D6D67C46CFDA2F7
  72.             Encoder encoder = Encoding.Unicode.GetEncoder();
  73.             byte[] bytes = new byte[p0.Length * 2]; //ДЛЯ ЭНК:заводим буфер двойного размера от нашей строки
  74.             encoder.GetBytes(p0.ToCharArray(), 0, p0.Length, bytes, 0, true); //ДЛЯ ЭНК:разбавляем нашу строку представленную в байтах нолями. то есть идет байт из нашей строки, потом идет 0, потом опять байт из строки и опять 0.
  75.             byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash(bytes); //ДЛЯ ЭНК:из 66 байт считаем хеш размером 16 байт
  76.             StringBuilder builder = new StringBuilder();
  77.             for (int i = 0; i < buffer2.Length; i++)
  78.             {
  79.                 builder.Append(buffer2[i].ToString("X2")); //строим строку в hex-представлении
  80.             }
  81.             return builder.ToString();
  82.         }
  83.  
  84.         private static string m0001c5(string p0)                //ДЛЯ ЭНКРИПТА: сюда передается перевернутая строка из m0001c7 вида 2541111335422244454335555544TCE54, длина 33 символа. В итоге получается перемешанная строка вида 312455413143244544512E525354554TC
  85.         {                                                       //ДЛЯ ДЕКРИПТА: сюда передается перевернутая строка из m0001c7 вида 9D3D3C14D4D07E8267C6C6CDAFFFF67F, длина 32 символа. В итоге получается перемешанная строка вида D6F097E3F3C41CFD8D6D67C46CFDA2F7
  86.             for (int i = 0; i < p0.Length; i++)
  87.             {
  88.                 int startIndex = i * Convert.ToUInt16(p0[i]); //ДЛЯ ЭНК: умножаем i на код символа в формате UInt16(символ из позиции i)
  89.                                                                 //ДЛЯ ЭНК: int temp = Convert.ToUInt16(p0[i]);
  90.                                                                 //ДЛЯ ЭНК: вставить код int startIndex = i * temp;
  91.                 startIndex = startIndex % p0.Length; //ДЛЯ ЭНК: берем остаток от деления startIndex на p0.Length
  92.                 char ch = p0[i]; //ДЛЯ ЭНК: берем символ из позиции i
  93.                 p0 = p0.Remove(i, 1); //ДЛЯ ЭНК: удаляем этот символ из позиции i
  94.                 p0 = p0.Insert(startIndex, ch.ToString()); //ДЛЯ ЭНК: вставляем символ ch из позиции i в позицию startIndex
  95.             }
  96.             return p0;
  97.         }
  98.  
  99.         private static string m0001c7(string p0, int p1) //ДЛЯ ЭНКРИПТА: переворачиваем строку целиком с помощью функции m0001c8 (по частям, 4 раза по 7 символов, а затем еще 5).
  100.                                                          //ДЛЯ ЭНК: Было 111145222245333345444445555545ECT, стало 2541111335422244454335555544TCE54, длина 33 символа
  101.  
  102.         {                                                //ДЛЯ ДЕКРИПТА: отправляем функции m0001c8 2 раза по 15 байт, затем 1 раз по 2 байта . в ретурне получаем перевернутую строку.
  103.                                                          //ДЛЯ ДЕК: Пример: 1ая итерация -  8E70D4D41C3D3D9 = 9D3D3C14D4D07E8; вторая итерация - 6FFFFADC6C6C762 = 267C6C6CDAFFFF6; третья итерация - F7 = 7F; итоговый результат: 9D3D3C14D4D07E8267C6C6CDAFFFF67F
  104.             StringBuilder builder = new StringBuilder();
  105.             p0 = m0001c9(p0);
  106.             for (int i = 0; i < p0.Length; i += p1)
  107.             {
  108.                 int num;
  109.                 if ((+ p1) > (p0.Length - 1))
  110.                 {
  111.                     num = p0.Length - i;
  112.                 }
  113.                 else
  114.                 {
  115.                     num = p1;
  116.                 }
  117.                 builder.Append(m0001c8(p0.Substring(i, num)));
  118.             }
  119.             return builder.ToString();
  120.         }
  121.  
  122.  
  123.  
  124.  
  125.         private static string m0001c8(string p0)  //переворачиваем строку, например 45ECT=TCE54
  126.         {
  127.             StringBuilder builder = new StringBuilder();
  128.             for (int i = p0.Length - 1; i >= 0; i--)
  129.             {
  130.                 builder.Append(p0[i]);
  131.             }
  132.             return builder.ToString();
  133.         }
  134.  
  135.  
  136.  
  137.         private static string m0001c9(string p0)                //проверяем что наша строка содержит только буквы и цифры. если нет, заменяем символ его кодом в формате Int16
  138.         {
  139.             StringBuilder builder = new StringBuilder();
  140.             foreach (char ch in p0)
  141.             {
  142.                 if (!char.IsLetterOrDigit(ch))
  143.                 {
  144.                     builder.Append(Convert.ToInt16(ch).ToString());
  145.                 }
  146.                 else
  147.                 {
  148.                     builder.Append(ch);
  149.                 }
  150.             }
  151.             return builder.ToString();
  152.         }
  153.  
  154.         private void button1_Click(object sender, EventArgs e)
  155.         {
  156.             m0001b1();
  157.         }
  158.     }
  159. }


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


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