?

Log in

n0name blog [entries|archive|friends|userinfo]
n0name

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Крякми [янв. 6, 2010|06:59 am]
n0name
Собственно как и обещал, решил запостить фишки крякмиса.
Скорее всего никто его не посмотрел из френдов, однако фишки кажутся мне довольно интересными чтобы посвятить им целый пост в журнале :)

Крякми реализует простенькую регистровую виртуальную машину, которая эмулит три команды - mov, mul, add.
Скармливая ей байт-код получаем в регистрах нужное значение.
Байт-код формируется из 4х частей - 1. ксоренный серийник. 2. Контрольная сумма байт кода. 3. Часть серийника обрабатываемого в TLS. 4. Часть серийника обрабатываемого в "DllMain".
Собственно последние 2 части трудн-обнаружимы как под отладчиком, так и при статическом анализе.
А теперь переходим к фичам :)
1. Это поле AddressOfIndex в директории TLS. Загрузчик записывает по этому адресу TLS-индекс.
Для первичного потока он равен 0. Таким образом мы получаем возможность записать 00000000h в любой writeable участок памяти. Я зануляю последний байт адреса EntryPoint'a в PEB'e для моего первичного модуля. Однако этот EP используется только при вызове инициализаторов DLL. Переходим к пункту 2.
2. Ставим в PEB'e для нашего модуля соответствующие флаги (0x81004) и вуа-ля, теперь при старте потока вызовется наш EP. Однако следует учесть, что когда поток завершается, первый элемент в списке модулей PEB'a пропускается, и даже такая правка нам не поможет. Поэтому мы в нашем новом обработчике (помните про зануление?) перезаписываем DllMain() ntdll.dll.
3. Динамическое заполнение TLS. Загрузчик парсит TLS-директории каждый рааз когда ему это требуется, нигде не храня. Поэтому вполне можем добавить на лету новый элемент. Который не будет виден дизассемблеру :)

В общем - всё. Простенький крякмис больше ничего и не содержит.

Сорцы - http://www.multiupload.com/LWFTL9PICU

PS: убрал рекламку через CSS, теперь не придётся покупать платный аккуант :)
Ссылка8 комментариев|Оставить комментарий

Новогодний пост. [янв. 1, 2010|07:45 pm]
n0name
Всех френдов с праздником.
Помню полгода назад обещал регулярно писать сюда. Однако что-то не вышло.
Надеюсь исправиться.
Для начала выкладываю простенький crackme.
Работает только на WinXP, проверял на SP2/SP3.
Бзе знания ключа сломать тяжко, котя можно, поэтому вот данные:

Name: n0name
Serial: 6A480361FD71D4300815

Правильный ответ - это мессага "Answer: 6".
Минут 15 должно занять времени :)
Используется несколько инетересных фишек (2-3).

http://www.multiupload.com/T1I1ARH2JS

Скорее всего никто и не посмотрит, но всё же, для памяти :)
Через недельку выложу как ломать и какие фишки используются :)
СсылкаОставить комментарий

icfpc [июн. 30, 2009|02:55 pm]
n0name
Спустя больше года я снова с вами :)
Сподвигло на восстановление ЖЖ участие в icfpc.
Кто не знает - это такой занимательный командный контест по программированию. Лучше всех о нём пишет _adept_ http://users.livejournal.com/_adept_/.
http://icfpcontest.org/ - можно скачать спеку и задачи.
Это мой первый опыт участия в таком сорвеновании. Решил поучаствовать буквально за два часа до начала, благо предварительной регистрации не требовалось. Но, само собой, команду собирать времени не было, поэтому я был один :)
Начиналось в 2 часа ночи по местному, поэтому первые 8 часов соревнования я проспал :)

Задание заключалось в пилотировании спутника, выполняя поставленные задачи.
Пилотирование заключалось в задании изменения вектора скорости (ΔV).
Для тестирования своих решений организаторы предоставляли модели связанные с задачей. Модели были в виде байт-кода для ВМ, которая была описана в спеке, ничего сложного - 11 примитивных опкодов. Справился с реализацией ВМ довольно быстро - 2 часа. При этом, как ни странно, сделал только один баг.

Первое задание заключалось в том, чтобы выйти с одной "круговой" орбиты на другую "круговую" орбиту заданного радиуса. Орги любезно кинули ссылку на статью про переходную орбиту Хоманна со всеми необходимыми формулами. Задание заняло у меня 3-4 часа, и то, только из-за бага в ВМ, который я нашёл только после тщательного изучения мнемоник байт-кода этой модели.

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

Время выхода на орбиту цели - известно. g(f(x0, t0, R1)) = f(xS, tS, R2)
g(x) = -(R1/R2) * x - формула вычисления точки в которой необходимо делать второй импульс по Хоманну, x - точка первого импульса. Соответсвенно, во время второго импульса спутники должны уже быть рядом.
f(x, t, R) - функция вычисления новых координат движения по кругу радиусом R, с начальными координатами - x, спустя время t.
x0 - начальное положение моего спутника, xS - цели, t0 - время через которое мы придадим первый импульс, tS - время через которое цель окажется в точки встречи.

