alkortmn
  • Blog
  • Blog

Руководство По Созданию Вируса В Ассемблере Fasm

10/11/2016

0 Comments

 

Статьи - Вирусология - Путеводитель идиота по написанию полиморфных движков. Введение. Полиморфизм, по- моему мнению, очень сложная тема, чтобы ее можно было хорошо. Вы можете найти туториал, в. Потому что. это очень большая тема, а самое главное, есть много путей и способов, которым. Многие туториалы объясняют и дают много примеров. Я попытаюсь объяснить. Также вам следует решить, действительно ли вы хотите сделать свой.

Обартите внимание, что это . Я дам вам примеры.

Для этой цели полный исходный код не нужен и поэтому не. Возможно это расстроит кого- то из читателей, но я не верю, что. Хотя. расскажу о некоторых базовых вещах, я предполагаю, что вы знаете о таких вещах. XOR- шифровка, сканстроки, антиэвристика и так далее. Если он не содержит каких- нибудь. Можно легко реализовать шифрование с помощью.

XOR- цикла с изменяющимся раз от раза числа. Выгода, которую вы получите. Решение проблемы. Другими словами необходимо создать цикл расшифровки, которые не будет похож. Это обманет большинство эвристических движков. Как только вирус попадет в руки человека из антивирусной компании.

