Краткий курс от ESET по проектированию малвари

в 7:03, , рубрики: C, c++, ESET, ess, информационная безопасность, Программирование

Хочешь верь, а хочешь — нет, но дело было так. В одной из контор, куда я был приглашен в качестве консультанта, уже давно заняты поисками «вменяемого» антивируса (уже предвижу на некоторых лицах ядовитые улыбки), а потому решились они снять пробы с 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("%sn", msg);
  LocalFree(msg);
}

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

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

...
#include <locale.h>

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

image

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

Автор: GrigoriZakharov

Источник

Поделиться новостью

* - обязательные к заполнению поля