Miner Search

Обсуждение Miner Search v1.4.7.0

Нет прав для скачивания

BlendLog

Разработчик
Сообщения
105
Реакции
59
  • Первое сообщение
  • #1
Программа разработанная для поиска и уничтожения скрытых майнеров. Является вспомогательным инструментом для поиска подозрительных файлов, каталогов, процессов и тд. и НЕ является антивирусом.

Ссылка на скачивание → Github MinerSearch

Основан на Miner Killer.
  • Улучшен процесс сканирования процессов;
  • Добавлено статическое сканирование каталогов;
  • Добавлена функция автоматической очистки от вредоносных каталогов;
  • Уничтожение вредоносных процессов (в том числе помеченные как критические)
  • Сканирование вредоносных ключей реестра...
Версия v1.3
  • Добавлена проверка цифровой подписи файлов
  • Добавлены дополнительные разделы сканирования реестра (разделы автозапуска, appinit_dlls)
  • Изменён метод ведения логов. Статистика сканирования параллельно записывается в файл в формате MinerSearch_ГГГГММддммсс.log
  • Исправлены незначительные недоработки
Для запуска требуется NET Framework 4.5 и выше.

215475650-25d31515-d52a-485b-b194-7db63e0e9962.png
215356942-8080b05a-f324-4006-9864-6843923ff2be.png
 
Последнее редактирование модератором:
Для наглядности посмотри на разделитель дробной части в этом сообщении Помощник по изучению англ. языка.
Там где написано по русски и где он перевёл по англ. Собственно как понимаю, там точка используется из-за этого, что автор исходного "Miner Killer" был англоязычным.
в C# дробная часть обозначается точкой
 
В C# это не принципиально до тех пор пока в программе не используются преобразования вроде "текст->число".
 
Хотел сделать установку владельца и удаления прав без cmd, но как бы я не старался, получаю ошибку UnauthorizedAccessException. Прога запущена от админа, в манифесте прописано highestAvailable. Через запуск cmd, takeown, icacls всё работает
 
C#:
            DirectoryInfo directoryInfo = new DirectoryInfo(dir);
            DirectorySecurity directorySecurity = new DirectorySecurity();
            directorySecurity.SetOwner(System.Security.Principal.WindowsIdentity.GetCurrent().User);
            directoryInfo.SetAccessControl(directorySecurity);
            AuthorizationRuleCollection acl = directorySecurity.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier));
            foreach (FileSystemAccessRule ace in acl)
            {
                if (ace.AccessControlType == AccessControlType.Deny)
                {
                    directorySecurity.RemoveAccessRule(ace);
                    Console.WriteLine($"[+] Directory has been unlocked\"{dir}\"");
                }
            }
            directoryInfo.SetAccessControl(directorySecurity);
            Directory.Delete(dir, true);
 
Могут быть как минимум 2 причины, почему это не работает:
1) Не получены привилегии, для этой операции требуются SeSecurityPrivilege и SeTakeOwnershipPrivilege (уж не знаю, есть ли у dot.net управляемый код для их установки).
2) У папки стоит запрет на чтение/изменение прав от имени текущего пользователя. Для обхода этой проблемы, перед изменением ACL следует заменить владельца объекта на себя, либо на локальную группу Администраторов.

Вообще, думаю, такая задачка самое то для нашего нового бота ChatGPT на форуме, ибо прямо сейчас мне лень писать код :) а этот бот зря бездельничает. Непорядок ) Можете ради интереса опробовать.
 
Не получены привилегии, для этой операции требуются SeSecurityPrivilege и SeTakeOwnershipPrivilege
вот кстати может быть. Спрашивал gpt, он ничего не говорит про это)

Запрет на чтение запись точно стоит, майнер ставит. Cmd это обходит спокойно
 
Да, сори, не заметил, SetOwner у вас уже есть.
Тут ещё момент, что даже если успешно замените Deny ACE на Allow, то этого может не хватить (конкретный майнер я не анализировал, если есть семпл, я бы кстати, не против бы посмотреть).
Но если будет ситуация, что в ACL вообще нет нужных разрешений (например, есть записи только для пользователя SYSTEM), то приведенного выше кода не хватит, нужно ещё и добавлять дополнительные записи ACE, так сказать дефолтовые (как минимум, для группы Администраторов).
Надо думать / гуглить по WinAPI
На WinAPI у меня есть код, но я бы не советовал это делать неуправляемым кодом, ибо там очень трудоемко будет переписывать полностью, дофига вызовов.
А вот на счёт чисто выставления привилегий, то вполне можно. Вот за пару минут уже и получил ответ (вам только нужно будет заменить название привилегии на те, что я выше написал).
Но если пока и так работает, то как говорится "работает - не трожь" :)
Единственное, что могут быть проблемы, когда у юзера поломаны эти самые консольные утилиты, или связанные с ними dll.
 
Последнее редактирование:
Всем привет!
Пытаюсь допилить проверку цифровой подписи. Добавил проверку через каталог безопасности, но получаю ошибку о попытке доступа в защищенную память. Не пойму в чём косяк.