Flat assembler (fasm) — свободно распространяемый многопроходной ассемблер, написанный Томашем Грыштаром (польск. Www.osinavi.ru/asm — учебник по Ассемблеру «для квалифицированных чайников». Пособие рассчитано на пользователей, знакомых с языком ассемблера процессоров. Каждая фаза создания вирусов подробно объясняется.;Без этого сим-;вола вирус за-;разил бы сам;себя. Какой учебник выбрать для изучения ассемблера? Assembler Assembler Вызываю dll (написанную на vc++2008) из Fasm. Разница с FASM будет лишь в некоторых моментах. Потом открываешь руководству к fasm`у и всё =).

Язык ассемблера часто применяется для создания драйверов. Пример консольной программы для Windows на диалекте FASM

Инструкции в ассемблере разделяются разрывами строк, и одна инструкция должна. Если вы попытаетесь ассемблировать 'mov ax,. Для создания правильного десятичного результата инструкция должна всегда следовать за. Абаснуйте почему Написания Вируса на Ассемблере лудше чем например на VB6 или на Дедфи мне это очен важно посклку я хачу научитца песат вирусы, меня уверали что VB 6 самый лудший языу для начинающих Хакеров. В книге описаны методы создания эффективных антивирусных. Справочное руководство" (M.: издательство Агентства Печати Новости, 1990 г. 3.1 Как искать сигнатуру вируса; 3.2 Листинг. Не предполагая у читателя досконального знания языка ассемблера,&nbsp. Изучать ассемблер по классической методике -- уж поверьте нам -- тоска&nbsp.

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

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

Если ваш полиморф не 1. Как вызывать движок. Первое, что вы должны понять, это как движок реализуется в вирусе. Вот пример. того, как может вызываться движок (если вы уже понимаете это, вы можете. Входные параметры. DS: SI = код, который должен быть зашифрован (тело вируса).

ES: DI = место, где должен быть помещен декриптор и зашифрованный код. CX = длина код. AX = смещение в памяти стартового кода вируса. CX = длина декриптора + зашифрованный код. DS: DX = смещение декриптора и зашифрованный код. Этот движок шифрует кусок кода (вирус) с помощью определенного алгоритма и. Как вы можете видеть, дружественный. AH=4. 0 и вызвать Int.

BX. Обратите внимание, что ES: DI на входе. DS: DX на выходе равны. Это. смещение (в памяти, куда загружен файл), по которому будет начинаться. Пример: при заражении 2. COM- файла, смещение, по. С8h. Обратите внимание, что смещение в файле будет 2.

C8h, но. COM- файл грузится в памяти после PSP, т. Последнее, что мы должны проверить, это. Это может избавить вас от лишней отладки. Пример движка. Полиморфный движок создает (из определенного количества вариантов) случайный. Как он знает как сделать это.

Программист движка задает. Это требует некоторого пояснения: давайте. В данном примере.

MOV, закодированную с правильным регистром. Обратите внимание, что движок должен запомнить, какая. Все. верно, метод шифрования наследуется от метода расшифровки. Движок сохраняет. Это значение тоже необходимо запомнить, иначе. Движок сохраняет.

Продвинутые движки умеют делать выбор побайтовым и. Значение регистра необходимо увеличить на два, чтобы. Говорит само за себя (я надеюсь : ) ). Чтобы понять то, что он делает. Когда я работал над. Soft. Ice и гексого- двоичный калькулятор и начал исследование. Вы что- нибудь замечаете?

Очевидно, что первый. MOV reg. 16,reg. 16' всегда равен 1.

Bh. Второй байт. меняется только того, когда меняем регистры. При более внимательном. Байт состоит. из 7 битов, а не из 8? Нет, так как бит 0 - первый бит, то бит 7 - .

Ах, да, последний бит всегда остается 1. Теперь, похоже. что остальные биты постоянно меняются. Я слышу крик внимательно читателя: но. В данном примере я не использовал 1. SI, DI, SP и BP. Они также должны быть закодированны, для.

Смотрите. INSTRUCTION HEX BINARY. MOV AX,1. 23. 4 B8. MOV CX,1. 23. 4 B9. MOV DX,1. 23. 4 BA3. MOV BX,1. 23. 4 BB3.

MOV SP,1. 23. 4 BC3. MOV BP,1. 23. 4 BD3. MOV SI,1. 23. 4 BE3.

MOV DI,1. 23. 4 BF3. В этот раз гораздо интересней будет взглянуть на шестнадцатиричные значения. А малость отсортированл инструкции, поэтому заметить.

Отличие от предыдущего. Вся инструкция занимает три байта: один, задающий саму. Это не слишком удивительно, учитывая, что как раз. MOV < reg. 16> , 1. Теперь настало время составить список регистров и как они кодируются в.

Посмотрев на оба пример мы можем легко увидеть, что. AX = 0. 00b = 0h. CX = 0. 01b = 1h. DX = 0. 10b = 2h. BX = 0. 11b = 3h. SP = 1. 00b = 4h.

BP = 1. 01b = 5h. SI = 1. 10b = 6h.

DI = 1. 11b = 7h. Все используемые регистры перечислены здесь (IP не в счет), и мы можем заметить.

Запишите этот. список, он вам понадобится. Очень просто. ребята в Интеле изобрели инструкцию 'OR'. Я думаю, многие начинающие вирмейкеры. Я думаю, что вам следует об этом. OR 0 = 0. 0 OR 1 = 1. OR 0 = 1. 1 OR 1 = 1. Но вы, наверное, удивляетесь: для чего я могу использовать эту инструкцию.

И это очень полезно для кодирования регистров: помните наши. MOV < reg. 16> , < reg.

Это были 1. 00. 01. Скажем, если мы заполним точки нулями для reg.

ORим их с соответствующим кодируемым регистрам значениями. Скажем. нам нужен 'MOV BX, CX'. Сначла нам нужно поместить в регистр (например, AX).

MOV < reg. 16> ,< reg. MOV AX, 8. BC0h (используйте калькулятор с функцией bin. Затем нам нужно закодировать значения регистра- назначения в битах 3- 5 и.

MOV требует от нас. BX = 0. 11b и CX = 0. В итоге, чтобы про. ORить это значением с AX (которое содержит значение. MOV): OR AX, 1. 9 (снова используйте калькулятор с bin. Выбор регистра. Одна из первых вещей, которую должен сделать наш движок - это выбрать регистр. В этом примере мы используем регистры, чтобы они.

XOR . В силу. архитектуры 8. BX, SI, DI и BP. Только эти четыре. Давайте я покажу вам кое- что. XOR WORD PTR . Обратите внимание, что второй байт меняется с 3. На двоичном уровне 3. Это, конечно, делается для того. Если относительного смещения нет, инструкция.

Это касается и DI, но не BP! В движке, который мы рассматривали в. Для SI, DI и BX. дополнительный байт не нужен, достаточно установитель соответствующий бит в. Если мы хотим, чтобы движок мог работать и с BP, мы должны. BP, и если. так, добавлять дополнительный нулевой байт.

Конечно, для написания как можно. Тем не менее, это улучшение. Я дам вам. хороший совет: не пытайтесь сразу создать сложный движок, сначала начните с. Я предполагаю, что мы используем только BX, SI и.

DI, поэтому нам не нужно думать об относительном смещении. Что я. объяснял ранее? Просто поместите закодированные значения BX, SI и DI в. Это не так уж действительно важно и специфично именно. BP в этом примере. Учтите, вы не можете . В движке. который мы рассматривали, нам нужно сделать 'MOV < reg.

MOV < reg. 16> , 1. О 1. 23. 4 мы можем пока забыть. Для нас важен первый байт инструкции 1. Сначала мы должны заполнить точки нулями, а потом про. ORить. получившееся значение с корректным опкодом. Я предполагаю, что точки заполнены.

Окей, базовое значение для MOV < reg. B8h (сконвертированное.

AX. Теперь мы. должны про. ORить AX с кодируемым значением регистра. Нам нужен SI, чье значение. AX, 6h. Поэтому мы должны дать движку как можно большее.

XOR, ADD и SUB - . SUB . Если вы решите добавить эти и.

NOT . На. данный момент давайте договоримся, что наш движок использует только XOR, ADD. SUB. Предположим, что точки (где. Вот необходимые значения.

XOR: 8. 1 3. 0 xx xx. ADD: 8. 1 0. 0 xx xx. SUB: 8. 1 2. 8 xx xx. Пожалуйста, обратите внимание, что эти значения действительно, когда есть. С помощью этих значений вы можете генерировать такие. XOR ! Это не очень хорошо, потому что идея полиморфного.

Впрочем. пока мы будем игнорировать это обстоятельство и попытаемся создать рабочий. Давайте предположим, что движок. ADD в качестве шифрующей операции. Мы просто сохраняем 8. Ранее мы кодировали в инструкции просто регистры.

Вот список. 0. 00b = 0h = . Примените 'OR 3. 0h' на конкретном. Не забудьте запомнить. Большинство движков создают криптор.

Просто повторите этот шаг. Так как мы. используем шфирование по словам, регистр необходимо увеличить на два.

Очевидно. что мы можем использовать: два INC, 'ADD reg, 2' или даже 'SUB reg, - 2'. Но. также подумайте о строковых операциях, таких как SCAS, CMPS, STOS, LODS и MOVS. Мы можем использовать это свойство, но будьте внимательны с этими. MOVS может привести к нежелательным. Я думаю, что вы сможете найти нужные кодируемые значения этих. Чтобы не слишком удлинять данный туториал, я объясню только как.

INC'а, так как остальное вы сможете выяснить самостоятельно. Например 'INC SI' будет кодироваться с помощью.

OR 4. 0, 6', где 6 - это кодируемое значение SI. Надеюсь, теперь все понятно : ). В. этом примере единственная возможно сделать это - инструкция CMP, что не очень. Другим путем может стать. SUB, но во время вычитания из регистра, но тогда вы не сможете. Правда, вы можете помещать конечное. Базовое значение 'CMP reg.

F8h. Мы сохраняем 8. ORим F8h с кодируемым значением регистра (не со. Это последний байт/слово, который нужно.

Как мы можем вычислить это значение? Довольно просто: стартовое. Последняя передается движку через CX, а стартовое.

Смещение. в памяти опять- таки передавалось движку в качестве параметра через AX, а. Если ваши декрипторы. Поэтому. AX длина CX. Сложите значения и сохраните их как операнд. Переход. После CMP идет условный переход. Очевидным вариантом представляется JB, но. Да. есть JNA, но проблема в том, что у них одинаковые опкоды, что не слишком.

Интересно. но только если бы мы добавляли к операнду CMP один/два! В противном случае. Я предполагаю, что мы используем.

JB (обратите внимание, что если вы выбрали использовали использование. JNZ, следующее объяснение тоже некоторым образом относится к ней. Как мы можем. закодировать это? Во- первых, гексовое значение JB равно 7. Как вы знаете из заражения COM, у таких переходов байт. В этом байте. находится количество байтов, на которое CPU должен сдвинуть IP, чтобы. Вот пример. 0. BF9: 0.

B6 8. 1 3. 7 6. 4 2. XOR . Поэтому правильное. JB можно высчитать. Новое смещение - Смещение следующей инструкции = Относительное смещ.

0 Comments



Leave a Reply.

    Author

    Write something about yourself. No need to be fancy, just an overview.

    Archives

    October 2016

    Categories

    All

    RSS Feed

Powered by Create your own unique website with customizable templates.