Хочешь верь, а хочешь — нет, но дело было так. В одной из контор, куда я был приглашен в качестве консультанта, уже давно заняты поисками «вменяемого» антивируса (уже предвижу на некоторых лицах ядовитые улыбки), а потому решились они снять пробы с ESET Smart Security. И вроде бы все ничего. До вчерашнего дня.

Вся инфраструктура в конторе построена на Win7, ОСи, нужно признать, не такой уж и древней, в отличии от снятой с поддержки ХР (что, впрочем, не останавливает некоторые конторы использовать оную). Так вот, один программист конторы пожаловался на то, что разрабатывая им программа распознается ESS как вирус, хотя во время сборки того же участка кода под ХР в виртуальной машине (где так же для чего-то установлен тот же ESS) такого не происходит. Взявшись расследовать это дело, вскоре выяснилось что дело в одной единственной строке кода, а именно:

setlocale(LC_CTYPE, "");

Это б не было столь грустно, если б не было смешно. Допустим, есть у нас код:

#include <windows.h>
#include <stdio.h>

void PrintWin32Error() {
  LPVOID msg;
  FormatMessage(
      FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
      NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
      (LPTSTR) &msg, 0, NULL
  );
  printf("%s\n", msg);
  LocalFree(msg);
}

int main(void) {
  PrintWin32Error();
  
  return 0;
}

Все нормально компилируется, сообщение при вызове функции PrintWin32Error возвращается, правда в виде иероглифов. Решив исправить этот недочет, программист прибегнул к старому трюку и приправил код так:

...
#include <locale.h>

