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

Статья Криптование

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

"гумном обыкновенным" к сожалению также очень сложно обходится с учетом кажднодневной переделки, а то и чаще чинить приходится. Более сложные образцы дольше делать, но чинить легче. Универсального экономически лучшего решения нет, многое зависит от реализации.
 
Брр... 50% done.
Как вступительную часть второй статьи - реализовал простейший полиморфный генератор на основе движка "Morphine".
Во втором случае рассматривается пермутатор, но с ним возникла следующая проблема:

Пересчёт переходов(jmp, call, j***):
Когда движку подаётся код он изначально не знает смещения, тем самым в процессе дизассемблирования кода придётся их высчитывать, учитывая два факта:
I)Блоки расставляются в случайном порядке.
II)В процессе перемешки между командами вставляется мусор.
Фактически, если бы не было второго варианта проблема решалась бы проще, но при генерации мусора, скорее всего придётся учитывать размер добавленных движком команд...

Придуманное мною решение явл-ся(с моей точки зрения) велосипедом, возможно у вас есть на этот счёт мнение ?

Сорцы приветствуются :)
 
Ход действий:
1)Дизасмом разбирается код в движке, затем каждый переход закидывается во временный буффер с указанием смещения, а также номера и размера блока.
2)После перемешки блоков в случайном порядке, записывается их новая последовательность.
3)Далее высчитываются новые смещения(после перестановки, учитывая то, что мы знаем порядок расстановки блоков кода + размерность каждого) и записываются во второй буффер.
4)Следующий этап - это добавление мусорных команд.
Также анализируется новый код и с учётом специфик полиморфа, вставляются опкоды.
Теперь заковыка тут: надо каким-то образом собирать либо данные(смещение определённой команды, на которую ссылается переход), либо составлять отдельную таблицу, чтобы после вставки новых опкодов, код не "рухнул".

Интересны ваши мнения, мб алгоритм неправильный ?

P.S:
SilverT
Код на си, но взял на заметку.
 
На данный момент в моём движке им-ся два буффера с кодом:
1)Во время первого прохода(судя по первому переданному в стэк параметру) определяется размер каждого блока и они нарезаются, при этом каждый блок разделяется магическим словом и в то же время записывается его смещение и номер в специальную таблицу.

2)Во втором же проходе происходит разбор команд(условных переходов, прыжков, вызовов, api вызовов). В этом случае также каждое смещение записывается в структурированную таблицу.

Код:
Btable struct
BlockNumber dd ?
BlockAddr   dd ?
BlockSize   dd ?          ; +12h byte
magic       db "magic", 0h; разделитель.
;...
Btable ends

;==========================

Optable struct            ;параметры в этой структуре указывают месторасположение
BlockNumber dd ?          ;и данные опкода.
BlockAddr   dd ?
opcode      dd ?          ; 1,2,3 bytes
opref       dd ?          ; address, where com. points.
magic       db "magic", 0h; разделить.
;...
Optable ends

greenzy
Если тебя интересует - можем перенести наше обсуждение в жаббер, заодно если у тебя есть опыт в написании таких движков - я могу продемонстрировать свои наработки.
 
вопрос, кто как делает, чтобы мусорный код был наиболее похож на созданный компилятором?
по идее тогда выявить вредонос не получается возможным.
 
вопрос, кто как делает, чтобы мусорный код был наиболее похож на созданный компилятором?
по идее тогда выявить вредонос не получается возможным.
Ну не только код чекают на предмет того, что это компилятор, в расчёт берут rich, mz_dos_stub, import, а также волшебные байты(иначе сигнатуру) на ep.

Если мутить весь код, то либо делать шаблонизатор и на его основе генерировать компиляторо-подобный код, либо(способ посложнее) имитировать работу компилятора(его подробно описывать не буду, т.к долго и нудно).
 
Chococream
что есть шаблонизатор? хотелось бы поподробнее с этим)
 
что есть шаблонизатор? хотелось бы поподробнее с этим)
http://xss.pro/index.php?topic=20483 (1 часть).
http://xss.pro/index.php?topic=20628 (2 часть).

В первой части мембер под ником KraZz как раз описывает сиё.
Если чуток дальше копнуть и найти себе как минимум 100-200 сигнатурных опкодов - на их основе можно делать шаблонизатор со своим алгоритмом, который будет разбавлять твой код мусором.
Задача не из лёгких, но можно сделать и попроще.
 
