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

Парсинг ассемблерного кода

Статус
Закрыто для дальнейших ответов.

weaver

31 c0 bb ea 1b e6 77 66 b8 88 13 50 ff d3
Забанен
Регистрация
19.12.2018
Сообщения
3 301
Решения
11
Реакции
4 622
Депозит
0.0001
Пожалуйста, обратите внимание, что пользователь заблокирован
Смотрел тут разные исходники вирусов и разные старые вирусные технологии. Собственно вопрос, есть ли какой-то простой\готовый способ парсинга ассемблерного кода? В большинстве старых вирусов используются дизассемблеры длин для дизассемблерования собственного кода для мутации кода. Способ с дизассемблером мне не особо подходит, так как на руках всегда есть исходник. Есть ли какой другой способ парсинга асм кода? Может какой-нибудь костыль...


Так же есть еще пару вопросов, просто для общего ознакомления

1. Вот обычно пайлоад зашифрован и он расшифровывается в памяти.
Раньше была такая фича в старых вирусах, делали тоже самое, вот только шифровали пайлоад случайным ключом, а сам ключ брутили. И получалось следующее, до шифрованного кода нельзя было добраться кроме как перебором. И таким образом авер не мог просмотреть и узнать что же там зашифровано и какой код выполнится. Такой подход актуален в нынешних реалиях ? Если нет, то почему?


2. Вот к примеру код упакован UPX'ом, при перестановке и замене кода (пермутация) сигнатура упаковщика меняется и авер не может распаковать файл. Такой подход актуален в нынешних реалиях ? Если нет, то почему?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Если другие способы не помогают или помогают слабо, то используется всегда динамический анализ выполнения с пошаговым контролем регистров и памяти в совокупности с дизассемблированием, дампами памяти на каждом шагу, итд. Хотя все это и так всегда производится, независимо от степени успешности других способов и одновременно с ними. И так шаг за шагом.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну ассемблер парсить довольно просто, так как там нет рекурсии в структуре кода, тут можно и без какого-то специального парсера обойтись. Разбил по строкам, сделал trim/strip, если строка заканчивается двоеточием, то это - метка, если нет, то это команда, считал символы из команды до первого пробела - эта сама команда, остаток разбил по запятым - это аргументы. Если просто надо какие-то команды находить и заменять их, или вставлять до или после них, то можно и регулярными выражениями это сделать.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Если другие способы не помогают или помогают слабо, то используется всегда динамический анализ выполнения с пошаговым контролем регистров и памяти в совокупности с дизассемблированием, дампами памяти на каждом шагу, итд. Хотя все это и так всегда производится, независимо от степени успешности других способов и одновременно с ними. И так шаг за шагом.
Ты бот чтоли ? Как использовать динамический анализ если файл не исполняемый, и там текст программы. Тут статика нужна.

Ну ассемблер парсить довольно просто, так как там нет рекурсии в структуре кода, тут можно и без какого-то специального парсера обойтись. Разбил по строкам, сделал trim/strip, если строка заканчивается двоеточием, то это - метка, если нет, то это команда, считал символы из команды до первого пробела - эта сама команда, остаток разбил по запятым - это аргументы. Если просто надо какие-то команды находить и заменять их, или вставлять до или после них, то можно и регулярными выражениями это сделать.
В принципи я так и предполагал, что придется написать небольшой парсер самому. Разбирать всё на операции, команды и операнды.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ты бот чтоли ? Как использовать динамический анализ если файл не исполняемый, и там текст программы. Тут статика нужна.
Если сам по себе неисполняемый, то да, только статика, но это если исследовать непосредственного его. Но в данном случае я имел ввиду другое. Ведь тело вируса в конечном счете наверняка куда-то инжектится и впоследствии как вы сами написали расшифровывается и затем разумеется исполняется в рамках другого кода, и без полноценного исследования в динамике(в дополнении к статике) тут не обойтись. То есть смоделировать ситуацию с подгрузкой в память, исполнением в изолированной среде. Речь об этом. А вы сразу минусы.
 
Есть ли какой другой способ парсинга асм кода? Может какой-нибудь костыль...
Не совсем понял, а какая цель? Зачем асм код парсить?
В большинстве старых вирусов используются дизассемблеры длин для дизассемблерования собственного кода для мутации кода.
Мутирование кода в процессе исполнения, или как? RWX получается
шифрованного кода нельзя было добраться кроме как перебором.
В каком то роде актуально, против некоторых эмуляторов

Но потом тебе въебут сигнатуру на код перебора, шифрования

авер не мог просмотреть и узнать что же там зашифровано и какой код выполнится.
Дождется NtCreateThread \ VirtualAlloc \ VirtualProtect + RWX, просканит и дальше уже решит вешать ли сигнатуру
 
