ВАЖНО Miner Search - Поиск и уничтожение скрытых майнеров (1 Viewer)

Пользователи, которые просматривают: тема

Spectrum735

Уважаемый пользователь
Форумчанин
Регистрация
21.02.2019
Сообщения
140
Репутация
64
Дата подписи файла должна-быть раньше истечения сертификата.
В принципе логично)
Я вроде как разобрался, в коде я указал "На время действия не смотри, а смотри кем этот сертификат выдан". Алгоритм считает большинство системных файлов валидными, но не все. Тот же autoruns показывает другую информацию.

Сделал тестовый сертификат, конечно же недействительный, как считает винда. Алгоритм также его считает недействительным, что верно, НО...
1678180631879.png


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

1678180791000.png

1678181422293.png


Не могу понять в чём путаница. Прилагаю код:

Проверка лицензии файла:
        public static byte Verify(string filePath)
        {
            X509Certificate2 theCertificate;

            try
            {
                X509Certificate theSigner = X509Certificate.CreateFromSignedFile(filePath);
                theCertificate = new X509Certificate2(theSigner);
                X509Chain theCertificateChain = new X509Chain();

                theCertificateChain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
                theCertificateChain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
                theCertificateChain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0);
                theCertificateChain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreNotTimeValid;
             
                bool isValid = theCertificateChain.Build(theCertificate);
                if (isValid)
                {
                    return 0;
                }
                else if (!isValid)
                {
                    return 1;
                }
                else return 2;
            }
            catch
            {
                return 2;
            }
        }
 
Последнее редактирование:

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 652
Репутация
7 825
if (isValid)
{
return 0;
}
else if (!isValid)
{
return 1;
}

Можно наверное так сделать:
if (isValid)
{
return 0;
}
return 1;

Т.к. isValid это bool и меет всего два значения (true и false).

По твоему вопросу, как понимаю у тебя оффлайн проверка подписей, можно сделать онлайн и вообще можно распечатать почему подпись не валиданая ?

Вот в сети ещё нашёл такой код:

C#:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

internal class Program
{
    private static void Main(string[] args)
    {
        string filePath = args[0];

        if (!File.Exists(filePath))
        {
            Console.WriteLine("File not found");
            return;
        }

        X509Certificate2 theCertificate;

        try
        {
            X509Certificate theSigner = X509Certificate.CreateFromSignedFile(filePath);
            theCertificate = new X509Certificate2(theSigner);
        }
        catch (Exception ex)
        {
            Console.WriteLine("No digital signature found: " + ex.Message);

            return;
        }

        bool chainIsValid = false;

        /*
         *
         * This section will check that the certificate is from a trusted authority IE
         * not self-signed.
         *
         */

        var theCertificateChain = new X509Chain();

        theCertificateChain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;

        /*
         *
         * Using .Online here means that the validation WILL CALL OUT TO THE INTERNET
         * to check the revocation status of the certificate. Change to .Offline if you
         * don't want that to happen.
         */

        theCertificateChain.ChainPolicy.RevocationMode = X509RevocationMode.Online;

        theCertificateChain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0);

        theCertificateChain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

        chainIsValid = theCertificateChain.Build(theCertificate);

        if (chainIsValid)
        {
            Console.WriteLine("Publisher Information : " + theCertificate.SubjectName.Name);
            Console.WriteLine("Valid From: " + theCertificate.GetEffectiveDateString());
            Console.WriteLine("Valid To: " + theCertificate.GetExpirationDateString());
            Console.WriteLine("Issued By: " + theCertificate.Issuer);
        }
        else
        {
            Console.WriteLine("Chain Not Valid (certificate is self-signed)");
        }
    }
}

Есть ещё такой способ проверки:Example C Program: Verifying the Signature of a PE File - Win32 apps
При помощи WinVerifyTrust function (wintrust.h).

Чем хорош, что в указанном примере можно найти причину, почему подпись не валидна.)
 

Spectrum735

Уважаемый пользователь
Форумчанин
Регистрация
21.02.2019
Сообщения
140
Репутация
64
Нашёл подробное описание про подпись в статье
Благодарю за наводку по WinAPI
 

Spectrum735

Уважаемый пользователь
Форумчанин
Регистрация
21.02.2019
Сообщения
140
Репутация
64
Чем хорош, что в указанном примере можно найти причину, почему подпись не валидна.)
Оказывается, алгоритм выборки SHA-1 не считается безопасным, коим был подписан тот самый файлик. Но так как файл имеет доп. подпись сервера штампа времени, то истечение срока сертификата не учитывается)
 

Spectrum735

Уважаемый пользователь
Форумчанин
Регистрация
21.02.2019
Сообщения
140
Репутация
64
Новая версия v1.3
  • Добавлена проверка цифровой подписи файлов
  • Добавлены дополнительные разделы сканирования реестра (разделы автозапуска, appinit_dlls)
  • Изменён метод ведения логов. Статистика сканирования параллельно записывается в файл в формате MinerSearch_ГГГГ_ММ_дд_мм_сс.log
  • Исправлены незначительные недоработки
 
Верх Низ