АП-АП-АП %)))
Чет давно мну на DL не был (наверное, как уже пол года прошло или даже больше), сорри не удержался и решил тоже свои пять копеек нуба в общий колодец знаний бросить..
Chococream пишет:
Полная: AB F6 7B 88 99 6A
Плавающая: AB ?? ?? 88 99 **(знак ? - значит любые байты в текующей позиции, знак * - неогр. кол-во байт в текущей позиции).
Если быть точным
Полная: AB F6 7B 88 99 6A
Эта сигна для детекта в основном статик кода
морально устарела, сейчас в основном осуществляют детект по хэшу – занимает мало место в базе и в разы эффективнее..
По маске: AB ?? ?? 88 99
Эта сигна для детекта в основном полиморфного кода, ограничена размером, примитивна.., морально устарела...
если происходит детект по такой сигне, изменив в ручную в определенном порядке несколько байт в таком криптованом сэмпле, то "мы" сможем еще продлить жизнь такому сэмплу "на несколько минут"... %)))
Сигнатура: B? ?? ?? ?? ?? F7 ?? 81 ?? ?? ?? ??
Детктит примерно такой код: (чисто для примера)
Код:
1 вариант кода
00400000     BE 6C558202     MOV ESI,282556C
00400005     F7D6            NOT ESI
00400007     81EE 879C6001   SUB ESI,1609C87

2 вариант кода
0040000D     B9 8D164A02     MOV ECX,24A168D
00400012     F7D1            NOT ECX
00400014     81F1 EE1B7B00   XOR ECX,7B1BEE
Плавающая: AB ?? * 88 99 (Wildcards)
Эта сигна для детекта в редких случаях примитивного метаморфного кода (на уровне 2-3 инструкций), а в основном для игнорирования "аномального" мусора
Сигнатура: 8B 45 00 * 8B 55 0? * F7 D0
Детктит примерно такой код: (чисто для примера)
Код:
1 вариант кода
0041BCFF     8B45 00         MOV EAX,DWORD PTR SS:[EBP]
0041BD02     42              INC EDX
0041BD03     60              PUSHAD
0041BD04     60              PUSHAD
0041BD05     66:FFCA         DEC DX
0041BD08     8B55 08         MOV EDX,DWORD PTR SS:[EBP+8]
0041BD0B     66:81FA FE1F    CMP DX,1FFE
0041BD10     F7D0            NOT EAX

2 вариант кода
0045B6F0     8B45 00         MOV EAX,DWORD PTR SS:[EBP]
0045B6F3     F6D2            NOT DL
0045B6F5     0F9BC2          SETPO DL
0045B6F8     89FA            MOV EDX,EDI
0045B6FA     8B55 04         MOV EDX,DWORD PTR SS:[EBP+4]
0045B6FD     68 C2C04AD3     PUSH D34AC0C2
0045B702     52              PUSH EDX
0045B703     F7D0            NOT EAX
Маленький квест на знание асма ;)
1. какая асм инструкция выполняется этим кодом
2. какой "сигной" можно задетектить этот "ОДИНАКОВЫЙ" код
Chococream пишет:
Задача это тяжелая и требует написания дизассемблера длин(можно и взять
готовый) для определения границ команд, чтобы можно было в автоматизированном
действии вставить одну команду между тремя другими.
ЗЫ: этот код ("космос") сгенерирован БЕЗ использования дизассемблера длин
Код:
00401000     C3              RETN
================================
00401001     51              PUSH ECX
00401002     53              PUSH EBX
00401003     68 DF992D4B     PUSH 4B2D99DF
00401008     68 00104000     PUSH 00401000
0040100D     E8 1D000000     CALL 0040102F
00401012     53              PUSH EBX
00401013     6A 07           PUSH 7
00401015     56              PUSH ESI
00401016     68 D8314000     PUSH 004031D8
0040101B     8B4D 24         MOV ECX,DWORD PTR SS:[EBP+24]
0040101E     51              PUSH ECX
0040101F     53              PUSH EBX
00401020     52              PUSH EDX
00401021     E8 DEFEFFFF     CALL 00400F04
00401026     6A 2E           PUSH 2E
00401028     FF35 B4324000   PUSH DWORD PTR DS:[4032B4]
0040102E     E8 8B5C2408     CALL 08646CBE
00401033     66:01C8         ADD AX,CX
00401036     81EB 1268BDB4   SUB EBX,B4BD6812
0040103C     A0 D8314000     MOV AL,BYTE PTR DS:[4031D8]
00401041     81F3 287DE6C9   XOR EBX,C9E67D28
00401047     66:81E8 BB00    SUB AX,0BB
0040104C     81C3 AE000000   ADD EBX,0AE
00401052     81C7 E4000000   ADD EDI,0E4
00401058     81F3 B272C4AB   XOR EBX,ABC472B2
0040105E     81CA B8B30000   OR EDX,0B3B8
00401064     F7D3            NOT EBX
00401066     895C24 10       MOV DWORD PTR SS:[ESP+10],EBX
0040106A     0BDB            OR EBX,EBX
0040106C     74 A1           JE SHORT 0040100F
0040106E     8B5C24 0C       MOV EBX,DWORD PTR SS:[ESP+C]
00401072     66:81E8 D700    SUB AX,0D7
00401077     66:81C0 E700    ADD AX,0E7
0040107C     BF 3C334000     MOV EDI,0040333C
00401081     83C4 04         ADD ESP,4
00401084     C2 0800         RETN 8

