• XSS.stack #1 – первый литературный журнал от юзеров форума

Lux Veritatis - анализируем Ваш семпл в белый или malware файл! Используя модель SOREL20m (обучали на 8ТБ данных)

salsa20

(L2) cache
Пользователь
Регистрация
03.05.2019
Сообщения
498
Реакции
110
Гарант сделки
1
Коротко- код позволит определить, что ваш файл не является малварью судя по оценкам модели https://github.com/sophos/SOREL-20M

Берём белые файлы из C:\\Windows

1711971830118.png


Это все для 32bit (x86)

Проверяем
1711971848017.png


Берём грязные файлы
1711971891549.png


По хешу можете найти их на вирустотале
1711971933587.png


Чтобы это всё заработало вам нужен Python 3.6
Для него нужно пакеты ember, lightgbm ну и сама модель.

Модель можно скачать через aws cli

Код:
aws s3 cp s3://sorel-20m/09-DEC-2020/baselines/checkpoints/lightGBM/ . --recursive --no-sign-request

Грязные файлы для теста, да и для реверса
Код:
aws s3 cp s3://sorel-20m/09-DEC-2020/binaries/ . --no-sign-request --recursive
По .mmdb файлам (если вы проверил репозиторий на github можно думаю найти теги по хешам и реверсить лоадеры сколько душе угодно)
Не медли - может отреверсишь лучший лоадер за всё время.

Я лично ставил на conda + Pycharm. Версия питона 3.6 - не забывай.

Python:
import lightgbm as lgb
import numpy as np
from ember.ember import PEFeatureExtractor
import os
from colorama import Fore, Style

def read_file_to_bytes(file_path):
    try:
        with open(file_path, 'rb') as file:
            return file.read()
    except FileNotFoundError:
        print(f"{Fore.RED}File '{file_path}' not found.{Style.RESET_ALL}")
    except Exception as e:
        print(f"{Fore.RED}An error occurred: {e}{Style.RESET_ALL}")

def analyze_file(file_path, model):
    # Extract features from the file using the EMBER feature extractor
    extractor = PEFeatureExtractor()
    features = extractor.feature_vector(read_file_to_bytes(file_path))

    # Reshape the features into a 2D array
    features = np.array(features).reshape(1, -1)

    # Make predictions using the loaded model
    predictions = model.predict(features)

    # Get the predicted probability of malware
    malware_probability = predictions[0]

    return malware_probability

def analyze_files_in_folder(folder_path, model):
    # List all files in the folder
    files = os.listdir(folder_path)

    for file_name in files:
        file_path = os.path.join(folder_path, file_name)

        # Analyze each file in the folder
        malware_probability = analyze_file(file_path, model)

        # Print the result with coloring
        if malware_probability >= 0.5:
            print(f"{Fore.RED}The file '{file_path}' is likely malware with a probability of {malware_probability:.2f}{Style.RESET_ALL}")
        else:
            print(f"{Fore.GREEN}The file '{file_path}' is likely benign with a probability of {1 - malware_probability:.2f}{Style.RESET_ALL}")

def main():
    # Specify the path to the pre-trained lightGBM model
    model_path = r"E:\sorel\seed0\lightgbm.model"

    # Load the pre-trained lightGBM model
    model = lgb.Booster(model_file=model_path)

    # Specify the path to the folder containing files for analysis
    folder_path = r"C:\work\t\tt"

    # Analyze files in the folder
    analyze_files_in_folder(folder_path, model)

if __name__ == '__main__':
    main()

Вот собственно и всё)
 
чем данный подход лучше запуска семпла на стенде с нужным ав?
Твой криптор сделал 100 стабов, на стабах сделал по 100 криптов с зерном (seed) -> Прогнал через нейронку получил годные сиды и стабы, если еще нужен слой стенда -> закинул в него.
 
Твой криптор сделал 100 стабов, на стабах сделал по 100 криптов с зерном (seed) -> Прогнал через нейронку получил годные сиды и стабы, если еще нужен слой стенда -> закинул в него.
для масс малвари стаб проганяется на стендах с актуальными версиями всех ав, нет универсально движка обойдя который можно гарантировать FUD откуда уверенность что твоя модель универсальная для всех ав движков? Можно конечно найди кореляцию между твоей моделью и каким то из реальным движком и сократить время на чек, но сколько на это уйдёт время, как держать модель в актуальном состоянии?
 
