Flash умер, да здравствует Flash!

Преамбула

Прислал мне тут товарищ письмо, что не может просмотреть старые мультики во Flash, я думал, что смогу их довольно быстро переконвертировать, но у меня тоже прямо сразу не получилось, т.к. в системе не оказалось соответствующего плеера/плагинов (просто забыл их поставить при установке).

Немного истории. Flash в свое время был практически революционной технологией — на маленькой (даже модемной) скорости прямо в браузере можно было смотреть 2D-мультфильмы или играть в мини-игры. Впрочем, на Flash писались и весьма неплохие проекты типа Punk’s Not Dead (копия), которые работали и в оффлайне. Вообще для простой мини-игры или мультика достаточно было скачать SWF-файл и запускать его в оффлайне с помощью специального плеера от Adobe, разработчика Flash.

Были даже целые сайты и полутекстовые онлайн-RPG, основанные на Flash. Например, когда я учился в универе, то залипал в Бойцовский Клуб

Сама технология Flash сочетала векторную графику, которая не зависит от разрешения, т.е. она может масштабироваться, и простой C-подобный язык программирования Actionscript, который позволял управлять объектами в мультфильме или игре. Порог вхождения во Flash был очень низким, что позволяло рисовать мультики или писать приложения кому угодно. К сожалению, формат был закрытым, и никто не сделал опенсорсную реализацию.

31 декабря индусско-ниггерские обезьяны из компании Adobeblya полностью прекратили мало того, что обновления, так еще и стерли последнюю версию кодека/плеера со своих официальных сайтов. Но все (пока) можно исправить, сейчас расскажу как.

Как исправить?

Дело в том, что можно было объединить файл SWF с самим плеером, т.е. к файлу SWF прикреплялся модуль EXE и его можно было запускать без плеера, как приложение Windows, плеер был встроен, примерно как самораспаковывающийся архив. Этим и воспользуемся.
Это, кстати, даже имелось как возможность при разработке во Flash, как опция, предоставленная Adobe, собрать ролик в SWF или EXE.

1. Нам понадобится программа Flash Builder (ссылки в конце заметки). Скачиваем, распаковываем, устанавливаем, запускаем.

2. В верхней части окна напротив поля SWF file нажимаем кнопку Browse (1) и выбираем нужный SWF-файл.

3. Остальные опции (Icon File и Splash Screen File) можно пропустить.

4. В нижнем списке (3) выбираем режим окна Flash-приложения:
— Полный экран (Full Screen)

— Окно без заголовка (Window without title bar)

— Окно с заголовком (Window with title bar)

— Окно с заголовком и кнопкой масштабирования окна (Window with title bar and Maximize Button)

— Окно без рамки (Window without Border). Выглядит также, как и на полный экран, только в окне, так что без картинки 🙂

Рекомендую выбирать режим «Окно с заголовком и кнопкой масштабирования окна (Window with title bar and Maximize Button)«, т.к. он самый удобный. На полный экран ролик может стать незакрываемым, а с кнопкой масштабирования у пользователя останется возможность развернуть ролик на весь экран.

Также рекомендую изменить фон ролика (2) c Transparent Background (прозрачный фон) или Transparent Background with text fix (прозрачный фон с исправлением текста) на Solid Background (непрозрачный фон) и выбрать кнопкой рядом с выпадающим списком (2) цвет из палитры.

Прозрачный фон не дает возможность изменить вид окна (доступен только Full Screen), да и выглядит эта прозрачность довольно противно.

Обычно для роликов следует выбирать черный или белый фон, но иногда приходится экспериментировать. Например, для Padonki in da flash (копия) лучше всего подошел серый фон.

Скачать

Flash Builder 1.40 с официального сайта
Flash Builder 1.40, копия на Mega.NZ

О шмоньке Соловьеве, aka Вечерний Мудозвон и о накрутках.

Вместо преамбулы скажу сразу вывод, да Соловьева абсолютно законно выпиздил из трендов Ютуб. И абсолютно в соответствии со своими правилами. И зря Роскомнадзор запрещает аниме, т.к. им же реклама на некоторых аниме-сайтах просмотры и накручивает.

Бредыстория

Итак, сижу я, никого не трогаю, новости на kasparov.ru читаю, вдруг вижу — Расчленинградский суд запретил аниме «Токийский взрыв» оно же «Террор в Токио» про подростков, которые сбежали от современной версии Отряда 731 и пытаются таки донести мысль, что нацисты не сдохли, и они даже есть в рядах японского правительства, и японские империалисты даже атомную бомбу втихую собрали. Так что вроде как и запрещать его не надо, все про крымнаш, антифашизм и даже деды воевале.

Суть

Сижу я, никого не трогаю, примус починяю , в смысле аниме смотрю, тут вдруг вижу вот это:


(полное разрешение)


(полное разрешение)

Небольшое расследование

Оно совсем небольшое, но тем не менее. У плеера kodik.info, где он был внедрен на сайт каталога аниме, есть некая база аниме (что вообще так-то хорошо, информация должна быть свободной). Ну так вот, сайты с контентом не держат контент у себя, а подключают плеер, а плеер (точнее, хозяева плеера) показывают рекламу и аниме. А чтобы купить показ в плеере kodik, нужно потратить несколько мертвых президентов США. И, они не на хеллоуин, они на долларовых купюрах. Пока не буду говорить, как я купил рекламу у kodik.info, мы придержим. Но просьба распространить, чтоб у вечернего М. пукан подорвался. Так что Ютуб вполне норм выебал Соловьева, вечернего М. за накрутку.

Удачи вам и любви!

Пакетный конвертер (перекодировщик) текстовых файлов v 0.0.3b

Обновление пакетного конвертера текстовых файлов.

Благодарим всех, кто сообщил о багах.

Изменения в версии v 0.0.3b

+ Изменения в алгоритме поиска файлов
+ Поправлен баг с сохранением конфигурации (масок файлов)

Исходники

Репозиторий на GitHub

Скачать

Портативная версия

Постоянная страничка программы (копия)

C#, поиск файла по маске, более правильное решение.

Преамбула

Когда-то уже говорил (копия) что стандартная функция C# Directory.GetFiles(); неправильно ищет файлы по маске. И даже сделал на скорую руку кривофикс, но кривофикс действительно оказался именно что криво. Во-первых, срабатывал только для некоторых масок, а во-вторых, оказался чувствительным к регистру имен файлов. Делаем более прямое исправление.

Вспомогательные функции

Заведем вспомогательную функцию, которая будет добавлять конечный слэш (\) к имени директории. Оно не особо надо, но пусть будет для порядка.

private static string AddSlash(string st)
{
    if (st.EndsWith("\\"))
    {
        return st;
    }

    return st + "\\";
}

И функцию, получающую имя файла из полного пути. Конечно, можно было бы воспользоваться классом FileInfo из System.IO, но тут операция совсем уж простая, а FileInfo может сгенерировать ненужный Exception. Проще получить имя файла с помощью строковой операции:

private static string GetNameOnly(string FullName)
{
    int LastSlash = FullName.LastIndexOf("\\");
    
    if (LastSlash == -1) return FullName;

    return FullName.Substring(LastSlash + 1);
}

Преобразование маски файла в регулярное выражение.

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

1. В имени файла могут встретиться символы, считающиеся служебными в регулярном выражении (.,^,$,{,},[,],(,),+), их необходимо экранировать, чтоб они воспринимались обработчиком регулярных выражений, как обычные, а не служебные символы.