int main(void) {
  setlocale(LC_CTYPE, "");
...

image

Пример, конечно, условный, но в результате ESS действительно «трогается умом». Забавно, не правда ли?

Комментарии (26)


  1. vilgeforce
    04.05.2016 10:12
    +1

    Вы так говорите, будто не знаете как антивирусы работают… И да, «дело в одной единственной строке кода» вы проверяли? Программа с этой единственной строкой кода вызывает срабатывание? Сомневаюсь…


    1. GrigoriZakharov
      04.05.2016 10:21

      Знаю, но вся соль в том, что перед тем как написать все это, были произведены соответствующие тесты, — о том и речь.


      1. vilgeforce
        04.05.2016 11:11
        +1

        Пока что у вас написано о добавлении одной строки в один конкретный кусок кода.


        1. GrigoriZakharov
          04.05.2016 14:28

          А словосочетание «условный пример» Вам ни о чем не говорит? Или нужно было написать сотни различных примеров, подытожив — результат один и тот же?!


          1. vilgeforce
            04.05.2016 14:29
            +4

            Достаточно было бы написать что только с этой строкой тоже есть срабатывание. Тогда можно было бы говорить о том, что она виновата.


            1. GrigoriZakharov
              04.05.2016 14:40
              -2

              Ну прямо софистика какая-то, не находите? Такое впечатление что это это своего рода попытка оправдать свой любимый антивирус.


              1. vilgeforce
                04.05.2016 14:42
                +2

                Посмешили, спасибо. Минимальный воспроивзодимый пример — это софистика, ок.


                1. GrigoriZakharov
                  04.05.2016 14:52
                  -1

                  По-моему вы передергиваете, так что вряд ли дальнейший разговор будет конструктивен. Всего хорошего!


                  1. zabbius
                    04.05.2016 17:57
                    +1

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


                    1. GrigoriZakharov
                      04.05.2016 18:31

                      Какие именно «два файлика» Вам нужны? Весь фокус в setlocale(LC_CTYPE, ""); — неужто писано языком неведомым? На счёт версии ESS 9.0.375.1


                      1. zabbius
                        04.05.2016 18:39
                        +3

                        Файлик, который выводит кракозябры и не детектируется и файлик, который выводит нормально и детектируется. Если просто вывода на консоль недостаточно — добавить минимально необходимый для детектирования код в оба файлика. В таком виде ни у кого по определению не останется недопонимания проблемы.

                        Кстати, а багрепорты у вас тоже пишутся условно, или все таки четко описывается кейс, чтобы разработчик мог без труда наиграть багу?


                        1. GrigoriZakharov
                          04.05.2016 19:29

                          Вы не находите довольно странным, чтобы нанятый со стороны консультант на пару-тройку дней занимался тест-кейсами или строчил багрепорты? Во-вторых, о чем Вы спрашиваете, написано выше, зачем ещё что-то дублировать?


                          1. zabbius
                            04.05.2016 20:25
                            +3

                            Если публично заявляете баг, да еще в таком тоне — предоставьте пример. Тогда ваше утверждение не будет выглядеть голословно. Был бы пример, не было бы этого треда в комментах.


                            1. GrigoriZakharov
                              04.05.2016 21:15

                              Еще раз — с чувством и расстановкой: суть и пример приведены в посте, так что попреки голословностью выглядят комично. Да и с тоном не совсем понятно что к чему — тон как тон, с «голым» изложением фактов. Если Вам просто хочется поболтать, то можете поискать другого собеседника, ибо здесь все же не форум и не чат.


  1. kasperos
    04.05.2016 10:21

    Пока антивирусы действуют по шаблону: «среднего роста, на носу бородавка», результат предсказуем, скорей всего в измененном коде формируется последовательность по которой определяется описанный выше троян.

    PS. дурная привычка пооткрывать вкладок и не обновлять при комментах.


  1. jok40
    04.05.2016 10:29
    +2

    Я совершенно не удивлён. Недавно мой друг написал программку на C#, которая преобразует текстовый файл из одного вида в другой по некоторому алгоритму. Я не смог выложить эту программку на файлообменники, потому что те, перед публикацией, проверяют файлы на virustotal.com: какой-то из антивирусов, сейчас уже не помню — какой, сдвинул брови и грозно детектировал в этой программке трояна. Зато тот-же самый антивирус настоящего трояна спокойно пропустил мимо ушей.


  1. casuss
    04.05.2016 12:45
    +2

    Срок действия пробной версии истекает через 99 дней. Интересно, каким программным продуктом эти пробные 99 дней достигнуты.


    1. ComodoHacker
      05.05.2016 10:19

      Кр… в общем он не детектируется.


  1. ComodoHacker
    05.05.2016 10:18

    Раз уж «снимаете пробу», то надо сообщать в ESET и смотреть на реакцию.

    В штатных ситуациях все антивирусы «одинаково полезны».


    1. ihhabr
      05.05.2016 10:29

      Таки пару раз обращался в техподдержку ESET — она работает, но… слишком формально они подходят к составлению обращений.


  1. esetnod32
    05.05.2016 12:06
    +1

    Добрый день.

    Пожалуйста, пришлите нам по адресу support@esetnod32.ru в архиве с паролем данный исполняемый файл.


  1. Wild_Spy
    05.05.2016 13:58

    Ситуация вполне обыденна, но все равно интересно было бы почитать комментарий представителя ESET.


  1. dkv
    05.05.2016 13:58

    Ничуть не удивляет. В стародавние времена словил детект от Др.Веб на одной свой небольшой утилите, которая копировала файлы и проставляла им атрибуты и временные метки. Стоило поменять местами два вызова WinAPI — чисто, проходи. Китайский 360 total security страдает крайней версией паранойи, бросаясь вообще на всё подряд.



  1. pavelpol
    05.05.2016 13:59
    +1

    Проверил у себя. Скомпилировал приведенный пример, включая строку setlocale и библиотеку locale.h (без нее не скомпилировалось). Сборка релизная, статичная.
    Windows 7 x64 Ultimate, MS VS Ultimate 2013 v. 12.0.21005.1
    ESS 9.0.375.1 (аналогичный) База 13437
    Результат сканирования (расширенного, со всеми опциями эвристики): чисто.


  1. Dywar
    05.05.2016 21:16

    Когда AV на виртуалке (не все), вы лицензию почитайте, иногда он будет молчать при любых обстоятельствах.