классс WinTrustData до изменений (только внутренная подпись):
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    class WinTrustData
    {
        UInt32 StructSize = (UInt32)Marshal.SizeOf(typeof(WinTrustData));
        IntPtr PolicyCallbackData = IntPtr.Zero;
        IntPtr SIPClientData = IntPtr.Zero;
        // required: UI choice
        WinTrustDataUIChoice UIChoice = WinTrustDataUIChoice.None;
        // required: certificate revocation check options
        WinTrustDataRevocationChecks RevocationChecks = WinTrustDataRevocationChecks.None;
        // required: which structure is being passed in?
        WinTrustDataChoice UnionChoice = WinTrustDataChoice.File;
        // individual file
        IntPtr FileInfoPtr;
        WinTrustDataStateAction StateAction = WinTrustDataStateAction.Ignore;
        IntPtr StateData = IntPtr.Zero;
        String URLReference = null;
        WinTrustDataProvFlags ProvFlags = WinTrustDataProvFlags.RevocationCheckChainExcludeRoot;
        WinTrustDataUIContext UIContext = WinTrustDataUIContext.Execute;

        // constructor for silent WinTrustDataChoice.File check
        public WinTrustData(WinTrustFileInfo _fileInfo)
        {
            // On Win7SP1+, don't allow MD2 or MD4 signatures
            if ((Environment.OSVersion.Version.Major > 6) ||
                ((Environment.OSVersion.Version.Major == 6) && (Environment.OSVersion.Version.Minor > 1)) ||
                ((Environment.OSVersion.Version.Major == 6) && (Environment.OSVersion.Version.Minor == 1) && !String.IsNullOrEmpty(Environment.OSVersion.ServicePack)))
            {
                ProvFlags |= WinTrustDataProvFlags.DisableMD2andMD4;
            }

            WinTrustFileInfo wtfiData = _fileInfo;
            FileInfoPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(WinTrustFileInfo)));
            Marshal.StructureToPtr(wtfiData, FileInfoPtr, false);
        }

        public void Dispose()
        {
            if (FileInfoPtr != IntPtr.Zero)
            {
                Marshal.FreeCoTaskMem(FileInfoPtr);
                FileInfoPtr = IntPtr.Zero;
            }
        }
    }

классс WinTrustData с проверкой через каталог:
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    class WinTrustData : IDisposable
    {
        UInt32 StructSize = (UInt32)Marshal.SizeOf(typeof(WinTrustData));
        IntPtr PolicyCallbackData = IntPtr.Zero;
        IntPtr SIPClientData = IntPtr.Zero;
        // required: UI choice
        WinTrustDataUIChoice UIChoice = WinTrustDataUIChoice.None;
        // required: certificate revocation check options
        WinTrustDataRevocationChecks RevocationChecks = WinTrustDataRevocationChecks.None;
        // required: which structure is being passed in?
        WinTrustDataChoice UnionChoice = WinTrustDataChoice.File;
        // individual file
        IntPtr FileInfoPtr;
        // catalog information
        IntPtr CatalogInfoPtr = IntPtr.Zero;
        WinTrustDataStateAction StateAction = WinTrustDataStateAction.Ignore;
        IntPtr StateData = IntPtr.Zero;
        String URLReference = null;
        WinTrustDataProvFlags ProvFlags = WinTrustDataProvFlags.RevocationCheckChainExcludeRoot;
        WinTrustDataUIContext UIContext = WinTrustDataUIContext.Execute;



        //constructor for silent WinTrustDataChoice.File check
        public WinTrustData(WinTrustFileInfo _fileInfo)
        {
            // On Win7SP1+, don't allow MD2 or MD4 signatures
            if ((Environment.OSVersion.Version.Major > 6) ||
                ((Environment.OSVersion.Version.Major == 6) && (Environment.OSVersion.Version.Minor > 1)) ||
                ((Environment.OSVersion.Version.Major == 6) && (Environment.OSVersion.Version.Minor == 1) && !String.IsNullOrEmpty(Environment.OSVersion.ServicePack)))
            {
                ProvFlags |= WinTrustDataProvFlags.DisableMD2andMD4;
            }

            WinTrustFileInfo wtfiData = _fileInfo;
            FileInfoPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(WinTrustFileInfo)));
            Marshal.StructureToPtr(wtfiData, FileInfoPtr, false);
        }

        // constructor for silent WinTrustDataChoice.Catalog check
        public WinTrustData(WinTrustCatalogInfo _catalogInfo)
        {
            // On Win7SP1+, don't allow MD2 or MD4 signatures
            if ((Environment.OSVersion.Version.Major > 6) ||
                ((Environment.OSVersion.Version.Major == 6) && (Environment.OSVersion.Version.Minor > 1)) ||
                ((Environment.OSVersion.Version.Major == 6) && (Environment.OSVersion.Version.Minor == 1) && !String.IsNullOrEmpty(Environment.OSVersion.ServicePack)))
            {
                ProvFlags |= WinTrustDataProvFlags.DisableMD2andMD4;
            }

            WinTrustCatalogInfo wtciData = _catalogInfo;
            CatalogInfoPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(WinTrustCatalogInfo)));
            Marshal.StructureToPtr(wtciData, CatalogInfoPtr, false);
        }

        public void Dispose()
        {
            if (FileInfoPtr != IntPtr.Zero)
            {
                if (UnionChoice == WinTrustDataChoice.File)
                {
                    WinTrustFileInfo fileInfo = (WinTrustFileInfo)Marshal.PtrToStructure(FileInfoPtr, typeof(WinTrustFileInfo));
                    fileInfo.Dispose();
                }
                else if (UnionChoice == WinTrustDataChoice.Catalog)
                {
                    WinTrustCatalogInfo catalog = (WinTrustCatalogInfo)Marshal.PtrToStructure(FileInfoPtr, typeof(WinTrustCatalogInfo));
                    catalog.Dispose();
                }

                Marshal.FreeCoTaskMem(FileInfoPtr);
                FileInfoPtr = IntPtr.Zero;
            }
        }
    }