//точка в маске файла должна быть точкой в регулярном выражении
//экранируем
Mask = Mask.Replace(".", "\\.");
//^,$,{,},[,],(,),+ в regexp служебные, в именах файла допустимые
//экранируем
Mask = Mask.Replace("^", "\\^");
Mask = Mask.Replace("$", "\\$");
Mask = Mask.Replace("{", "\\{");
Mask = Mask.Replace("}", "\\}");
Mask = Mask.Replace("[", "\\[");
Mask = Mask.Replace("[", "\\[");
Mask = Mask.Replace("(", "\\(");
Mask = Mask.Replace(")", "\\(");
Mask = Mask.Replace("+", "\\+");

2. * — в маске файла это любой символ, или их отсутствие. В регулярном выражении этому соответствует комбинация .*, заменяем:

Mask = Mask.Replace("*", ".*");

3. ? в маске файла — любой существующий символ. В регулярном выражении это символ . (точка), заменяем:

Mask = Mask.Replace("?", ".");

4. Осталось ограничить работу регулярного выражения началом и концом строки, строкой будет являться имя (маска) файла. Начало строки обозначается символом ^, конец символом $. Добавляем:

Mask = "^" + Mask + "$";

Функция целиком:

private static string Mask2Reg(string Mask)
{
    //точка в маске файла должна быть точкой в регулярном выражении
    //экранируем
    Mask = Mask.Replace(".", "\\.");
    //^,$,{,},[,],(,),+ в regexp служебные, в именах файла допустимые
    //экранируем
    Mask = Mask.Replace("^", "\\^");
    Mask = Mask.Replace("$", "\\$");
    Mask = Mask.Replace("{", "\\{");
    Mask = Mask.Replace("}", "\\}");
    Mask = Mask.Replace("[", "\\[");
    Mask = Mask.Replace("[", "\\[");
    Mask = Mask.Replace("(", "\\(");
    Mask = Mask.Replace(")", "\\(");
    Mask = Mask.Replace("+", "\\+");
    //* - любое количество любого символа, 
    //в regexp любой символ - точка, любое количество *
    Mask = Mask.Replace("*", ".*");
    //? - любой символ, в regexp любой символ - точка.
    Mask = Mask.Replace("?", ".");

    //добавляем начало и конец строки к имени файла.
    Mask = "^" + Mask + "$";

    return Mask;
}

Модификация функции поиска

В модифицированную функцию поиска передаются такие же параметры, как и в функцию Directory.GetFiles(); т.е. маска файла, путь до каталога и перечисление SearchOption, которое может принимать два значения: SearchOption.AllDirectories — поиск с подкаталогами и SearchOption.TopDirectoryOnly — поиск только в текущем каталоге.

Внутри функции:

1. Преобразуем маску файла в регулярное выражение:

string MaskRegStr = Mask2Reg(sMask);

2. Добавляем слеш к пути поиска (на всякий случай):

sPath = AddSlash(sPath);

3. Заводим List<string>, куда будем складировать отфильтрованные файлы из найденных (на то, как криво работает Directory.GetFiles() есть ссылки в начале заметки).

List<string> FoundFiles = new List<string>();

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

Regex MaskReg = new Regex(MaskRegStr, RegexOptions.IgnoreCase);

5. Вызываем функцию поиска из System.IO:

string[] files = Directory.GetFiles(sPath, sMask, SO);

6. Фильтруем вывод на предмет лишних файлов (см. подробнее по ссылке в начале заметки). Фильтрация производится путем сравнения имени файла с ранее сгенерированным регулярным выражением. Если имя файла соответствует регулярке, оно добавляется в List:

foreach (string filename in files)
{                                
    if (MaskReg.IsMatch(GetNameOnly(filename)))
    {
        FoundFiles.Add(filename);
    }
}

7. Результат возвращается в виде строкового массива:

return FoundFiles.ToArray();

Функция целиком:

public static string[] Find(string sPath, string sMask, SearchOption SO)
{
    string MaskRegStr = Mask2Reg(sMask);
    sPath = AddSlash(sPath);
    List<string> FoundFiles = new List<string>();
    Regex MaskReg = new Regex(MaskRegStr, RegexOptions.IgnoreCase);

    string[] files = Directory.GetFiles(sPath, sMask, SO);

    foreach (string filename in files)
    {                                
        if (MaskReg.IsMatch(GetNameOnly(filename)))
        {
            FoundFiles.Add(filename);
        }
    }
    return FoundFiles.ToArray();
}

Пример на GitHub

Вроде бы в этот раз все предусмотрел, и глюкоопцию встроенной функции поправил, и в регулярке нигде не наебался.

Пример на GitHub

Шпионский ярлык, небольшая заметка с экспериментом.

Преамбула

Заметка началась с небольшой просьбы, найти сигнатуру ярлыка (shortcut) Windows, т.е. LNK-файла, а вылезло несколько интересных вещей, которые стоит оставить, как зарубку на память.

Сигнатура ярлыка (shortcut signature)

Отвечаю на поставленный вопрос. Любой файл LNK начинается с четырех байт (hex):

4C 00 00 00

Ярлык шпиона

Так вот, почему ярлык шпиона? Да потому что ярлык, кроме указания пути к файлу, на который он ссылается, рабочего каталога и типа окна открытого файла (программы) сохраняет странные и непонятно для чего нужные метаданные:

— исходный путь файла и его временные метки (полный путь, время доступа к целевому файлу (UTC), время создания целевого файла (UTC), время изменения целевого файла (UTC)).
— тип тома, с которого файл был открыт (съемный носитель, обычный том, виртуальный том)
— серийный номер тома (серийный номер привода)
— метка тома
— NetBIOS-имя устройства (сетевое имя компьютера)
— MAC-адрес устройства. Впрочем, MAC-адрес устанавливается по какому-то странному алгоритму, на машине с несколькими сетевыми картами оно получается несколько рандомно. Не совсем понял, как это устроено, кто знает — напишите в комментариях.
— размер целевого файла (байт) — размер файла, с которым ассоциирован ярлык

Зачем это делается, не совсем понятно.

Почитать подробнее можно по следующим ссылкам:
Токсичные ярлыки в Windows: старый артефакт, не забытый хакерами, но частично забытый криминалистами (копия в PDF)
Какую информацию можно получить из ярлыка? (копия в PDF)

Программа для просмотра метаданных ярлыка

В первой статье анализ проводился платными программами для расследования инцидентов кибербезопасности, но кое-что можно посмотреть и бесплатно, программой Windows File Analyzer, описана во второй статье, не буду повторяться, оставлю ссылки на скачивание:
С сайта разработчика
Копия на Mega.nz

Небольшой эксперимент, или старые имена файлов, сохраняющиеся в ярлыках

Известно, что Office и некоторые другие программы хранят ярлыки последних сохраненных документов в специальных каталогах для того, чтобы потом показывать пользователю список открытых документов. Так вот, решил провести эксперимент — создать файл с каким-нибудь красноречивым компрометирующим именем, а потом изменить свойства ярлыка и посмотреть, что получится.
Итак, создаем пустой файл с именем, например, PutinBombaVzryvChechency.doc и создаем ярлык. Смотрим содержимое ярлыка в шестнадцатеричном редакторе (красным выделил сигнатуру файла LNK):

Создаем файл kotik.doc и пытаемся поменять ярлык через «Свойства ярлыка», на несуществующий файл ссылку стандартным способом сделать нельзя, потому делаем на существующий файл:

Проверяем, открывая измененный ярлык в HEX-редакторе.

Пробуем изменить ярлык программно, с помощью класса vbAccelerator.Components.Shell, через WinAPI (копия заметки):

string lnkname = @"C:\Temp\PutinBombaVzryvChechency.doc - Ярлык.lnk";
ShellLink lnk = new ShellLink();

