Проблемы защиты функций с switch/case [bcc64/clang]

Issues related to VMProtect
lazybit
Posts: 21
Joined: Thu Feb 11, 2010 12:40 pm

Проблемы защиты функций с switch/case [bcc64/clang]

Postby lazybit » Mon Jan 22, 2018 7:31 am

Решил попробовать на 64 битах. 5 из 5 программ неудачно. Появляются ошибки:
Команда не поддерживается
Jump on a part of a command

Проблема с switch/case. Например, так:

Code: Select all

// test.cpp
int main() {
   char a, b;
   switch (a) {
   case '#': b = 'a'; break;
   case '$': b = 'b'; break;
   case '%': b = 'c'; break;
   case '&': b = 'd'; break;
   case '+': b = 'e'; break;
   case ']': b = 'f'; break;
   case '^': b = 'g'; break;
   case '`': b = 'h'; break;
   case '{': b = 'i'; break;
   case '|': b = 'j'; break;
   case '}': b = 'k'; break;
   case '~': b = 'l'; break;
   case 'x': b = 'm'; break;
   case '@': b = 'n'; break;
   }
}

Embarcadero C++ 7.30 for Win64 Copyright (c) 2012-2017 Embarcadero Technologies, Inc.
test.cpp:
Turbo Incremental Link64 6.90 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.

VMProtect Ultimate v 3.1.2 (build 830) Copyright 2003-2017 VMProtect Software
Registered to: -[-@gmail.com], Personal License

Загрузка test.exe... 100%
Загрузка [V] 00401190 main
[Ошибка] main.00401295: Комманда не поддерживается "db 62"

Admin
Site Admin
Posts: 1438
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby Admin » Mon Jan 22, 2018 7:49 am

Присылайте тестовый пример (оригинал EXE+MAP+VMP файлы) на нашу почту

lazybit
Posts: 21
Joined: Thu Feb 11, 2010 12:40 pm

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby lazybit » Mon Jan 22, 2018 3:21 pm

Файлы отправил на вашу почту.

lazybit
Posts: 21
Joined: Thu Feb 11, 2010 12:40 pm

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby lazybit » Tue Jan 23, 2018 8:09 pm

32-битные после защиты также могут падать. Причина где-то здесь:

Code: Select all

push    ebp
mov     ebp, esp
push    ebx
push    edi
push    esi
sub     esp, 1D0h
call    $+5
pop     eax
mov     [ebp+var_1B8], eax
....

movzx   eax, byte ptr [ebp+eax+var_184]
cmp     eax, 3
ja      loc_4896EC
mov     eax, ds:dword_489760[eax*4]
add     eax, [ebp+var_1B8]
jmp     eax

....
dword_489760    dd 541h, 5B9h, 0E9Fh, 0FCCh

Admin
Site Admin
Posts: 1438
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby Admin » Wed Jan 24, 2018 2:24 pm

Проблема в том, что в main находится 2 SWITCH-а с одной таблицей переходов на двоих, поэтому при парсинге самого первого SWITCH получились кривые ссылки на код.

Admin
Site Admin
Posts: 1438
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby Admin » Thu Feb 01, 2018 5:32 am

Второй пример в виде теста пришлете?

lazybit
Posts: 21
Joined: Thu Feb 11, 2010 12:40 pm

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby lazybit » Fri Feb 02, 2018 9:13 am

Файлы отправил на вашу почту (test2.zip).

Admin
Site Admin
Posts: 1438
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby Admin » Sat Feb 03, 2018 8:40 am

Проверяйте (3.1.2.928):
http://vmpsoft.com/files/VMProtectDemo.exe

lazybit
Posts: 21
Joined: Thu Feb 11, 2010 12:40 pm

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby lazybit » Sat Feb 03, 2018 2:08 pm

Отправил на почту ещё вариант, после защиты продолжает падать (test2.zip).

Admin
Site Admin
Posts: 1438
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby Admin » Sun Feb 04, 2018 4:47 am

Дак он у вас и без защиты падает :))

P.S. SWITCH распарсился без проблем.

lazybit
Posts: 21
Joined: Thu Feb 11, 2010 12:40 pm

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby lazybit » Mon Feb 05, 2018 7:12 pm

Да, перепроверил, всё пока работает.

lazybit
Posts: 21
Joined: Thu Feb 11, 2010 12:40 pm

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby lazybit » Thu Feb 08, 2018 2:25 pm

После защиты падает. Может страницы в стек не подгружает? Файлы теста выслал (test.zip).

Code: Select all

#include <stdio.h>
#include <malloc.h>
char *bb;
int main(int argc, char *argv[]) {
   if (argc == 1) {
      const int size = 4096 * 8;
      char *buf = (char *)alloca(size);
      bb = buf;
      for (int i = size - 1; i >= 0; i--) {
         bb[i] = 0;
      }
      printf("ok\n");
   }
}

Admin
Site Admin
Posts: 1438
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby Admin » Thu Feb 08, 2018 2:42 pm

Зачем выделять такой объем памяти на стеке?

lazybit
Posts: 21
Joined: Thu Feb 11, 2010 12:40 pm

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby lazybit » Thu Feb 08, 2018 3:17 pm

Это же тест. Нашел место и смог воспроизвести в тесте с большим трудом. В реальной программе падало очень редко.
Проблема при небольшом выделении памяти (хоть 16 байт), если рядом с границей страницы памяти стека, то будет падать.

Admin
Site Admin
Posts: 1438
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Проблемы защиты функций с switch/case [bcc64/clang]

Postby Admin » Fri Feb 09, 2018 2:34 am

Этот тест показывает ваше непонимание что такое стек, для чего он нужен, как он работает и как нельзя писать программы. Шаг в сторону и программа труп.
1. Шаг вправо:

Code: Select all

#include <stdio.h>
#include <malloc.h>
char *bb;
int main(int argc, char *argv[]) {
   if (argc == 1) {
      const int size = 4096 * 8;
      char *buf = (char *)alloca(size);
      printf("alloca\n");
      bb = buf;
      for (int i = size - 1; i >= 0; i--) {
         bb[i] = 0;
      }
      printf("ok\n");
   }
}


2. Шаг влево:

Code: Select all

#include <stdio.h>
#include <malloc.h>
char *bb;
int main(int argc, char *argv[]) {
   if (argc == 1) {
      const int size = 4096 * 8;
      char *buf = (char *)alloca(size);
      printf("alloca\n");
      bb = buf;
      for (int i = 0; i < size; i++) {
         bb[i] = 0;
      }
      printf("ok\n");
   }
}