Код:
00401000  C3            RETN
================================
00401001  51            PUSH ECX
00401002  56            PUSH ESI
00401003  50            PUSH EAX
00401004  8B5424 18     MOV EDX,DWORD PTR SS:[ESP+18]
00401008  66:8BF0       MOV SI,AX
0040100B  8A1D 68304000 MOV BL,BYTE PTR DS:[403068]
00401011  F7D2          NOT EDX
00401013  895424 18     MOV DWORD PTR SS:[ESP+18],EDX
00401017  0BD2          OR EDX,EDX
00401019  75 20         JNZ SHORT 0040103B
0040101B  57            PUSH EDI
0040101C  8B4C24 2C     MOV ECX,DWORD PTR SS:[ESP+2C]
00401020  52            PUSH EDX
00401021  51            PUSH ECX
00401022  68 78333141   PUSH 41313378
00401027  8949 24       MOV DWORD PTR DS:[ECX+24],ECX
0040102A  E8            DB E8
0040102B  68 213F52F4   PUSH F4523F21
00401030  52            PUSH EDX
00401031  68 00104000   PUSH 00401000
00401036  E8 C6FFFFFF   CALL 00401001
0040103B  8B5424 14     MOV EDX,DWORD PTR SS:[ESP+14]
0040103F  66:01CB       ADD BX,CX
00401042  5E            POP ESI
00401043  5B            POP EBX
00401044  83C4 08       ADD ESP,8
00401047  C2 0400       RETN 4

http://exelab.ru/f/index.php?action=vthrea...=12&topic=15991

Chococream пишет:
Как вступительную часть второй статьи - реализовал простейший полиморфный генератор на основе движка "Morphine".
Прочитал и вспомнил, что у меня есть цикл статей (профессиональное криптование) написанных мною
Так вот там тоже частично в пример приводицца движок Morphine +
http://www.wasm.ru/forum/viewtopic.php?id=31721 - LSD - Новый портабельный дизасм для любых сред
(не знаю, жив ли там архив, но советую начинать свой путь именно с этого двига)
На основе этого кода(и главное для чего юзать его тулузу) я рассказываю, как написать свой двиг джита(JIT).. кхе-кхе
Короче, статьи писались когда-то для продажи 5-10 баков за статью(там исходники, картинки, скрипты итд.), а это бабло планировалось пустить на создание сайта для публикации платных статей, чтобы позволить авторам немного заработать, ведь каждый труд должен оплачивацца
Предполагалось на начальном этапе продавать админам разных сайтов типа раздела для покупных статей, ну еще может тем, кто просто хочет купить, чтобы подержать автора.. есть и такие, но их мало...
Потом когда ресурс вышел бы на самоокупаемость тем, кто покупал статьи (ну, к примеру, не менее 20-30), автоматом рассылались уже бесплатно
Ну а тех, кто пытался бы копипастить ждал бздидос, пока не удалит копипаст, будет спать
Скажем так - бздидос стал бы на сторону авторских прав.. %)))
Но у нас в генах все еще бродит сапдеповсий менталитет - все, что "самодеятельность" должно быть для народа бесплатно
Поэтому посчитал, что еще рано, хотя хз...
 
Вернулся, устаканилось всё более-менее.

KraZz
Рад, что ты снова с нами.
Поддержу беседу :)

Первый космос:
Код:
В упрощённом варианте модель происходящего в коде:
push 0BADC0DEh
retn

Второй космос:
Код:
Нельзя было в бинарном виде код представить ?)
На виртуалке xp sp2 код в пустоту ведёт. На счёт сигнатуры - хз, я не авер, пусть другие разбираются.

Есть ещё что-нибудь интересное ?
 
Chococream пишет:
В упрощённом варианте модель происходящего в коде:
push 0BADC0DEh
retn
Во втором варианте модель происходящего в коде аналогична :)
Chococream пишет:
Нельзя было в бинарном виде код представить ?)
Гы-гы, ну это же "КВЕСТ", а не ТЕСТ %))