lnk.Open(lnkname);
lnk.Target = "X:\\NoFile.doc";
lnk.WorkingDirectory = "X:\\";
lnk.Save();

Проверяем в HEX-редакторе:

Все еще хуже.

Подробной гипотезы о том, почему оно так работает, у меня нет, но к определенным мыслям это приводит. Например, при удалении ярлыков последних документов их лучше всего удалять безопасным удалением (т.е. с полной перезаписью содержимого файла LNK). Конечно, можно разобраться в формате файла (тем более, он опубликован), но мало ли что MS добавит туда в будущем. А в целом, ситуация дискомфортная, даже если и ложечки найдутся, осадок останется, т.к. обычно мало кто обращает внимание на такую незначительную мелочь, как ярлык, а восстанавливаются (если они были удалены стандартным образом) они достаточно просто, сигнатурным поиском по диску.

Sony Vaio, поставить Windows 7 с ноля, проблемы с драйверами и видео (Intel HD Graphics 4000)

Преамбула

Заметка по мотивам онлайн-консультации и больше от склероза, так что скринов будет мало, а кое-где могу что-то забыть, если что — пишите в комментарии. Задача — вернуть на Sony Vaio (SVT1111Z9RS) Windows 7, которая там стояла изначально, вместо Windows 10, которую туда кто-то зачем-то запихал.

Что понадобится

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

— Дистрибутив Windows 7
— Driver Pack Solution (у товарища была полная оффлайн-версия), как минимум нужна Driver Pack Offline Network
Кумулятивное обновление Windows 7 от Simplix
NET Framework 4.0
Драйвера для видеокарты (Intel HD Graphics 4000)
Копия (драйвера Intel HD Graphics 4000 + .NET Framework 4)

Установка Windows

Поделить диск можно как угодно, сработают и Arconis и, например, System Rescue CD.
Но первый сюрприз поджидает уже тут, на машине USB 3.0, потому если устанавливать оригинальный дистрибутив с флешки, то установщик перестанет ее видеть. Потому нужно или искать дистрибутив Windows 7 с поддержкой USB 3.0, или если лень искать, то можно установить Windows 7 через установочное окружение Windows 8 (копия), товарищ сделал все еще проще, загрузился с System Rescue CD и скачал все перечисленное выше с сервера на заранее подготовленный раздел жесткого диска, и запустил установку Windows с жесткого диска из Windows PE на базе Windows 7, например, такой или такой. Естественно, на HDD копируем распакованный из ISO-образа дистрибутив, а не сам ISO.

Установка драйверов

Секунда ненависти и ворчания. Sony — откровенные гондоны, пидары и козлы. Теперь все фильмы, произведенные этими мудоебищами, буду смотреть исключительно ворованные, т.к. эти уроды убрали с официального сайта все драйвера для старых ноутбуков:

Обращаем ваше внимание, что с 1 января 2021 г. Sony больше не будет предоставлять драйверы и программное обеспечение для компьютеров Sony VAIO, поставлявшихся со следующими предустановленными операционными системами Microsoft Windows и перечислены все ОС, в т.ч. и Windows 7.

Но у нас есть Driver Pack Solution, так что:

1. Запускаем Driver Pack Solution, переключаемся в режим эксперта, убираем все, кроме драйверов для LAN и устанавливаем их.
2. Перезагружаем компьютер.
3. После перезагрузки опять запускаем Driver Pack Solution, опять переключаемся в режим эксперта и устанавливаем все остальные драйвера, кроме драйвера видеокарты. С ним лучше повременить, объясню ниже.
4. Перезагружаем компьютер.

Установка драйвера видеокарты Intel HD Graphics 4000 и проблема с цифровой подписью драйвера.

Если прямо сейчас попытаться установить драйвер видеоадаптера, то Windows начнет ругаться на отсутствие цифровой подписи, видеодрайвер не заработает, а в диспетчере устройств у видеодрайвера будет отображаться восклицательный знак, в свойствах указана ошибка 52 "Не удается проверить цифровую подпись драйверов".


Вот так, только с видеоадаптером

Не знаю, с чем точно это связано, но подозреваю с тем, что в чистой Windows 7 SP1 нет нужного нового сертификата Intel, а оригинальный драйвер с сайта Sony был или более старым, чем теперешний, или с драйвером поставлялось обновление сертификата (и ведь не проверишь, горите в аду пиздоглазые анальные проушины из Sony). Вот тут и пригодится кумулятивное обновление от Simplix.

Итак, решаем проблему:
1. Устанавливаем обновление от Simplix:
1.1 В каталоге со скачанным пакетом (на момент написания заметки, файл называется UpdatePack7R2-21.1.15.exe) создаем BAT-файл update.bat со следующим содержимым:

UpdatePack7R2-21.1.15.exe /IE11

1.2 Запускаем update.bat
1.3 Следуем инструкциям на экране, в процессе установщик предложит перезагрузиться, перезагружаемся, дожидаемся окончания установки.
2. Устанавливаем .NET Framework 4
3. Устанавливаем видеодрайвер (с сайта Intel)

Родная ОС возвращена.

ФАНФАРЫ!

C#. Удаление значений (values) из ключа Реестра

Преамбула

Задача довольно простая, имеется ключ в разделе Реестра Windows, необходимо удалить оттуда все значения (values).

Термины и определения

Реестр — иерархическая база данных, хранящая основные настройки системы и программ.
Корневой ключ (в некоторых источниках просто ключ или раздел Реестра), это один из основных ключей Реестра. Обычно присутствуют следующие:

HKEY_CLASSES_ROOT (HKCR) — Зарегистрированные типы файлов, объекты COM и ActiveX
HKEY_CURRENT_USER (HKCU) — Настройки текущего пользователя, в данный момент вошедшего в систему.
HKEY_LOCAL_MACHINE (HKLM) — Общие настройки для всех пользователей данного компьютера.
HKEY_USERS (HKU) — Профили всех пользователей данной машины.
HKEY_CURRENT_CONFIG (HKCC) — Профили оборудования, информация о драйверах.

Подключ/Subkey (иногда Ключ, если корневой раздел называется корневым разделом или корневым ключом) Реестра — путь в Реестре, аналогичный пути к каталогу (папке) файловой системы. Обычно каждый подключ хранит или настройки для конкретного случая. Например, настройки конкретной программы или профиль конфигурации оборудования. Выглядит примерно так: Software\TestKey (в полном виде, вместе с корневым ключом, например: HKEY_CURRENT_USER\Software\TestKey).

Подключ может содержать как и другие подключи, так и значения (values), представляющие собой поименованные переменные, содержащие значения конкретного параметра

Обзорная статья про Реестр Windows на Википедии

Тестовый ключ

Для тестирования создадим тестовый ключ, который не будет влиять на какие либо программы и компоненты ОС. Это можно сделать, как вручную, с помощью программы Regedit, так и в автоматическом режиме, с помощью reg-файла, например, такого:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\TestKey]
"value0"="text0"
"value1"="text1"
"value2"="text2"
"value3"="text3"
"value4"="text4"
"value5"="text5"

Файл на GitHub

Можно создать и reg-файл для удаления тестового ключа из Реестра, если что-то пойдет не так:

Windows Registry Editor Version 5.00

[-HKEY_CURRENT_USER\Software\TestKey]

Файл на GitHub

Решение

1. Подключаем пространство имен Microsoft.Win32:

using Microsoft.Win32;

2. Создаем переменную с именем подключа Реестра и переменную типа RegistryKey. Этот объект и будет рулить нужной веткой Реестра:

string subkey = "Software\\TestKey";
RegistryKey key = null;