для масс малвари стаб проганяется на стендах с актуальными версиями всех ав, нет универсально движка обойдя который можно гарантировать FUD откуда уверенность что твоя модель универсальная для всех ав движков? Можно конечно найди кореляцию между твоей моделью и каким то из реальным движком и сократить время на чек, но сколько на это уйдёт время, как держать модель в актуальном состоянии?
ответь почему она моя
 
ответь почему она моя
вроде как ты притащил это сюда? Это выглядит как хоумпроект стремящегося стать дятлом у петухаверов, набить себе пару балов хайповов темой AI перед смазливой HRовкой.
 
вроде как ты притащил это сюда? Это выглядит как хоумпроект стремящегося стать дятлом у петухаверов, набить себе пару балов хайповов темой AI перед смазливой HRовкой.
а кто HR из твоих слов?
 
В моём тех. процессе пригодилась данная модель
Семплики делаю вот так

C++:
#include <windows.h>
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
#include <tlhelp32.h>

using namespace std;
using namespace chrono;

// Abstract base class for command execution strategy
class CommandExecutor {
public:
    virtual bool execute(const wstring& command) = 0;
    virtual ~CommandExecutor() {}
};

class SubprocessExecutor : public CommandExecutor {
private:
    int timeout;

public:
    SubprocessExecutor(int timeout = 5) : timeout(timeout) {}

    bool execute(const wstring& command) override {
        STARTUPINFOW si;
        PROCESS_INFORMATION pi;
        ZeroMemory(&si, sizeof(si));
        si.cb = sizeof(si);
        ZeroMemory(&pi, sizeof(pi));

        if (!CreateProcessW(NULL, const_cast<LPWSTR>(command.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
            cerr << "Failed to create process. Error code: " << GetLastError() << endl;
            return false;
        }

        auto start_time = steady_clock::now();
        while (WaitForSingleObject(pi.hProcess, 1000) == WAIT_TIMEOUT) {
            auto current_time = steady_clock::now();
            auto elapsed_time = duration_cast<seconds>(current_time - start_time).count();
            if (elapsed_time > timeout) {
                cout << "Process is taking too long. Terminating it." << endl;
                TerminateProcess(pi.hProcess, 0);
                // Terminate crypter.exe process if it's still running
                PROCESSENTRY32 entry;
                entry.dwSize = sizeof(PROCESSENTRY32);
                HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
                if (Process32First(snapshot, &entry)) {
                    do {
                        if (wcscmp(entry.szExeFile, L"crypter.exe") == 0) {
                            cout << "Terminating crypter.exe process" << endl;
                            HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, entry.th32ProcessID);
                            TerminateProcess(hProcess, 0);
                            CloseHandle(hProcess);
                        }
                    } while (Process32Next(snapshot, &entry));
                }
                CloseHandle(snapshot);
                CloseHandle(pi.hProcess);
                CloseHandle(pi.hThread);
                return false;
            }
        }

        DWORD exitCode;
        GetExitCodeProcess(pi.hProcess, &exitCode);
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);

        if (exitCode == 0) {
            cout << "Command executed successfully" << endl;
            return true;
        }
        else {
            cerr << "Command execution failed with exit code: " << exitCode << endl;
            return false;
        }
    }
};

// Facade class for simplifying the usage of CommandExecutor
class CommandRunner {
private:
    CommandExecutor* executor;

public:
    CommandRunner(CommandExecutor* executor) : executor(executor) {}

    void run_command_multiple_times(const wstring& command, int n) {
        for (int i = 0; i < n; i++) {
            if (executor->execute(command)) {
                cout << "Proceeding with the next attempt." << endl;
            }
            else {
                cout << "Proceeding with the next attempt." << endl;
            }
        }
        cout << "Failed to execute the command." << endl;
    }
};

int main() {
    wstring crypter_path = LR"(crypter.exe)";
    wstring input_file = LR"(LummaC2.exe)";
    wstring output_file = LR"(\tt\lumma.exe)";
    wstring config_file = LR"(stub.ini)";
    int N = 5000; // Number of repetitions

    wstring command = L"\"" + crypter_path + L"\" -in \"" + input_file + L"\" -out \"" + output_file + L"\" -cfg \"" + config_file + L"\"";

    SubprocessExecutor executor;
    CommandRunner runner(&executor);
    runner.run_command_multiple_times(command, N);

    return 0;
}
 
Добавить сюда сплиттинг бинарников и можно будет вычислять RVA до "вредоносных" байт :D
Вычислять ничего не нужно, просто переделать модель нужно, чутка отредактировав ember+lief на оффсеты.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх