Miner Search

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

Для наглядности посмотри на разделитель дробной части в этом сообщении Помощник по изучению англ. языка.
Там где написано по русски и где он перевёл по англ. Собственно как понимаю, там точка используется из-за этого, что автор исходного "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.
 
Последнее редактирование:
Всем привет!
Пытаюсь допилить проверку цифровой подписи. Добавил проверку через каталог безопасности, но получаю ошибку о попытке доступа в защищенную память. Не пойму в чём косяк.


[CODE lang="csharp" title="классс 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;
}
}
}[/CODE]

[CODE lang="csharp" title="классс 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;
}
}
}[/CODE]


Проверку через каталог делаю так:
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.
 

Вложения

Посмотрел. Это вообще не сможет работать. Откуда взяли такие объявления? Там вообще половина неправильно, даже некоторых 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-битной сборки это не имеет смысла. Там редиректор не задействуется.
Есть еще редиректор в реестре, там всё работает по похожему принципу.
 
На той неделе посмотрю, пока завал на работе.
 
Назад
Сверху Снизу