Времени прошло достаточно, сталобыть выкладываю решение по "прохождению"
Берем копипастим код в блокнот (к примеру, EmEditor)
Жмем на клаве Alt+ПКМ (правая кнопка мыши) и выделяем бинарный код (Alt нам позволяет выделить только нужный нам код в определенном столбце) и Ctrl+C
в итоге у нас в буфере обмена для OllyDbg будет лежать в бинарном виде такой код:
Код:
51           
56           
50           
8B5424 18    
66: 8BF0      
8A1D 68304000
F7D2         
895424 18    
0BD2         
75 20        
57           
8B4C24 2C    
52           
51           
68 78333141  
8949 24      
E8           
68 213F52F4  
52           
68 00104000  
E8 C6FFFFFF  
8B5424 14    
66: 01CB      
5E           
5B           
83C4 08      
C2 0400
Далее смотрим на код и видим обращение к секции дата некоторых асм команд (они нужны для имитации стандартного кода, и по сути чич-то мусор)
MOV AL,BYTE PTR DS: [4031D8]
PUSH DWORD PTR DS: [4032B4]
Значит, открываем любую прогу (в OllyDbg) в которой секция дата начинается с адреса 403000 (подойдет (к примеру) win.exe из пакета MASM) – это нужно для того чтобы при трассировке(F7) мы не падали..
Теперь нам нужно в OllyDbg выделить байт 200 в секции кода (! - это обязательно нужно сделать, иначе OllyDbg вставит только пару байт)
И в контекстном меню Binary->Binary paste
Далее в контекстном меню Backup->Update backup
и Analysis->Analyse code (анализ кода в OllyDbg может быть разрушен из-за особенностей кода.. поэтому, как только увидим нужный нам кодес, так сразу его удаляем Analysis->Remove analysis from module)
Это нужно сделать как с одним, так и с другим вариантом
Теперь "наши" бинарики готовы к следующему этапу "квеста"
Поиск точки входа(Entry Point)
В первом варианте кода точка входа 00401001
Chococream пишет:
На виртуалке xp sp2 код в пустоту ведёт.
Во втором варианте кода точка входа 0040102B
Так как в коде присутствует пермутация, то по этой причине точка входа никогда одинаковой быть не может..
Выбираем эти адреса в OllyDbg и в контекстном меню New origin here
Ну, а дальше F7...
Chococream пишет:
На счёт сигнатуры - хз, я не авер
А здесь и не надо быть авером, просто надо быть намного опытнее и грамотнее чем эти существа!

На счёт сигнатуры – я подразумевал анализ кода и попытку найти слабые места в коде, по которым возможен детект
Вообще эта тема очень обширна, но чтобы не быть пустазвоном, приведу маленький пример:
//004010CE 8B36 MOV ESI,DWORD PTR DS:[ESI]
//004010D0 (31)33D2 XOR EDX,EDX
Первый вариант
//Signature.Add('8B ~00,C0 33 ?'); // стандарт 33, постоянно используется, 8B ~00,C0 естественно не учитывается! нужна как метка для выравнивания и исключения поиска из второстепенных опкодов
Второй вариант
//Signature.Add('8B ~00,C0 31 ?'); // 31 очень редко встречается, практически не используется, 8B ~00,C0 естественно не учитывается! нужна как метка для выравнивания и исключения поиска из второстепенных опкодов
Представим что "наш" JIT генерит вот такую асм команду
XOR EDX,EDX
Казалось бы, что в ней такого она может встретиться в любой проге и при этом тысячи раз!, но только один из вариантов
На асме она имеет один вид, а в бинарном два вида
Если мы будем юзать первый вариант - то все окей, но вот может появицца соблазн использовать второй вариант(типа чем больше рандомных асм команд тем круче)
Но этого нельзя делать, ибо:
1. Стандартные компиляторы не генерируют подобный код
2. К примеру "эвристик" на основе заложенных в нем правил при анализе измерит частоту использования данного кода ("на основе построения графов"), и если будет "превышен порог", то ахтунг..
3. ...

Сталобыть подведем итоги:
Из описания сигнатур мы видим, как "легко" создаются сигны для детекта техник:
Статик, полиморфного, рандомного и мусорного кода(крипторы созданные на основе данных техник и генерируемые ими сэмплы, живут от 1 часа мак. день – ИМХО (даже на маленьких ботнетах), если автор перестает осуществлять поддержку криптора, то на нем можно ставить крест!)
Усложнить детек могут метаморфный(не ниже уровня 5-20 команд), пермутация, (есть еще и другие техники, но..)...
Короче чет заипался писать уже %)))

P. S.
Chococream пишет:
Есть ещё что-нибудь интересное ?
Да, наверное, есть и много чего, только вот боюсь, опять на годик пропаду, тут загадывать сложно.. планы еще могут поменяцца пицотраз
Да и Ar3s вроде как обещался DL закрыть :( , теперь хз. куда пойти, куда подаццо..
ЗЫ: Вообще планировал в оффлайн чекер эвристик добавить, чтобы ламерские крипторы детектил
 


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