Проверку через каталог делаю так:
C#:
            try
            {
                WinTrustCatalogInfo trustCatalogInfo = new WinTrustCatalogInfo(fileName);
                WinTrustData data = new WinTrustData(trustCatalogInfo);
                Guid guidAction = new Guid(WINTRUST_ACTION_GENERIC_VERIFY_V2);
                WinVerifyTrustResult result = WinVerifyTrust(IntPtr.Zero, guidAction, data); //Тут выбивает ошибку
                trustCatalogInfo.Dispose();
                data.Dispose();
                return result;
            }
            catch (Exception ex)
            {
                Logger.WriteLog($"\t[x] Error verify signature: {ex.Message}", Logger.error);
                return WinVerifyTrustResult.Error;
            }
 
Пока, что нет времени помочь. Пришлите в архиве целиком проект, позже гляну.
 
Посмотрел. Это вообще не сможет работать. Откуда взяли такие объявления? Там вообще половина неправильно, даже некоторых API-функций таких нету в природе. И структуры заполняются не так.
Потратил пару часов, чтобы привести хоть в какой-то логический вид, где оно должно завестись. Но уже вышел за лимит. Оставлю на вас. Там осталось пару функций объявить, починить по мелочи утечки, например CloseHandle, и дважды перепроверить объявления WinAPI-функций, ибо там с типами были явно путаницы.
Также обратите внимание, что я заюзал AllocHGlobal, для которой пара FreeHGlobal, тогда как вы в основном юзаете AllocCoTaskMem, для которой своя пара для освобождения. Разница не большая, но я предпочитаю AllocHGlobal, т.к. она выделяет ровно столько памяти, сколько ей указали, а AllocCoTaskMem может отдать больше.
Ещё не совсем понял смысл в RevocationCheckChainExcludeRoot. Отзыв, его обычно либо проверяют полностью у всей цепочки, или не проверяют вообще. Во втором случае доступ к интернету не потребуется, и от этого работать будет быстрее, но для этого ещё потребуется флаг WTD_CACHE_ONLY_URL_RETRIEVAL.
 

Вложения

  • verify.zip
    3.7 KB · Просмотры: 3
Посмотрел. Это вообще не сможет работать. Откуда взяли такие объявления? Там вообще половина неправильно, даже некоторых API-функций таких нету в природе. И структуры заполняются не так.
Это я пытался через chat gpt что-то выудить рабочее. Спасибо за потраченное время!
 
Последнее редактирование:
@Dragokas, Возникли некоторые вопросы
1) Пару недостающих функций объявил. При проверке получаю на выходе ошибку 0x80092003 или crypt_e_file_error (тестирую на cmd.exe)
2) Почему используется DRIVER_ACTION_VERIFY, если драйвера мне проверять не нужно? Если указать WINTRUST_ACTION_GENERIC_VERIFY_V2, то вместо crypt_e_file_error получаю FileisNotSigned
3) Что такое файловый редиректор? Зачем его отключать и надо ли вообще, если у меня 64-битная сборка?
 
1) позже посмотрю
2) это мне неизвестно, но для получения контекста каталога используют именно её, а для WinVerifyTrust (если это не драйвер), можно юзать и WINTRUST_ACTION_GENERIC_VERIFY_V2, это проверял экспериментальным путём на всех файлах системы
3)
В контексте работы с файлами, это механизм при котором ОС для 32-битных приложений автоматически переадресовывает все запросы от путей, пролегающих через C:\windows\System32 на C:\windows\SysWow64.
Её отключают, чтобы можно было получить доступ к файлам в C:\windows\System32
Для 64-битной сборки это не имеет смысла. Там редиректор не задействуется.
Есть еще редиректор в реестре, там всё работает по похожему принципу.
 
Назад
Сверху Снизу