Решив это уравнение можно легко вычислить необходмые данные.
Однако я решил подобрать такое t0, чтоб уравнение решалось. 100k итераций хватило.
Однако отсутствие высокой точности помешало выйти достаточно близко.
Поэтому я делал несколько микроимпульсов |ΔV| < 1.0 для корректировки орбиты.

Задание заняло 7-8 часов.

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

15 часов кодинга и 4-5 часов на математику. В итоге я работал над контестом 20 часов из предоставленных 72.

500 строк кода на Си. 1.5 метра в памяти. 1-10 секунд выполнения. 1000 очков, 8 сданных сценариев.
Ссылка2 комментария|Оставить комментарий

Кое какой стафф. [фев. 10, 2008|01:28 pm]
n0name
за ненадобностю выкладываю примерчик скрытия процесса.
Имхо это абсолютно ненужно, но это PoC. 4 fun, так сказать. Когда тестил (год назад) не ловилось ни кем. Основная фишка в постановке бряка (на память через drX) на pThread->Tcb.ApcState.Process. Как ни странно все те, кто хукал всякие SwapProcess/int 2Eh/sysenter юазли это поле для идентификации треда, хотя есть и другие поля...
Основные недостатки - only UP, only XP. Тк это PoC я сознательно не делал унифицированный механизм.
сорц: линка на slil.ru.
Ссылка9 комментариев|Оставить комментарий

Антивирусы [фев. 1, 2008|04:59 pm]
n0name
Добавил парочку антиэмульных трюков. Например такое:

fild dword ptr [esp + 4]
push dword ptr [esp]
pop dword ptr [esp + 4]
fistp dword ptr [esp]
mov eax, [esp]
add esp, 8
jmp dword ptr [esp - 4]

Однвко BD и vba32 эмулируют все корректно как ни странно.
Зато они попались на эмуляции PEB'a/TEB'a. В общем ничего сложного в их обходе нет. Буквально строк 5-6 кода.
Теперь буду избавлятся от сообщенйи о том, что файл закриптован и подозрителен.
Ссылка4 комментария|Оставить комментарий

Как обычно - над чем работаю. [янв. 30, 2008|03:21 am]
n0name
Взялся за интересный проект - что-то типа криптора/пакера.
Пакер для дров я уже писал, а для exe/dll еще нет. Собственно его я уже закодил, осталась морфирующая часть, самое интересное ;)
В процессе написания и тестирования нешел еще пару багов в PETools. В частности в PESniffer'e как-то коряво сделан дизасм EP. Я по ошибки записал физическое смещения EP, вместо RVA. PEEditor скушал спокойно, а вот PESniffer вылетел с эксепшном.
Ради примера насколько хороши эвристики антивирусов провел проверку на вирустотале. Взял блокнот зараженный Parite.B. Запаковал. (шифрование - обычной xor с 4байтовым ключем). В итоге только BitDefender и какой-то VBA32 определили что это за вирус. Еще пяток написали что это подозрительный файл. Причем KAV'ы, NOD'ы, Avast'ы, DrWeb шли лесом.

Временно забил на компилятор Си. Хотя лексер + кодген написаны, остался синтаксис. Планирую использовать компилятор в разработке своей ОСи, уже есть наброски формата исполняемых файйлов и объектников. Модифицированную версию думаю использовать в качестве генератора полиморфного кода. На вход подаётся откомпилированный байт-код в собственном формате, на выходе - машинный код, сгенерированный вариативным кодогенератором встроенного компилятора инсталлера. Идея не нова, но достойных паблик реализаций я не встречал.
Ссылка17 комментариев|Оставить комментарий