3. Любые операции с Реестром могут привести к ошибкам, потому их как и операции ввода-вывода желательно оборачивать в try..catch:

try
{
    //тут будет код.
}
catch (Exception ex)
{
    Console.WriteLine("ERROR: " + ex.Message);
}

4. Открываем (под)ключ Реестра:

key = Registry.CurrentUser.OpenSubKey(subkey, true);

Внимание! Если необходимо писать в ключ Реестра, обязательно устанавливаем второй параметр функции OpenSubKey в true, т.к. в противном случае, мы получим ошибку UnauthorizedAccessException: Не удалось выполнить запись в раздел реестра.

Обсуждение на Cyberforum

5. Получить список значений в (под)ключе можно функцией GetValueNames(), которая выдает строковый массив с именами значений Реестра.

6. Получаем имена всех значений и в цикле удаляем их с помощью функции DeleteValue(имя_параметра);

foreach (string valname in key.GetValueNames())
{
    Console.WriteLine("Delete value: " + valname);
    key.DeleteValue(valname);
}

7. Закрываем (под)ключ Реестра.

key.Close();

Все получилось:

Код целиком

На PasteBin

Тестовый пример

Пример на GitHub

C#, генератор файлов (нужного количества и с определенным содержимым).

Описание задачи

Итак, требуется написать программу, которая генерирует заданное количество файлов с определенным содержимым. Содержимое задается или в качестве байтового паттерна (т.е. если программе указать 0xFF, то файл будет заполнен указанным количеством байт со значением 0xFF) или случайных байт. Файлам также можно задать расширение, или сделать и имя файла случайным.

Программа

Выполнена в виде консольной программы, запускаемой со следующими параметрами:

Использование: filegen.exe <количество_файлов> <размер>[K|M|G] <расширение|/R> [байтовый_паттерн|/R]

<количество_файлов> - количество файлов
<размер> - размер:

   по умолчанию - байты
   K - килобайты
   M - мегабайты
   G - гигабайты

<расширение> - расширение файла или /R - случайное имя файла
[байтовый_паттерн] - байтовый паттерн (HEX): от 0x00 до 0xFF, по умолчанию 0x00 или /R случайные байты

Использованные алгоритмы

1. С#, Заполнение массива одним значением. (копия)
2. C#, заполнение массива случайными числами. (копия)
3. C#, Количество цифр (разрядов) числа. (копия)
4. C#. Перевод кило- мега- и гигабайтов в байты. (копия)

Пример программы

На GitHub

C#. Перевод кило- мега- и гигабайтов в байты

Преамбула

Простая учебная задача, но почему-то до моего решения долюбились, в конце объясню, почему долюбились, и почему, в случае C#, это зря было.

Решение

И так, задача состоит в том, чтобы всякие кратные единицы перевести в байты (кому надо обратную задачу, либо все во все — пишите в комментарии). Для этого достаточно сделать следующую функцию, исходя из того, что 1 Кб == 1024 Б, 1 Мб = 1024 Кб, 1 Гб = 1024 Мб. В функцию добавим некую переменную-модификатор, для консольного приложения было проще сделать строковую, в ином случае, может и есть сделать отдельный Enum для единиц, но я обошелся строковой.
Переменная-модификатор (modificator) принимает строковые значения G(g), M(m) и K(k), соответственно для гига- мега- и килобайта.

Функция получается такая:

public static ulong ToBytes(ulong bytes, string modificator)
{
    ulong Ret = 0;
    switch (modificator)
    {
        case "":
            {
                Ret = bytes;
            } break;
        case "K":
        case "k":
            {
                Ret = bytes * 1024;
            } break;
        case "M":
        case "m":
            {
                Ret = bytes * 1024 * 1024;
            } break;
        case "G":
        case "g":
            {
                Ret = bytes * 1024 * 1024 * 1024;
            } break;
        default:
            {
                throw new ArgumentException("Wrong modificator ["
                    + modificator + "]. Set K(k), M(m), G(g)");
            }                    
    }

    return Ret;
}

Почему не стал заморачиваться с Enum’ом

Задача была очень простая, чисто учебная. Консольная программа принимает в качестве одного параметра число с единицей без пробела, т.е. команда вида program.exe 10G, должна вывести количество байт. Надо ли Enum городить, ну красиво было бы, но до Enum‘ов они не добрались 🙂

В основной программе надо отрезать последний символ из параметра, проверить ли является он нужной буквой (K/M/G) и пересчитать. Если буквы нету, а только цифры — значит оно уже сразу байты.

В функции Main() отрезаем последний символ от первого параметра командной строки, если он K/M/G, считаем, что все остальное число, отрезаем его, а все остальное пытаемся сконвертировать в ulong (Int64) и передать функции ToBytes() с отрезанным символом, как модификатором для расчета. Если нет — просто считаем, что вся строка число, пытаемся конвертировать, а функции передаем пустой модификатор.

Ошибки конвертации ловим try/catch:

string size_s = args[1];

try
{
    string mdf = size_s.Substring(size_s.Length - 1, 1);
    if ((mdf != "K") && (mdf != "k") && (mdf != "M") && (mdf != "m") &&
        (mdf != "G") && (mdf != "g"))
    {
        mdf = "";
        //in parameter only numbers or param wrong...
    }
    else // remove modificator
    {
        size_s = size_s.Substring(0, size_s.Length - 1);
    }
    BytesCount = ToBytes(Convert.ToUInt64(size_s), mdf);
}
catch (Exception ex)
{
    Console.WriteLine("Wrong <size> parameter!");
    Console.WriteLine(ex.Message);
    Console.Write("Press Enter...");
    Console.ReadLine();
    return 2;
}

Пример целиком на GitHub

Почему долюбились

За вот эти вот конструкции:

Ret = bytes * 1024;
Ret = bytes * 1024 * 1024;
Ret = bytes * 1024 * 1024 * 1024;

Типа «ну тут числа, ты бы их сначала перемножил, результат записал , а потом на переменную помножил».

Почему зря.

Дебилы, бля, как говорил Лавров. В интерпретируемых языках или старом Трупопоскакале под DOS, может это и какой-то рояль играет, но в C# компилятор перемножает константы до сборки экзешника, а 1024*1024*1024 для компилятора константы, во время компиляции. Т.е. процессору скормят 1073741824. А код останется более понятен и читабелен.

C#, добавление лидирующих нолей к строковому представлению числа, более оптимальный способ.

Преамбула

Здесь (копия) я показал довольно неоптимальный способ решения данной задачи, но его можно оптимизировать с помощью стандартных функций. Напомню суть задачи: даны числа, скажем, от 1 до 1000, необходимо вывести их на экран или в файл последовательно, добавив лидирующие ноли, исходя из максимального числа. Если максимум 1000, то числа должны быть выведены так:
0001
0002
0003
...
0100
0101
0102
...
1000

Если максимум 100, то:

001
002
...
099
100

Подготовка

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

int maxnum = 150;

И опять же, понадобится функция, вычисляющая количество цифр (разрядов) числа (копия). Например, такая:

static int CountDigitsRec(int n)
{
    n = (int)Math.Abs(n);
    if (n <= 9)
    {
        return 1;
    }
    else
    {
        return CountDigitsRec(n / 10) + 1;
    }
}

Форматирование строки

C# автоматически умеет форматировать строки, используя специальные паттерны описания формата, задаваемые в виде строки. Основные паттерны перечислены в таблице ниже:

C / c Задает формат денежной единицы, указывает количество десятичных разрядов после запятой
D / d Целочисленный формат, указывает минимальное количество цифр
E / e Экспоненциальное представление числа, указывает количество десятичных разрядов после запятой
F / f Формат дробных чисел с фиксированной точкой, указывает количество десятичных разрядов после запятой
G / g Задает более короткий из двух форматов: F или E
N / n Также задает формат дробных чисел с фиксированной точкой, определяет количество разрядов после запятой
P / p Задает отображения знака процентов рядом с число, указывает количество десятичных разрядов после запятой
X / x Шестнадцатеричный формат числа

Для форматирования строки, содержащей целое число, необходимо использовать паттерн d.

Форматирование во время вывода строки на консоль.

Отформатировать строку можно сразу во время вывода на консоль, функцией Console.Write()/Console.WriteLine():

int num = 125
Console.Write ("0:d4", num) //вывод: 0125

или

int num = 25
Console.Write ("0:d4", num) //вывод: 0025

Пример:

static void Main(string[] args)
{
    int maxnum = 150;
    string FormatPattern = "{0:d" + 
        CountDigitsRec(maxnum).ToString() + "}";

    for (int i = 0; i <= maxnum; i++)
    {
        Console.WriteLine(FormatPattern, i);
    }

    Console.WriteLine("Press Enter...");
    Console.ReadLine();
}

Пример на GitHub

Использование String.Format()

Функция String.Format() может сделать аналогичную операцию, но отличается тем, что вывод функции можно сохранить в строковую переменную и использовать далее, а не просто вывести на консоль.

Пример:

static void Main(string[] args)
{
    int maxnum = 1150;
    string FormatPattern = "{0:d" +
        CountDigitsRec(maxnum).ToString() + "}";
    string TempFile = Path.GetTempFileName();
    string Result = "";
    List<string> WriteList = new List<string>();

    for (int i = 0; i <= maxnum; i++)
    {
        Result = String.Format(FormatPattern,i);
        Console.WriteLine(Result);
        WriteList.Add(Result);
    }

    File.WriteAllLines(TempFile, WriteList.ToArray());

    Console.WriteLine("Test file: " + TempFile);
    Console.WriteLine("Press Enter...");
    Console.ReadLine();
}

В цикле результат работы функции String.Format() возвращается в переменную Result, значение которой выводится на консоль и сохраняется в List<string> WriteList для дальнейшей записи в файл.

Пример на GitHub

Примечание: в источнике есть еще варианты форматирования строк, ознакомьтесь.

Источник

Форматирование и интерполяция строк (копия на mega.nz, PDF)

Проклятый старый комп (еще одна пародия на КиШ)

В локальной сети
Стоит старинный комп,
Закрыт весь доступ,
Пароль висит большой на нем.

Сказать я пытался
Троянов нет на компе,
Но тут же раздался,
Ужасный голос в винде

Голос в Винде…
[Визг свиньи Касперского]

Мне больно видеть Интернет,
Скорей бы отключить вас всех.
Я очень много много лет
Мечтаю о крутом компе

Мне слишком тесно на XP
И я мечтаю об одном,
Скорей пароль свой поломать,
Проникнуть в какдый каждый комп!

Будь проклят каждый комп!

Был вирус в БИОС,
Крутой и жутко злой
Админ не понял
Как комп спасти от заразы той.

Админы не стали
Тогда харддиск форматить
Пароли поставив, решили пива попить,
И забухали…

Мне больно видеть Интернет,
Скорей бы отключить вас всех.
Я очень много много лет
Мечтаю о крутом компе

Мне слишком тесно на XP
И я мечтаю об одном,
Скорей пароль свой поломать,
Проникнуть в какдый каждый комп!

Будь проклят каждый комп!

И это место стороной
Обходит нетский люд,
И антивирусы твердят —
Там вирусы живут!

C#, добавление лидирующих нолей к строковому представлению числа.

Преамбула

Задача опять же учебная, но может пригодиться и в реальной программе. Итак, нам даны числа, скажем, от 1 до 1000, необходимо вывести их на экран или в файл последовательно, добавив лидирующие ноли, исходя из максимального числа. Если максимум 1000, то числа должны быть выведены так:
0001
0002
0003
...
0100
0101
0102
...
1000

Если максимум 100, то:

001
002
...
099
100

Решение

Нам понадобится максимальное число, в тестовом примере мы его жестко зададим:

int maxnumber = 1998;

Далее, понадобится получить количество цифр числа. Это мы уже делали, причем разными способами (копия), выбираем подходящий.

Создаем отдельный класс (в примере AddLZ) и добавляем туда функцию:

public static int CountDigitsRec(int n)
{
    n = (int)Math.Abs(n);
    if (n <= 9)
    {
        return 1;
    }
    else
    {
        return CountDigitsRec(n / 10) + 1;
    }
}

В основной программе получаем количество цифр числа:

int maxdigits = AddLZ.CountDigitsRec(maxnumber);

Далее в цикле перебираем все числа, и скармливаем их функции, которая будет добавлять лидирующие ноли (AddLZ.AddLeaderZeroString(maxdigits, i));

for (int i = 0; i <= maxnumber ; i++)
{
    string Result = AddLZ.AddLeaderZeroString(maxdigits, i);
    //...
}

На вход функции подается два параметра — максимальное количество цифр и текущее число.

Внутри функции

Получаем строковое представление текущего числа:

string scurnum = ((int)Math.Abs(curnum)).ToString();

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

int LenLZ = maxnum - scurnum.Length;

Далее, надо сформировать строку нужной длины из одного символа ('0') (копия):

StringBuilder sb = new StringBuilder(maxnum);
for (int i = 0; i < LenLZ; i++)
{
    sb.Append('0');
}

Далее добавляем строковое представление текущего числа:

sb.Append(scurnum);

И возвращаем значение:

return sb.ToString();

Функция целиком

public static string AddLeaderZeroString(int maxnum, int curnum)
{
    string scurnum = ((int)Math.Abs(curnum)).ToString();
    int LenLZ = maxnum - scurnum.Length;

    StringBuilder sb = new StringBuilder(maxnum);
    for (int i = 0; i < LenLZ; i++)
    {
        sb.Append('0');
    }
    sb.Append(scurnum);

    return sb.ToString();
}

Исходники

Тестовый пример на GitHub
Класс AddLZ

C#, сгенерировать строку нужной длины из одного символа.

Преамбула

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

Теперь будем делать строку-паттерн из одного заранее заданного символа.

Заведем три переменных:

int strlen = 100000; // длинна строки
string symbol = "a"; // символ заполнения
string Result = ""; // результирующая строка

«В лоб», с использованием стандартной конкатенации строк

Т.е. в цикле for, используя конструкцию s=s+"a":

for (int i = 0; i < strlen; i++)
{
    Result = Result + symbol;
}

С использованием StringBuilder

StringBuilder sb = new StringBuilder(strlen);
for (int i = 0; i < strlen; i++)
{
    sb.Append(symbol);
}

Result = sb.ToString();

Тесты

For + standart string concatenation: 00:00:05.7493288
Test For + StringBuilder.Append: 00:00:00.0030001

Даже на 10000 символов видна разница, здесь показана на 100000, а 500000 для for я вообще не дождался.

Примечание: Тут мы делали строку заданной длины из одного паттерна, поэтому StringBuilder был уместен, т.к. он напрямую работает с памятью, и не использует механизм .NET, которому нужно строку скопировать, а потом добавить символ. См. ссылку ниже.

Эффективная конкатенация строк в .NET

Тестовый пример на GitHub

C#, Количество цифр (разрядов) числа.

Пост из серии «спрашивали — отвечаем», довольно стандартная учебная задача, никакой особой военной хитрости нет, но раз уж, что б нет то.

Преобразование числа в строку и подсчет символов

