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

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

 eXeL@B —› Вопросы новичков —› Как легко поймать проверку на модификацию dll кода С# в этой самой dll?
Посл.ответ Сообщение

Ранг: 7.2 (гость)
Статус: Участник

Создано: 10 февраля 2020 01:59 New!
Цитата · Личное сообщение · #1

App:
https://cdn.manictime.com/setup/v4_4_8_0/ManicTimeUsb.zip

У софта есть полный триал на 15 дней. Раньше я патчил их хардкод с 0F (15 days) на 7F и обновлял софт раз в пол года.
Теперь при патче падает софт.

Сам чек на триал в Finkit.ManicTime.Common.O.dll

Раньше выглядел так ~:
Code:
  1. private int c189f3af62b1fa98a21e1fddd4d5c40cb
  2.                  {
  3.                         get
  4.                         {
  5.                               if (!this.c43e5e03e99e098c6295d7a9830ba6399())
  6.                               {
  7.                                    return 127; // PATCH
  8.                               }
  9.                               return this.ExtendedTrialPeriod;
  10.                         }
  11.                  }


Сейчас вот:
Code:
  1. // Token: 0x0200001F RID: 31
  2. internal class \uE013 : ITrialProvider
  3. {
  4.          // Token: 0x17000012 RID: 18
  5.          // (get) Token: 0x060000AC RID: 172 RVA: 0x000074FC File Offset: 0x000056FC
  6.          private int \uE000
  7.          {
  8.                  get
  9.                  {
  10.                         if (!\uE269.\uE000(this))
  11.                         {
  12.                               return \uE018.\uE000(127); // PATCH
  13.                         }
  14.                         return \uE26A.\uE000(this);
  15.                  }
  16.          }
  17.  
  18.          // Token: 0x17000013 RID: 19
  19.          // (get) Token: 0x060000AD RID: 173 RVA: 0x0000751C File Offset: 0x0000571C
  20.          public int TrialDaysLeft
  21.          {
  22.                  get
  23.                  {
  24.                         if (!\uE26B.\uE000(this.\uE007))
  25.                         {
  26.                               return \uE26C.\uE000(this) - \uE267.\uE000(this.\uE007) + \uE018.\uE000(1);
  27.                         }
  28.                         return \uE018.\uE000(0);
  29.                  }
  30.          }


Есть какой простой вариант это обойти или надо обучаться Шарпу?

А если надо то можно подсказки какие АПИ открывают и читают файлы и делают хэши?

И как ставить бряки в dnSpy на код dll если дебажить сам ехе?

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

Создано: 10 февраля 2020 03:57 New!
Цитата · Личное сообщение · #2

Скорее всего, где то в другом месте добавили проверку на целостность кода. Проверять могут как угодно, могут, например, вообще код подписать. Как именно падает? Если поправить что-нибудь незначительное в другом месте - падает с теми же симптомами?

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

Создано: 10 февраля 2020 06:04 New!
Цитата · Личное сообщение · #3

https://www.upload.ee/files/11107357/ManicTime_Patch_v1.5_By_DFoX.rar.html

Ранг: 7.2 (гость)
Статус: Участник

Создано: 10 февраля 2020 13:47 New!
Цитата · Личное сообщение · #4

Варез варезом, хотелось понять что к чему.

Понял как ставить бряки на дллки. Нашёл call stack после unhandled exception.

Вроде уходим в fastfail по приказу авторов софта.


num14, num8 долго возят, в этом цикле похожем на проверку каких-то байтов.


ptr pointer на байты в середине начинается использоваться
Code:
  1.                                                                            byte* ptr3 = ptr + *(uint*)(ptr + 60);
  2.                                                                            num9 = *(ushort*)(ptr3 + 6);
  3.                                                                            ushort num10 = *(ushort*)(ptr3 + 20);
  4.                                                                            uint* ptr4 = null;
  5.                                                                            ptr2 = (uint*)(ptr3 + 24 + num10);
  6.                                                                            num = -12;
  7.                                                                            goto IL_55;


Занопив проверку num14 == num8 софт всё равно падает...

Почему?

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

Создано: 10 февраля 2020 14:28 New!
Цитата · Личное сообщение · #5

friend
Потому что дебажить надо дальше, а лучше всего снять обфускатор и нормально посмотреть на код

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

Создано: 10 февраля 2020 14:52 New!
Цитата · Личное сообщение · #6

friend пишет:
софт всё равно падает...

Падает туда же или куда то еще?

Ранг: 7.2 (гость)
Статус: Участник

Создано: 13 февраля 2020 16:59 New!
Цитата · Личное сообщение · #7

Mishar_Hacker пишет:
Потому что дебажить надо дальше, а лучше всего снять обфускатор и нормально посмотреть на код

Дебажить трудно когда хеллоу ворлд на Шарпе написать не можешь... :>
Дедот не справляется.

_MBK_ пишет:
Падает туда же или куда то еще?

Туда же, стандартный хэндлер всех анхэндлд ксепшинс видать, но с другого места.

C# src
Code:
  1. internal class \uE01D
  2. {
  3.          // Token: 0x060000FC RID: 252 RVA: 0x0001299C File Offset: 0x00010B9C
  4.          internal unsafe static void \uE000()
  5.          {
  6.                  Module module = typeof(\uE01D).Module;
  7.                  byte* ptr = (byte*)((void*)Marshal.GetHINSTANCE(module));
  8.                  if (ptr == -1)
  9.                  {
  10.                         return;
  11.                  }
  12.                  string fullyQualifiedName = module.FullyQualifiedName;
  13.                  bool flag = fullyQualifiedName.Length > 0 && fullyQualifiedName[0] == '<';
  14.                  uint num8;
  15.                  uint num14;
  16.                  for (;;)
  17.                  {
  18.                         IL_129:
  19.                         int num = -6;
  20.                         int num2 = -16;
  21.                         for (;;)
  22.                         {
  23.                               num2 ^= 25;
  24.                               for (;;)
  25.                               {
  26.                                    IL_E9:
  27.                                    int num3 = -14;
  28.                                    int num4 = 14;
  29.                                    for (;;)
  30.                                    {
  31.                                        num4 ^= 21;
  32.                                        for (;;)
  33.                                        {
  34.                                           int num5 = 59;
  35.                                           for (;;)
  36.                                           {
  37.                                             switch (num5 ^ 35)
  38.                                             {
  39.                                             case 24:
  40.                                              switch (num4)
  41.                                              {
  42.                                              case 25:
  43.                                                       switch (num3 + 32)
  44.                                                       {
  45.                                                       case 0:
  46.                                                               switch (num2 + 25)
  47.                                                               {
  48.                                                               case 0:
  49.                                                                      goto IL_129;
  50.                                                               case 1:
  51.                                                               {
  52.                                                                      uint num6;
  53.                                                                      uint num7;
  54.                                                                      uint* ptr2;
  55.                                                                      ushort num9;
  56.                                                                      uint num11;
  57.                                                                      uint num12;
  58.                                                                      int num13;
  59.                                                                      switch (num + 30)
  60.                                                                      {
  61.                                                                      case 0:
  62.                                                                            num6 = 1491687505U;
  63.                                                                            num = -5;
  64.                                                                            goto IL_55;
  65.                                                                      case 1:
  66.                                                                            if (num7 != 2381882584U)
  67.                                                                            {
  68.                                                                                 num = -15;
  69.                                                                                 goto IL_55;
  70.                                                                            }
  71.                                                                            goto IL_26D;
  72.                                                                      case 2:
  73.                                                                            ptr2 += 8;
  74.                                                                            num = -14;
  75.                                                                            goto IL_55;
  76.                                                                      case 3:
  77.                                                                            num8 = 1656726012U;
  78.                                                                            num = -9;
  79.                                                                            goto IL_55;
  80.                                                                      case 4:
  81.                                                                      {
  82.                                                                            byte* ptr3 = ptr + *(uint*)(ptr + 60);
  83.                                                                            num9 = *(ushort*)(ptr3 + 6);
  84.                                                                            ushort num10 = *(ushort*)(ptr3 + 20);
  85.                                                                            uint* ptr4 = null;
  86.                                                                            ptr2 = (uint*)(ptr3 + 24 + num10);
  87.                                                                            num = -12;
  88.                                                                            goto IL_55;
  89.                                                                      }
  90.                                                                      case 5:
  91.                                                                            num11 = 1109506061U;
  92.                                                                            num = -7;
  93.                                                                            goto IL_55;
  94.                                                                      case 6:
  95.                                                                            num12 = 1762866009U;
  96.                                                                            num = -2;
  97.                                                                            goto IL_55;
  98.                                                                      case 7:
  99.                                                                            num13 = 0;
  100.                                                                            num = -16;
  101.                                                                            goto IL_55;
  102.                                                                      case 8:
  103.                                                                            IL_21F:
  104.                                                                            num7 = *(ptr2++) * *(ptr2++);
  105.                                                                            num = -1;
  106.                                                                            goto IL_55;
  107.                                                                      case 9:
  108.                                                                            num14 = 0U;
  109.                                                                            num = -11;
  110.                                                                            goto IL_55;
  111.                                                                      case 10:
  112.                                                                            if (num13 != 0)
  113.                                                                            {
  114.                                                                                 num = -10;
  115.                                                                                 goto IL_55;
  116.                                                                            }
  117.                                                                            goto IL_350;
  118.                                                                      case 11:
  119.                                                                            if (num7 != 1118119882U)
  120.                                                                            {
  121.                                                                                 num = -8;
  122.                                                                                 goto IL_55;
  123.                                                                            }
  124.                                                                            goto IL_26D;
  125.                                                                      case 12:
  126.                                                                            goto IL_342;
  127.                                                                      }
  128.                                                                      goto Block_5;
  129.                                                                      IL_350:
  130.                                                                      if (num13 >= (int)num9)
  131.                                                                      {
  132.                                                                            goto Block_16;
  133.                                                                      }
  134.                                                                      goto IL_21F;
  135.                                                                      IL_342:
  136.                                                                      num13++;
  137.                                                                      goto IL_350;
  138.                                                                      IL_26D:
  139.                                                                      uint num15 = *ptr2 >> 2;
  140.                                                                      uint num16 = ptr2[2];
  141.                                                                      uint* ptr5 = (uint*)(ptr + (UIntPtr)(flag ? ptr2[3] : ptr2[1]) / 4);
  142.                                                                      if (num7 == 2381882584U)
  143.                                                                      {
  144.                                                                            ptr5 += 2;
  145.                                                                            num15 -= 2U;
  146.                                                                            num15 -= 27U;
  147.                                                                      }
  148.                                                                      uint num17 = 0U;
  149.                                                                      if (num17 != 0U)
  150.                                                                      {
  151.                                                                            goto IL_2C5;
  152.                                                                      }
  153.                                                                      IL_2F1:
  154.                                                                      if (num17 >= num15)
  155.                                                                      {
  156.                                                                            if (num7 == 2381882584U)
  157.                                                                            {
  158.                                                                                 uint num18 = 0U;
  159.                                                                                 if (num18 != 0U)
  160.                                                                                 {
  161.                                                                                     goto IL_307;
  162.                                                                                 }
  163.                                                                                 IL_317:
  164.                                                                                 if ((ulong)num18 >= 27UL)
  165.                                                                                 {
  166.                                                                                     goto IL_32D;
  167.                                                                                 }
  168.                                                                                 IL_307:
  169.                                                                                 num14 = *(ptr5++);
  170.                                                                                 num18 += 1U;
  171.                                                                                 goto IL_317;
  172.                                                                            }
  173.                                                                            IL_32D:
  174.                                                                            ptr2 += 8;
  175.                                                                            goto IL_342;
  176.                                                                      }
  177.                                                                      IL_2C5:
  178.                                                                      uint num19 = *(ptr5++);
  179.                                                                      uint num20 = (num12 ^ num19) + (num6 + num11) + num8;
  180.                                                                      num12 = num6;
  181.                                                                      num6 = num11;
  182.                                                                      num11 = num8;
  183.                                                                      num8 = num20;
  184.                                                                      num17 += 1U;
  185.                                                                      goto IL_2F1;
  186.                                                               }
  187.                                                               case 2:
  188.                                                                      break;
  189.                                                               default:
  190.                                                                      num3 = -13;
  191.                                                                      goto IL_6D;
  192.                                                               }
  193.                                                               IL_55:
  194.                                                               num ^= 28;
  195.                                                               goto IL_117;
  196.                                                       case 1:
  197.                                                               goto IL_117;
  198.                                                       case 2:
  199.                                                               goto IL_124;
  200.                                                       }
  201.                                                       goto Block_3;
  202.                                                       IL_117:
  203.                                                       num2 = -15;
  204.                                                       num3 = -16;
  205.                                                       break;
  206.                                              case 26:
  207.                                                       goto IL_E9;
  208.                                              case 27:
  209.                                                       break;
  210.                                              default:
  211.                                                       num5 = 58;
  212.                                                       continue;
  213.                                              }
  214.                                              IL_6D:
  215.                                              num3 ^= 18;
  216.                                              goto IL_C1;
  217.                                             case 25:
  218.                                              goto IL_C1;
  219.                                             case 26:
  220.                                              goto IL_CB;
  221.                                             }
  222.                                             break;
  223.                                             IL_C1:
  224.                                             num4 = 12;
  225.                                             num5 = 57;
  226.                                           }
  227.                                        }
  228.                                        IL_CB:
  229.                                        continue;
  230.                                        Block_3:
  231.                                        num4 = 15;
  232.                                    }
  233.                               }
  234.                               IL_124:
  235.                               continue;
  236.                               Block_5:
  237.                               num2 = -2;
  238.                         }
  239.                  }
  240.                  Block_16:
  241.                  if (num14 != num8)
  242.                  {
  243.                         \uE01D.\uE001();
  244.                  }
  245.          }


Переименовал пару вещей что бы скормить это дело компилью с -О3, посмотреть что будет:

typedef unsigned int uint;
typedef unsigned char byte;
typedef unsigned short ushort;
typedef unsigned long ulong;

C#:
byte* ptr = (byte*)((void*)Marshal.GetHINSTANCE(module));
C
char somemem[1024];
byte* ptr = (byte*)somemem;

~line142
C#
uint* ptr5 = (uint*)(ptr + (UIntPtr)(flag ? ptr2[3] : ptr2[1]) / 4);
C
uint* ptr5 = (uint*)( ptr + (??WHATCAST??) (flag ? ptr2[3] : ptr2[1]) / 4 );

ptr2[i] returns uint
cast it to something
divide by 4
plus ptr (ptr type is byte*)

uint* ptr5 = (uint*)( ptr + (uint*) (flag ? ptr2[3] : ptr2[1]) / 4 ); // uint* cast

Правильно кастить в uint*?
Деление на 4 не понимаю.

Добавлено спустя 40 минут
https://godbolt.org/z/pgs4c3

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

Создано: 13 февраля 2020 18:21 New!
Цитата · Личное сообщение · #8

Что-то не то, видимо, патчишь...
У меня с модифицированной дллкой все запускается - https://www.screenpresso.com/=HGoX

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


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

Создано: 13 февраля 2020 18:21 · Поправил: Medsft New!
Цитата · Личное сообщение · #9

то что ты показал код в предидущем посте это элемент защиты, занопь еще еще вызов и будет тебе счастье
Перевожу на русский язык
занопь все вызовы метода \uE000()
Вангую что ты не знаешь как их найти:
в dnspy или еще где встаешь на нем в дереве -> вызов контекстного меню а там Analise а в нем Used By

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


Ранг: 7.2 (гость)
Статус: Участник

Создано: 13 февраля 2020 20:11 New!
Цитата · Личное сообщение · #10

uncleua пишет:
У меня с модифицированной дллкой все запускается - https://www.screenpresso.com/=HGoX

Так это ж другая дллка, так не честно...

Medsft пишет:
Вангую что ты не знаешь как их найти

Не, я ведь уже продвинутый.

Для полного счастья хотелось бы узнать как бы поставить бряк на чтение моего патча. Понять что это за странный чек такой, вроде немного байт проверяет (я loop'ов не вижу), a мой патч под него попался...

Протектор .Net reactor?

Вопрос по dnSpy: чё он сразу в implementation не прыгает когда я на метод кликаю?

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

Создано: 14 февраля 2020 08:49 New!
Цитата · Личное сообщение · #11

friend пишет:
я loop'ов не вижу
про оператор for ) что нибудь знаешь?
friend пишет:
Вопрос по dnSpy: чё он сразу в implementation не прыгает когда я на метод кликаю?
он такой)


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

Создано: 19 февраля 2020 12:16 New!
Цитата · Личное сообщение · #12

friend пишет:
Протектор .Net reactor?

на Babel похоже, Вместо Environment.FailFast сделать NOP (правый клик - Edit IL Code, del все строки кроме ret, ОК, File - Save module). А этот код - это самопроверка.
 eXeL@B —› Вопросы новичков —› Как легко поймать проверку на модификацию dll кода С# в этой самой dll?

Видеокурс ВЗЛОМ