Текщие "проекты" [ноя. 17, 2007|06:46 am]
n0name
В своем посте немного хотел отписатся чем я занят на текущий момент кроме работы.
Пакер
Недели три назад закончил пакер-протектор драйверов. Детект отладки -> BSOD. Не каждый дизасм справится с кодом. Извратился с PE-заголовком как мог. Зато компактнее хароновского линкера получается заголовок. IDA, увы, спокойно смотрит на мои извращения, только ругается на invalid virtual address. Абсолютная невозможность получения оригинального бинарника. Сжатие я сделал простенькое, на основе minilzo-библиотеки. Есть опциональная возможность запрета запуска драйвера на MP-машинах. Для PoC'ов в основном. Я в реверсинге не силен, но запреты на отладку имхо заметить беглым взглядом довольно трудно. Я сделал тройной уровень защиты. Первый тривиальный - в DriverEntry() тупо проверяю IDT. И если что не так то выходим. Это так называемая защита от дурака. Вдруг кто-нить просто по ошибке запустил лров на машине с р0-дебаггером. Что ж, тогда выйдем спокойно. А вот если реверсер погупал код проверки, тогда его ожидает бсод на втором уровне =)
Компилятор + линкер.
Этим вопросом пока серьезно не занимался. Компилятор + линкер будут генерировать 16битный код. Тк для 32хбитных бинарников меня вполне устраивает свяязка icc + unilink. Собственно что меня сподвигло писать это. Как я замечал в одном из постов, мне приспичило писать свою ОСь _полностью_ на ЯВУ, подходящих вещей нет. Компилятор будет однопроходным, неоптимизирующим. Благо опыт у меня есть. Будет генерировать объектники моего собственного формата. Не нравится мне избыточность и нечеткость MS COFF. А уж об OMF и говорить не приходится. Никакого мангалинга имен, мвносит неразбериху. Поддержка дебаг инфы на должном уровне - четкое сопоставление строк в исходнике последовательности байтов в бинарнике, а другой инфы имхо и не нужно. Думаю что дословно стандарт не буду реализовывать, муторно слишком. Даже название придумал =) недоСи, или underC.
ОСь
Собственно это тот проект, ради которого и собираюсь писать компилятор. Цель написания - упрочить навыки работы с железом. Отработка кусков кода, которые могут быть полезны в других областях. Знание APIC, SMM, работы с портами вв, стек протоколов не будет лишним. Хочу чтобы ОСь грузилась с флешки, юез эмуляции биосом флопи или харда. Однако сомневаюсь что смогу это сделать, но попробую.
Парсер NTFS
Сейчас, пока занимаюсь теорией в написании ОСей и компиляторов, пишу парсер такой небезизвестной файловой системы как NTFS. Мне в этом помогают в основном сорцы linux-ntfs. Ну и иногда книга "Криминалистический анализ файловых систем". Книга не очень в плане описания NTFS. Там 3 главы, и в каждой идет описаний NTFS. В 11 описали аттрибуты, в 12 опять описали аттрибуты, в 13 снова описали аттрибуты. И так почти по каждому вопросу. В более поздней главе более подробное описание предмета, однако имхо такое повторение материала очень мешает.
Что же мне мешает рипнуть уже готовый код? Ну хотя бы то, что во многом код излишен. Да и читабельность видимого мною кода оставляет желать лучшего. Стараюсь учесть все неюансы, который могут встретится в томах, созданных ОСью Windows. Пока получается так себе :) Многих вещей я не встретил у себя на дисках.
Ссылка8 комментариев|Оставить комментарий

Книга [ноя. 17, 2007|06:15 am]
n0name
У меня нет постоянного доступа к сети уже 2 недели :\ А аьтернатив практически никаких. Теперь кроме работы принялся читать всякие забавные книжки. Последняя - "Мародер" Беркем Аль Атоми. Очень забавная книжка. Советую всем ее почитать. Ну конечно если ты поклонник слюнявых любовных романов с хеппиэндом, где все живут дружно и счастливо, или тупых боевиков-серий, то тогда лучше не читать. Однако мне кажется что среди френдов мало поклонников такой "литературы".
Также советую почитать его жж - http://berkemalatomi.livejournal.com/. Не смотря на обилие матов, проскакивают довольно интересные мысли.
Ссылка1 комментарий|Оставить комментарий

Heap [окт. 19, 2007|06:37 am]
n0name
[Музыка |1342. Гражданская Оборона - [Звездопад] На всю оставшуюся жизнь]

Немного отвлекся от работы и допичал чуток ацкий протопакер для драйверов. такое маньячество можно творить с PE-форматом %) Как-нибудь выложу файлик запакованый им.

Научился работать с верификатором. Даже не знал что есть такая полезная штука встроенная в винду. Нашел несколько неочевидных ошибок. Расскажу об одном из них. Многие "руткитописатели" юзают сплайсинг, ну и конечно запрещают прерывания. Якобы это должно предотвратить бсоды если вдруг кто-то вызовет функцию во время патчинга. Это конечно поможет слегка, но есть и еще парочка подводных камней, на которые аффтары в своём большинстве забивают. Ну ладно не об этом речь. А об том, что функция накодится в подкачиваемой памяти. Значит _потенциально_ страница с этой функцией может быть в свапе. И что же произойдет когда мы начнем её патчить запретив прерывания? К гадалке не ходи - ясно что бсод.

Решил проапгрейдить себе комп. e6400 -> q6600. 4хдерник всяко будет полезен для отладки специфического кода. Да и на практике проверить хочу результаты тестирования всяких детекторов вмок. Известно что часть из них построена на считывании адреса LDT/GDT/IDT. И в статье было показано что этот способ надежен только для чсистем с одним логическим процессором.

Ссылка1 комментарий|Оставить комментарий

(без темы) [окт. 2, 2007|06:24 am]
n0name
На досуге рещил занятся всякими извращениями со структурой драйверов. У MS оказывается куча добавочных условий, которых нет в стандарте, например виртуальный и физический адреса секций должны совпадать. Мне это только на руку, не надо мучится с переводлом RVA -> RPA. Паиаллельно с исследованиями, нашел несколько способов подвесить PETools, при анализе своего файла :)
Текущая версия драйвера прекрачно грузится, а IDA ее не переваривает :P. Надо бы заюзать где-нить это знание, в пакере-протекторе например.
Ссылка7 комментариев|Оставить комментарий

navigation
[ viewing | most recent entries ]
[ go | earlier ]