Вот к примеру код упакован UPX'ом, при перестановке и замене кода (пермутация) сигнатура упаковщика меняется и авер не может распаковать файл. Такой подход актуален в нынешних реалиях ? Если нет, то почему?
Сигнатуру UPX убрать может ты и сможешь, но в контексте других аверов - твой файл все равно не будет нравится из за его аномалий: 2 секции и рвх

На статике может быть проканает, но в динамике уже могут быть детекты, как я написал выше
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Если сам по себе неисполняемый, то да, только статика, но это если исследовать непосредственного его. Но в данном случае я имел ввиду другое. Ведь тело вируса в конечном счете наверняка куда-то инжектится и впоследствии как вы сами написали расшифровывается и затем разумеется исполняется в рамках другого кода, и без полноценного исследования в динамике(в дополнении к статике) тут не обойтись. То есть смоделировать ситуацию с подгрузкой в память, исполнением в изолированной среде. Речь об этом. А вы сразу минусы.
Ну вы хотя бы пояснили по какому вопросу. На повестке дня парсинг асм кода. А вторые два, так для ознакомления. У вас там не слова о чем речь... минус убрал

Мутирование кода в процессе исполнения, или как? RWX получается
Зависит от реализации. Да в процессе. Инфектор, а тело мутирует. Как у вас всё сложно у малварщиком... В эксплойтах, если RWX это победа.
Не совсем понял, а какая цель? Зачем асм код парсить?
Да есть у меня там одна задумка... И суть скорее не для чего. А как ? =)

Но потом тебе въебут сигнатуру на код перебора, шифрования
Там новая сигнатура каждый раз. Код брутфорсера тоже меняется.
Дождется NtCreateThread \ VirtualAlloc \ VirtualProtect + RWX, просканит и дальше уже решит вешать ли сигнатуру
Как это будет на практике я не знаю... Я не малварщик поэтому и спросил. Чисто из-за интереса. Перебор может быть и месяц. Смотря каким ключом зашифровать.
 
Последнее редактирование:
Перебор может быть и месяц. Смотря каким ключом зашифровать.
Ну может тогда детект и не поставят, в целом это анализировать впадлу комуто будет
Аверы они такие - вечно с биполяркой
 
Да есть у меня там одна задумка... И суть скорее не для чего. А как ? =)
Бинарник можно дизассемблировать в асм, но хз что там будет с метками
А на счет сурсов - товарищ модератор уже ответил
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А на счет сурсов - товарищ модератор уже ответил
Да я уже сделал, как дилдо сказал.... Разбил на 5 токенов.
label = None # метка
command = None # комманда
operand_1 = None # операнд1
operand_2 = None # операнд2
comment = None # комментарий
строка вида
test_label: lea ebx, [esp] ; Load effective address of ESP into EBX
парсится так.
Label: test_label
Operation: lea
Argument 1: ebx
Argument 2: [esp]
Comment: Load effective address of ESP into EBX
ну итд
 
ключ ксора в один символ аверы умеют брутить. надо хотя бы на каждой итерации прибавлять к ключу индекс. вроде помогает. но лично я предпочитаю сложный ключ, который нельзя сбрутить, плюс нормальный антиэмулятор.

второе не пробовал (почему именно упых?). если правильно понял, ты хочешь пожать упыхом полезную нагрузку и вырезать заголовок, который указывает на использование упыха и на структуру данных. имхо то что там лежит PE все равно будет понятно аверу, поэтому нужно ещё как-то зашифровать тельце.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
второе не пробовал (почему именно упых?). если правильно понял, ты хочешь пожать упыхом полезную нагрузку и вырезать заголовок, который указывает на использование упыха и на структуру данных. имхо то что там лежит PE все равно будет понятно аверу, поэтому нужно ещё как-то зашифровать тельце.
Упых просто как пример. Я же ничего не хочу. Просто было интересно услышать мнение по поводу старых приёмчиков. Не совсем так... Вырезать ничего не надо. Просто сигнатура самого упыха меняется, из-за мутации кода. Поэтому для авера это будет неизвестный упаковщик и он скорее всего не сможет распаковать, если в обще поймет что это упаковщик.
 
fasm написан на fasm`е и распространяется вместе с исходниками
можешь посмотреть как там реализован парсер и подогнать под свои цели
 
Ну ассемблер парсить довольно просто, так как там нет рекурсии в структуре кода, тут можно и без какого-то специального парсера обойтись.
58.jpg


I'll add a little footnote for noobs coming new to this. Bilbo's talking about the grammar structure of assembly (syntactic). At the exec/semantic level, you can absolutely set up args on the stack/registers, then call the same subroutine again.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
fasm написан на fasm`е и распространяется вместе с исходниками
можешь посмотреть как там реализован парсер и подогнать под свои цели
Да уже всё сделал как хотел. Я же выше там отписал....
 
Статус
Закрыто для дальнейших ответов.
Верх