Самый простой, дубовый, но самый медленный по времени выполнения способ. Обычно в школе за него по рукам бьют 🙂

static int CountDigitsStr(int n)
{
    return ((int)Math.Abs(n)).ToString().Length;
}

Получаем модуль числа [(int)Math.Abs(n)], чтоб исключить ситуацию, если в n окажется отрицательное число, преобразуем число в строку и получаем количество символов в строке, т.е. количество цифр числа.

Подсчет цифр делением нацело

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

Можно сделать в двух вариантах.

В цикле:

static int CountDigitsCycle(int n)
{
    n = (int)Math.Abs(n); //берем модуль числа
    int count = 0; //заводим счетчик
    if (n == 0) count = 1; // n == 0? Цифра одна.
    while (n != 0) //пока n не равно 0
    {
        n = n / 10; //делим число на 10
        count++; //прибавляем счетчик
    }
    return count;
}

Какая-то специальная функция для деления нацело в C# не нужна, при делении переменной цельночисленного типа (byte, sbyte, short, ushort, int, uint, long, ulong) на целое число или цельночисленную переменную, результатом будет целое число, т.е. деление нацело произойдет автоматически.

Рекурсией:

static int CountDigitsRec(int n)
{
    n = (int)Math.Abs(n);
    if (n <= 9)
    {
        return 1;
    }
    else
    {
       return CountDigitsRec(n / 10) + 1;
    }
}

Использование десятичного логарифма.

static int CountDigitsLog10(int n)
{
    if (n == 0)
    {
        return 1;
    }
    return (int)Math.Log10(Math.Abs(n)) + 1;
}

С#, Заполнение массива одним значением.

Преамбула

Практического значения эта задача обычно не имеет (на самом деле применение есть, покажу позже), но, тем не менее, иногда ее дают в качестве учебной задачи. Попробуем ее решить на C#.

Примечание: Создаваемый по умолчанию массив, автоматически заполняется нолями (0x00).
А нам, как раз, наоборот, надо создать массив с паттерном 0xFF или 0xAA.

Решение «в лоб»

Я думаю, оно всем понятно. Создать массив и заполнить его нужными значениями:

int items = 536870912;
byte[] tArr = new byte[items];

for (int i = 0; i < items; i++)
{
    tArr[i] = 0xFF;
}

Тут мы в цикле присваиваем каждому элементу массива значение 0xFF.

— Оно медленное.
+ Оно простое и с использованием безопасного кода.

В лоб + Array.Copy

Некто попытался оптимизировать прошлое решение, используя Array.Copy(), думая, что эта функция быстрее работает с памятью.

Что решение «в лоб», что «Array.Copy()» с распополамленным циклом работают одинаково, точнее, получилось даже медленнее (в конце статьи будет итоговая таблица):

int items = 536870912;
byte[] tArr = new byte[items];
tArr[0] = 0xFF;
for (int i = 1; i <= items / 2; i *= 2)
{
    Array.Copy(tArr, 0, tArr, i, i);
    Array.Copy(tArr, 0, tArr, i, items - i);
}

P/Invoke способ с использованием внешних библиотек

Прямая работа с памятью сильно обходит .NET по скорости, так что самый оптимальный способ для такой задачи — использовать небезопасный код.

public static class FillArray
{
    [DllImport("msvcrt.dll",
    EntryPoint = "memset",
    CallingConvention = CallingConvention.Cdecl,
    SetLastError = false)]

    private static extern IntPtr MemSet(IntPtr dest, int value, int count);

    public static byte[] FillBytes(int Length, byte Value)
    {
        byte[] Arr = new byte[Length];
        GCHandle GCH = GCHandle.Alloc(Arr, GCHandleType.Pinned);
        MemSet(GCH.AddrOfPinnedObject(), (int)Value, Length);
        return Arr;
    }

В свою программу мы импортировали функцию memset из библиотеки msvcrt.dll, т.е. смогли получить контроль над памятью. И заполнили нужным числом массив. Поскольку, за нас это делали библиотеки C++ и функции ОС, все оказалось быстро.

Сравнительная таблица скорости работы разных алгоритмов заполнения массива (массив 500 Мб).

For 00:00:04.4212528
For+Array.Copy() 00:00:04.6952685
MemSet (msvcrt.dll) 00:00:00.2360135
Random bytes (RNGCryptoServiceProvider) 00:00:06.1143497

Сравнение алгоритмов в источнике.

Тестовый пример (для этого и предыдущего [копия] поста) на GitHub

Источник

C#, заполнение массива случайными числами.

Преамбула

Можно сказать, учебная задача. Итак, дан массив типа byte[], необходимо заполнить его случайными числами. И случайные числа нужны понадежнее. Ну хорошо, аппаратный ГСЧ конструировать не будем 🙂 Хотя как-нибудь надо и этот вариант рассмотреть.

Решение

Все решается довольно стандартными методами:

1. Подключаем пространство имен System.Security.Cryptography:

using System.Security.Cryptography;

2. Создаем массив байт нужной длины:

byte[] Arr = new byte[666];

3. Создаем RNGCryptoServiceProvider, т.е. генератор случайных чисел системного криптопровайдера.

RngCsp = new RNGCryptoServiceProvider();

4. Заполняем массив:

RngCsp.GetBytes(Arr);

Примечание: Это довольно простое решение «в лоб», и хоть Майкрософт гарантирует нам, что числа будут прям случайные-случайные, в самом MSDN показан пример с выкрутасами (см. в источниках).

Примечание #2: Метод стандартный для C#, но довольно медленный. Даже медленнее, чем заполнение гигантского массива на 500 Мб одним числом, в примерном приближении и довольно неточно заполнение массива заняло почти 6 секунд:

Random bytes (RNGCryptoServiceProvider): 00:00:05.8453343

Источник

RNGCryptoServiceProvider Class

Отключение обновления Firefox. Обновление Firefox по требованию.

Ворчательная преамбула.

По работе приходится пользоваться сразу несколькими профилями Firefox, в одном рабочий web-интерфейс, в другом плагин отлаживаю, третий для общего интернета, музыка там, например, играет или еще что. Но есть дурацкая проблема — открываешь новый профиль, а тут хуяк — и лисе присралось обновиться. После чего все профили приходится закрывать и открывать все заново, ибо через некоторое время они начнут глючить.

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

Перевод обновлений в режим «по требованию».

1. Идем в настройки Firefox, или через меню, или просто пишем в адресной строке about:preferences.
2. Попадаем в раздел Основные. [1]
3. Прокручиваем вниз до раздела Обновление Firefox
4. Ставим переключатель (радиокнопку) в положение Проверять наличие обновлений, но позволять вам решать, устанавливать ли их. [2]

ФАНФАРЫ!

У ДВБ Нацполіції шантажем та погрозами кошмарили власників веб-сервісу, вимагаючи допомоги в розслідуванні підпалу будівлі Головного слідчого управління

И еще одно. Национальный антикоррупционный портал.

Під час розслідування резонансної справи про підпал приміщення Головного слідчого управління Національної поліції України вітчизняні силовики влаштували тиск і переслідування адміністрації інтернет-сервісу Virtualsim.net.

Про це йдеться у відкритому листі власників проекту, який надає в оренду телефонні номери для реєстрації веб-сервісів з використанням SMS-кодів.

У його тексті зазначено, що українські можновладці з використанням погроз та шантажу намагалися зламати сервіс Virtualsim.net, що був заснований у 2015 році «для користувачів Інтернету, зацікавлених у конфіденційності задля здійснення свого права на свободу слова та недоторканість персональних данних в умовах неправових держав, що може бути корисним громадським активістам…», зокрема для реєстрації або підтвердження входу в облікові записи в соцмережах без розкриття справжніх номерів телефонів.

Засновники Virtualsim.net наполягають, що не несуть відповідальність за діяльність своїх користувачів на сторонніх веб-сервісах, а інформація щодо клієнтів компанії є конфіденційною та «не може бути розкрита інакше, аніж за офіційним запитом суду, якщо цей запит не суперечить праву людини на свободу слова і не пов’язаний з цензурою, яка заборонена Конституцією України». Тим не менш, влітку 2020 року адміністрація інтернет-сервісу буцімто стикнулася зі спробами «впливу на сервіс поза правовим полем» з боку українських силовиків.

Приводом для уваги правоохоронців став інцидент з підпалом приміщення Головного слідчого управління Нацполіції по Набережному шосе в Києві, який трапився в ніч на 10 червня 2020 року. Як раніше зазначалося на сторінках Dетектив-Info, відповідальність за цю атаку запалювальною сумішшю будівлі поліції в українській столиці невдовзі на себе взяло угруповання анархістів «Сміливці», чиє звернення було оприлюднено на сторінках видання «Боєць Анархіст».

У його тексті зазначалося — підпал Головного слідчого управління начебто є своєрідним висловленням протесту після двох скандальних історій поліцейського свавілля (вбивства 5-річного Кирила Тлявова в Переяслав-Хмельницькому та зґвалтування дівчини «копами» у відділенні поліції в Кагарлику).

При цьому, за версією силовиків, один з клієнтів Virtualsim.net якимось чином виявився пов’язаним з пожежею кабінетів ГСУ. «Ідентифікація була здійснена за номером телефону, на який був зареєстрований аккаунт у Telegram. Цей номер телефону клієнт придбав на нашом сервісі», — пояснюють в адміністрації веб-сервісу.
Читайте также: В Україні ліквідували понад сотню інтернет-магазинів з продажу наркотиків

В рамках розслідування кримінальної справи щодо підпалу будівлі Головного слідчого управління Нацполіції (ч.2 ст.194 КК України) 9 липня 2020 року слідчий суддя Печерського районного суду Києва Олеся Батрин задовольнила клопотання слідчого ГУНП у місті Києві Анастасії Кольчик, погоджене прокурором Київської місцевої прокуратури №6 Ярославом Мрачко, про надання санкції на обшук місцезнаходження відповідної SIM-карти.

«Таким чином передбачалося затримати власника аккаунта Telegram, але насправді ця SIM-карта ніколи не знаходилася в нього, оскільки є власністю Virtualsim.net та надавалася в оренду. Управлінням SIM-картками займався найнятий сервісом оператор: саме до нього і завітало близько десятка поліцейських Департаменту внутрішньої безпеки з Києва, подолавши відстань у понад 550 кілометрів, — зазначено у відкритому листі адмінстрації Virtualsim.net. — Оператор видав SIM-карту, що цікавила поліцейських. Однак, незважаючи на детальні пояснення принципу роботи сервісу, демонстрацію панелі доступу до сайту Virtualsim.net для передачі кодів з SMS та наявності дозволу суду тільки на зняття копій… поліція вилучила все обладнання — модеми, смартфони, жорткі диски, ноутбук, а також велику кількість SIM-карток, арендованих клієнтами Virtualsim.net».

Власники інтернет-сервісу стверджують, що подальша доля вилучених SIM-карток наразі невідома. «Таким чином, конфіденційність користувачів сервісу та, ймовірно, збереження їх грошових коштів (деякі клієнти користуються сервісом для віходу в свої платіжні системи) без будь-яких правових підстав були порушені. Робота відділення сервісу була призупинена, йому завдано необґрунтованих збитків на кільки тисяч доларів, оператор втратив можливість заробітку» — бідкаються в Virtualsim.net.

Вони додають, що надалі операторів сервісу правохоронці схиляли до «незрозумілої співпраці» з метою відшукання та ідентифікації власників інтернет-бізнесу. Одночасно з цим було виявлено спробу зламу особистого аккаунта Facebook одного з засновників Virtualsim.net, а сам веб-сайт почали «сканувати» на предмет відшукання його вразливостей.

За місяць «копи», врешті-решт, вирішили зв’язатися з власниками сервісу напряму та почали вимагати від них «видачі інформації», висловлюючи погрози та недвозначні натяки.

«Один з поліцейських зміненим голосом записав аудіофайл про те, що справу (про підпал приміщення ГСУ Нацполіції — Ред.) перекваліфікують на «замах на вбивство», а нас оголосять співучасниками. Наших зауважень з цього приводу поліція не почула. З їх боку виступав якийсь анонім, однак оскільки сеанс зв’язку був попередньо узгоджений та відбувався по сторонньому каналу й надалі, ми абсолютно впевнені, що спілкувалися з особами, які розслідують справу, — переповідають подальший розвиток подій у Virtualsim.net. — Побоюючись за життя і здоров’я нашого колишнього оператора, який на території України фактично опинився в заручниках у недобросовісних поліцейських… зрештою ми погодилися провести видачу (інформації — Ред.)… Передусім ми піддалися на шантаж — здоров’я та свобода людини, яка працювала з нами, достатнь важливі для нас. Нам подякували та на певний час спілкування припинилося».

В подальшому у власників Virtualsim.net виникли сумніви щодо причетності їх клієнта — орендаря SIM-картки, на яку був зареєстрований Telegram-канал, до скоєння підпалу будівлі Головного слідчого управління Нацполіції. Мовляв, із розмов із анонімними «копами» останні повідомляли — їм важливо упіймати будь-якого анархіста та оголосити про розкриття справи.

«Ще більше питань виникло через те, що цей клієнт, за твердженнями поліції, начебто пов’язаний з сайтом «Боєць Анархіст». Наразі цей ресурс після DDoS-атаки (ймовірно влаштованої не без «допомоги» української влади) призупинив роботу та пішов у DarkNet. Цей сайт являв собою новинний ресурс з висвітлення діяльності «лівих анархістів», зокрема — історії підпалу будівлі поліції. Цей сайт першим оприлюднив повідомлення про підпал, яке надійшло від групи «Сміливці» на електронну пошту видання. Не виключено, що в поліції вирішили «зачепитися» за першого-ліпшого «анархіста», аби надалі просунутися в розслідуванні. У той же час наш клієнт — власник аккаунта в Telegram насправді міг бути тільки інтернет-журналістом. Тим не менш, перша спроба шантажувати нас виявилася вдалою. Ми вирішили, що інцидент є вичерпаним, однак це виявився тільки початок історії», — говориться у відкритому листі адміністрації Virtualsim.net.

Тут стверджують, що восени 2020 року з ними знову вийшли на контакт правоохоронці, котрі заявили, що в них «довгі руки» та вони встановили справжні особи/місцезнаходження засновників Virtualsim’у. «На питання, яким є процесуальний статус власників веб-сервісу (в історії про підпал будівлі ГСУ НПУ — Ред.) було надано відповідь, що ніякого», — переконують стартапери.

Мовляв, співробітник поліції, з яким вони спілкувалися, чітко усвідомлював: геть усе, що було можливе з боку адміністрації Virtualsim.net для здійснення розслідування гучної історії про пожежу в Головному слідчому управлінні, вже зроблено. А у подальших контактах не має будь-якого сенсу.
Читайте также: Нацполіція викрила канал нелегального переправлення людей до ОРДЛО

Втім, як виявилося, отриманою від веб-сервісу інформацією поліція та кіберполіція скористатися не змогли. Тож вони вирішили за допомогою власників Virtualsim.net здійснити оперативну комбінацію та «піймати на гачок» невловимого орендаря SIM-картки під привідом наявності для нього цікавої/вигідної пропозиції. Адміністрація відмовилася брати участь у цій постановці, після чого їй начебто почали мститися «копи».

Зокрема, 20 листопада 2020 року власники Virtualsim.net отримали чергове повідомлення від поліцейських з натяками на погрози, а надалі до ще одного з операторів інтернет-сервісу до Тернополя завітали працівники Департаменту внутрішньої безпеки НПУ.

«Останніми його словами була фраза: «До мене прийшли з обшуками, передають тобі вітання з Києва. Віддай їм те, що вони вимагають, мені не потрібні проблеми». Наразі нам нічого не відомо про місцезнаходження та стан нашого оператора, на зв’язок він більше не виходив. Після цього раптово перестали працювати орендовані нами в дата-центрі слоти в шлюзах для автоматичних номерів, а компанія, яка надавала ці послуги, перестала відповідати. Скоріше за все, її працівників залякали поліцейські… Як наслідок, велика кількість клієнтів Virtualsim.net залишилася без орендованих SIM-карток, було вилучено значну кількість майна веб-сервісу та фактично припинено його функціонування на території України. Хоча ніякого процесуального статусу по жодній кримінальній справі ми не маємо та не можемо мати, оскільки не порушували будь-які закони. Проте маємо справу з бандитами, що представляють державу; та державою, яка користується послугами бандитів», — стверджують власники Virtualsim.net.

Вони резюмують, що наразі перебувають за межами України, а «копи» буцімто погрожували оголосити їх у міжнародний розшук: «Ми є законослухняними громадянами, але не можемо повернутися на Батьківщину через побоювання за свої життя, здоров’я та свободу. Ймовірність того, що поліцейські бандити з Департаменту внутрішньої безпеки будуть покарані, практично нульова. Ми відмовилися вести перемовини з поліцією, оскільки не хочемо бути такими само бандитами, як і влада».

Источники: antikor.com.ua
detective-info.com.ua

Сервіс з надання віртуальних SIM-карток припинив роботу в Україні: заявляють про переслідування та шантаж з боку поліції

О, продолжение истории с наездом на Virtualsim, украинская пресса заинтересовалась, молодцы какие. Оставляю тут для архива.

Компанія Virtualsim припиняє роботу в Україні. Причиною надавачі віртуальних SIM-карток назвали шантаж та незаконні дії поліції

Про це йдеться в заяві компанії Virtualsim.

В компанії Virtualsim заявили, що в ході розслідування підпалу анархістами кабінету слідчого управління поліції у м Києві в протест через буксування в розслідуванні вбивства застреленого п’яними поліцейськими п’ятирічного Кирила Тлявова та зґвалтування в Кагарлику, силовики вдались до шантажу та нанесли компанії збитки на кілька тисяч доларів.

У Virtualsim розповіли, що вперше зіткнулися зі спробою Департаменту внутрішньої безпеки Нацполіції впливати на сервіс поза правовим полем у липні 2020.

«Один з клієнтів сервісу, на думку поліції, якимось чином був пов’язаний з кримінальною справою про підпал кабінету в Слідчому управлінні м.Києва вночі 10 червня 2020 роки (кримінальну справу ЕРДР No.12020100060002061 від 10 червня 2020 року про умисне знищення чужого майна , ст.194 ч.2). Ідентифікація була проведена за номером телефону, на який був зареєстрований Telegram; номер телефону був придбаний клієнтом на нашому сервісі», — пояснили в компанії.

Підприємці зауважили, що відповідальність за підпал нібито взяли на себе невідомі ліві анархісти, які таким чином висловили протест проти двох гучних історій поліцейського свавілля в Україні — зґвалтування затриманої в Кагарлику і звільнення з під варти поліцейських, які через недбальство застрелили 5-річного хлопчика в процесі п’яної стрілянини по банкам у дворі.

«Ми залишимо такі способи протесту на совісті тих, хто їх практикує. Наскільки нам відомо, поліція намагається знайти паліїв, але, в той же час, не афішувати інцидент з огляду на таких пікантних подробиць мотивації правопорушників», — додали в компанії.

У Virtualsim наголосили, що Печерським судом було видано ухвалу про проведення обшуку за місцем знаходження SIM-карти; таким чином, передбачалося затримати власника аккаунта Telegram.

«SIM карта, насправді, ніколи не перебувала у власника аккаунта, оскільки вона належала сервісу Virtualsim.net і здавалася в оренду. Управлінням SIM-картами займався найнятий сервісом оператор. До нього-то і приїхали близько десяти поліцейських Департаменту внутрішньої безпеки з Києва, подолавши 550 з гаком кілометрів», — прокоментували в сервісі.

Оператор видав поліцейським SIM-карту, якою скористувалися анархісти для повідомлення про підпал.

Водночас в компанії наголосили, що поліція вилучила обладнання — модеми, смартфони, жорсткі диски, ноутбук, а також велику кількість SIM-карт, незважаючи на те, що в рішенні суду йшла мова про зняття копій, а не вилучення техніки.

«Доля даних SIM-карт невідома, і таким чином конфіденційність користувачів сервісу, і, можливо, збереження їх коштів (деякі клієнти користуються сервісом для входу в свої платіжні облікові записи — це ще одна зручна особливість) без будь-якого правової підстави була порушена», — зазначили у Virtualsim.

В компанії наголосили, що поліція схиляла оператора сервісу до незрозумілої «співпраці» з метою «виходу» на власників Virtualsim.net. Також в компанії заявили, що невідомі намагались їм продати вилучену поліцією інформацію з модемів.

Наостанок в компанії заявили, що поліцейські зв’язалися з власниками сервісу безпосередньо і зажадали видачу інформації. Одним з поліцейських нібито був записаний аудіофайл з видозміненим голосом про те, що справу перекваліфікують у «замах на вбивство», і підприємців оголосять співучасниками.

Вдруге, за словами підприємців поліція зв’язалась з бізнесменами через три місяці та, за їх словами, зажадала виманити клієнта. який нібито підозрювався у підпалі слідчого управління. За задумом поліції, у компанії мали написати клієнту листа. Фірма відмовилась.

«Власник сервісу відмовився грати в такі ігри. До того ж, після видалення клієнта, який повинен був зрозуміти, що з ним щось не так, хоча йому було вказано, що проблеми виникли абстрактно по якомусь політичному кримінальній справі, писати йому листа з пропозицією — це не просто некоректно з точки зору політики сервісу, це ще й нерозумно і підозріло, і, до того ж, якщо клієнт користується TOR або VPN, що майже стовідсотково ніякої інформації про нього отримати не вдасться», — прокоментували в комапнії.

Довідка: Інтернет-сервіс Virtualsim.net надає в оренду телефонні номери для реєстрації веб-сервісів з використанням кодів з SMS. Сервіс був заснований в 2015 році в Україні для користувачів інтернету, зацікавлених в конфіденційності, зокрема, для здійснення свого права на свободу слова і недоторканність персональних даних в умовах неправових держав, що може бути корисно громадським активістам, а також для масових реєстрацій в сфері інтернет-маркетингу

Підписуйтеся на наш телеграм-канал Новини Еспресо

Источник: espreso.tv

Скрипты для создания виртуальных пользователей Dovecot. Небольшое улучшение.

По многочисленным просьбам зрителей, добавил в скрипты dcadduser, dcdeluser и dcpasswd переменную DOMAIN, если ее заполнить, т.е. указать там домен:

DOMAIN="example.org"

То к имени пользователя будет автоматически добавляться @ и домен (paulzovatel@example.org, например).