Сейчас на форуме: tyns777, localhost1, vsv1, asfa (+6 невидимых)

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

Ранг: 13.2 (новичок), 13thx
Активность: 0.28=0.28
Статус: Участник

Создано: 10 февраля 2020 01:59
· Личное сообщение · #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 если дебажить сам ехе?



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

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

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



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

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

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



Ранг: 13.2 (новичок), 13thx
Активность: 0.28=0.28
Статус: Участник

Создано: 10 февраля 2020 13:47
· Личное сообщение · #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 софт всё равно падает...

Почему?



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

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

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



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

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

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

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



Ранг: 13.2 (новичок), 13thx
Активность: 0.28=0.28
Статус: Участник

Создано: 13 февраля 2020 16:59
· Личное сообщение · #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



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

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

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

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

Ранг: 330.4 (мудрец), 334thx
Активность: 0.160.17
Статус: Участник
ILSpector Team

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

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

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

Ранг: 13.2 (новичок), 13thx
Активность: 0.28=0.28
Статус: Участник

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

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

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

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

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

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

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

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



Ранг: 330.4 (мудрец), 334thx
Активность: 0.160.17
Статус: Участник
ILSpector Team

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

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




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

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

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

на Babel похоже, Вместо Environment.FailFast сделать NOP (правый клик - Edit IL Code, del все строки кроме ret, ОК, File - Save module). А этот код - это самопроверка.


 eXeL@B —› Вопросы новичков —› Как легко поймать проверку на модификацию dll кода С# в этой самой dll?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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