| icfpc |
[Июн. 30, 2009|02:55 pm] |
Спустя больше года я снова с вами :) Сподвигло на восстановление ЖЖ участие в 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 сданных сценариев. |
|
|
| Кое какой стафф. |
[Фев. 10, 2008|01:28 pm] |
за ненадобностю выкладываю примерчик скрытия процесса. Имхо это абсолютно ненужно, но это PoC. 4 fun, так сказать. Когда тестил (год назад) не ловилось ни кем. Основная фишка в постановке бряка (на память через drX) на pThread->Tcb.ApcState.Process. Как ни странно все те, кто хукал всякие SwapProcess/int 2Eh/sysenter юазли это поле для идентификации треда, хотя есть и другие поля... Основные недостатки - only UP, only XP. Тк это PoC я сознательно не делал унифицированный механизм. сорц: линка на slil.ru. |
|
|
| Антивирусы |
[Фев. 1, 2008|04:59 pm] |
Добавил парочку антиэмульных трюков. Например такое:
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 кода. Теперь буду избавлятся от сообщенйи о том, что файл закриптован и подозрителен. |
|
|
| Как обычно - над чем работаю. |
[Янв. 30, 2008|03:21 am] |
Взялся за интересный проект - что-то типа криптора/пакера. Пакер для дров я уже писал, а для exe/dll еще нет. Собственно его я уже закодил, осталась морфирующая часть, самое интересное ;) В процессе написания и тестирования нешел еще пару багов в PETools. В частности в PESniffer'e как-то коряво сделан дизасм EP. Я по ошибки записал физическое смещения EP, вместо RVA. PEEditor скушал спокойно, а вот PESniffer вылетел с эксепшном. Ради примера насколько хороши эвристики антивирусов провел проверку на вирустотале. Взял блокнот зараженный Parite.B. Запаковал. (шифрование - обычной xor с 4байтовым ключем). В итоге только BitDefender и какой-то VBA32 определили что это за вирус. Еще пяток написали что это подозрительный файл. Причем KAV'ы, NOD'ы, Avast'ы, DrWeb шли лесом.
Временно забил на компилятор Си. Хотя лексер + кодген написаны, остался синтаксис. Планирую использовать компилятор в разработке своей ОСи, уже есть наброски формата исполняемых файйлов и объектников. Модифицированную версию думаю использовать в качестве генератора полиморфного кода. На вход подаётся откомпилированный байт-код в собственном формате, на выходе - машинный код, сгенерированный вариативным кодогенератором встроенного компилятора инсталлера. Идея не нова, но достойных паблик реализаций я не встречал. |
|
|
| Текщие "проекты" |
[Ноя. 17, 2007|06:46 am] |
В своем посте немного хотел отписатся чем я занят на текущий момент кроме работы. Пакер Недели три назад закончил пакер-протектор драйверов. Детект отладки -> 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. Пока получается так себе :) Многих вещей я не встретил у себя на дисках. |
|
|
| Книга |
[Ноя. 17, 2007|06:15 am] |
У меня нет постоянного доступа к сети уже 2 недели :\ А аьтернатив практически никаких. Теперь кроме работы принялся читать всякие забавные книжки. Последняя - "Мародер" Беркем Аль Атоми. Очень забавная книжка. Советую всем ее почитать. Ну конечно если ты поклонник слюнявых любовных романов с хеппиэндом, где все живут дружно и счастливо, или тупых боевиков-серий, то тогда лучше не читать. Однако мне кажется что среди френдов мало поклонников такой "литературы". Также советую почитать его жж - http://berkemalatomi.livejournal.com/. Не смотря на обилие матов, проскакивают довольно интересные мысли. |
|
|
| Heap |
[Окт. 19, 2007|06:37 am] |
| [ | Музыка |
| | 1342. Гражданская Оборона - [Звездопад] На всю оставшуюся жизнь | ] |
Немного отвлекся от работы и допичал чуток ацкий протопакер для драйверов. такое маньячество можно творить с PE-форматом %) Как-нибудь выложу файлик запакованый им.
Научился работать с верификатором. Даже не знал что есть такая полезная штука встроенная в винду. Нашел несколько неочевидных ошибок. Расскажу об одном из них. Многие "руткитописатели" юзают сплайсинг, ну и конечно запрещают прерывания. Якобы это должно предотвратить бсоды если вдруг кто-то вызовет функцию во время патчинга. Это конечно поможет слегка, но есть и еще парочка подводных камней, на которые аффтары в своём большинстве забивают. Ну ладно не об этом речь. А об том, что функция накодится в подкачиваемой памяти. Значит _потенциально_ страница с этой функцией может быть в свапе. И что же произойдет когда мы начнем её патчить запретив прерывания? К гадалке не ходи - ясно что бсод.
Решил проапгрейдить себе комп. e6400 -> q6600. 4хдерник всяко будет полезен для отладки специфического кода. Да и на практике проверить хочу результаты тестирования всяких детекторов вмок. Известно что часть из них построена на считывании адреса LDT/GDT/IDT. И в статье было показано что этот способ надежен только для чсистем с одним логическим процессором. |
|
|
| (без темы) |
[Окт. 2, 2007|06:24 am] |
На досуге рещил занятся всякими извращениями со структурой драйверов. У MS оказывается куча добавочных условий, которых нет в стандарте, например виртуальный и физический адреса секций должны совпадать. Мне это только на руку, не надо мучится с переводлом RVA -> RPA. Паиаллельно с исследованиями, нашел несколько способов подвесить PETools, при анализе своего файла :) Текущая версия драйвера прекрачно грузится, а IDA ее не переваривает :P. Надо бы заюзать где-нить это знание, в пакере-протекторе например. |
|
|
| xGetProcAddres |
[Сент. 22, 2007|06:47 pm] |
Копаюсь в своих модулях, с целью что-нибудь поправить :) Увидел модуль получения адресов api в ядре. Раньше у меня просто сканирование экспорта и сравнение имён. Сейчас сделал через бинарный поиск. Горазддо быстрее должно работать. Один минус теперь не заюзать хеши. Однако чтобы сильно не палить имена функций, я просто добовляю константу к каждому символу. и при сравнении это учитываю. Еще одно преимущество перед хешами - отсутствие коллизий. код под катом ( код ) |
|
|
| (без темы) |
[Авг. 30, 2007|10:26 pm] |
|
Тестирую фильтрующую систему. Фильтрует перехватом трафика через NDIS. на вм ставил апач, на реальной машине решил создать на народе страничку. удалось только с пятогго раза придумать оригинальное название ;) mailtest123, mailtest321. mailtest-123, adada не прошло :) |
|
|
| APIC |
[Авг. 12, 2007|10:27 am] |
|
Наконец-то вроде как вкурил из доков почему у меня не получается промаппировать регистры APIC на виртуальный адрес. Надо чтобы память была strongly uncached(UC). Винда для своего адреса APIC делает это через MTRR, видимо придётся то же знаятся =) |
|
|
| Будничный пост :) |
[Авг. 4, 2007|05:13 am] |
Новости разработок. С PDBViewer'ом всё та жа запара, но пока времени нет более подробно разобратся, зато решил написать дополнение(Extension) для Thunderbird для сортировки писем из Trac'a. По мере изучения процесса написания этих дополнений понял что Firefox/Thunderbird писали дикие извращенцы, однако они предоставили возможность полностью контролировать/модифицировать программу. |
|
|
| Мысли о ЖЖ + новости о разработках ;) |
[Июл. 31, 2007|02:02 am] |
Новости о разработках Начну с новостей, пока только важных для меня =) С PDBViewer'ом запара. Неправильно определяет размер массива. Всё изза корявого формата PDB, точнее изза корявых MS-компиляторов(ни в коем случае не виноваты мои крывае руки :D). У них объявление одной и той же структуры идёт от 1 до 4 раз в новых версиях компилятора. Кто не верит, может дампануть символы Win2k3 с помощью pdbdump, причём он юзает стандартную DLL - dbghelp.dll, то есть дело не в кривых руках ;) В общем некоторые структуры имеют размер, а некоторые нет. И я хз как определить размер одного элемента массива. Пока остановился на дизасме dbghelp.dll. Сейчас в рамках разработки ОСи начал упорно изучать работу с APIC. Начал пока что из-под виндов, пока компилятор не написал/нашёл.
Мысли о ЖЖ Сразу извеняюсь если кому-то не понравятся мои слова ;) Прежде всего я завёл ЖЖ ради возможности отписывать свои соображения по программированию, ну и боком новости своих разработок. Даже если один человек будет пользоватся прогой, то уже не зря ;) Однако походе я исключение из правил, по крайне мере в ЖЖ(отдельные сайты-блоги часто служат тем же целям, что и мой). Смотрю в блоги тех, кто меня добавил, но и не только их, а еще куча народов блоги которых нашёл по интересам. Вроде все программисты, думаю может найду чего интересного. Ан нет. Обычно в блоге пишут что-то из жизни, быта, будничные вещи. Может автору и его RL друзьям читать/писать это интересно, однако мне не очень. Может автор хочет отдохнуть от программинга хотя бы в блоге. хз, хз. В общем пока у меня идёт почти вся информация из ЖЖ в одну сторону. Только журнал cr4sh'a пока радует редкими программерскими постами =) |
|
|
| Вьювер и новые идеи. |
[Июл. 27, 2007|02:21 am] |
PDBViewer почти готов. Release сборка занимает 15Кб не сжатая =) Всё замечательно находит, но есть баги по генерации кода. Буду править, завтра/послезавтра выложу в сеть.
Теперь к моим будущим планам ;) В свободное от работы время планирую начать писать свою ОСь. Ни много ни мало. Однако это мне поможет, надеюсь, получше разобратся в некоторых технологиях, таких как SMP, работа с ACPI-шиной, виртуализация, работа с процессорными мониторами. Хочу писать всё на Си. Идея-фикс такая у меня - написать на высокоуровневом языке ОСь "от и до". Обращаюсь с вопросом к моим немногочисленным (4?) френдам - какой компилятор сможет генерировать бинарники требуемого формата? Или придётся писать самому, к чему склоняюсь после непродолжительного изучения существующих компиляторов. Благо теперь у меня есть хорошая книжка, да и классика жанра в электронном виде валяется. |
|
|
| PDBViewer: upd. |
[Июл. 26, 2007|03:13 pm] |
|
hal.pdb и ntoskrnl.pdb парсит нормально - то есть обрабатывает структуры, юнионы, енумы. Теперь осталось только связать его с GUI. Оставил только синтаксис Си, ибо возникают проблемы с некоторыми типами - bitfield например. Поиск будет выглядеть примерно так: module_regexp!type_regexp, если нету знака ! то поиск будет выполнятся по всем загруженным модулям. Загрузить модель можно явно указав его при поиске. например hal.dll!*, и тогда если хал не был загружен то он загрузится. |
|
|
| PDBViewer news =) |
[Июл. 26, 2007|01:47 am] |
|
Собственно выкроил немного времени на него. Дописал код парсера самого формата PDB. Теперь сижу дебажу/дописываю новые типы данных, которые я изначально не ввёл. |
|
|
| Прочёл книжку Хоглунда. |
[Июл. 22, 2007|05:28 pm] |
На досуге прочитал эту книженцию. Не понравилась. Отчасти по переводу, очередной перл - в качестве аналога английскому "hook" выбран русский "захват", а не стандартный "перехват". Причём термин "захват" используется и для обозначения стандартных хуков Windows. Однако не только перевод огорчил меня, но и сам текст книжки. Фактически эта книга комментарии к коду авторов. Теория подается неоднородно. Например в начале рассказывается про IRP, причём многого не сказано. А потом через несколько глав дорассказывается остальное, так как это понадобилось для понимания сорца. Но не только это не понравилось в книге. Техническая сторона дела объясняется очень слабо. Не дана информация о подводных камнях. Что самое кривое во всей книге - это сплайсинг. Описан он _очень_ криво, причём Хоглунд даже не говорит о проблемах синхронизации. И о том что поток может выполнятся на прологе, да и вообще кроме комментов к коду не рассказывает не о чём. В одной из глав читаю - таблица IDT для каждого процесса своя, не надо забывать об этом. Во думаю - автор молодец. Но... В книге _нигде_ это не учитывается. Хотя работа с IDT идёт в нескольких местах. В общем книга для новичков может быть еще сойдет, однако для тех кто более-менее знаком с проблематикой книги настоятельно советую не терять своё время. |
|
|
| Книжка Хоглунда. |
[Июл. 20, 2007|03:20 am] |
Как я писАл в предыдущей записи, купил я эту книженцию. Перевод "Питера". Начал читать, ничего особенного я не ожидаю в ней увидеть, всё таки я просматривал оригинал по диагонали, уделяя большее внимание листингам. Сразу в глаза бросились несколько "ляпов" переводчиков. Может для кого-то это не ляпы, а вполне допустимые термины. Однако "backdoor" назвают "лазейкой". Причём это слово обильно употребляется автором в начальной главе. Или слово "patch", которое названо "заплатой". Ну не звучит ИМХО это по-русски, зачем вводить собственные термины? Почему-бы просто не протранслитерировать и получить вполне знакомые - патч, бекдор. Или если так хочется ввести русский аналог, хотя для rootkit не ввели же - и на том спасибо, то почему бы не придумать более контекстные аналоги. Например для "backdoor" - закладка, этот термин использовался еще в советское время. |
|
|
| Покупки в библиотеку. |
[Июл. 19, 2007|04:41 pm] |
Закупил книжен от Питера. Буду образовыватся ;) Почти все есть у меня в электронке, однако имхо лучше в бумажном виде. Совершенный код. Макконнелл Внутреннее устройство Windows ... Руссинович Руткиты: внедрение в ядро Windows. Хоглунд Криминалистический анализ файловых систем. Кэрриэ Языки программирования и методы трансляции. Свердлов |
|
|
| PDBView |
[Июл. 16, 2007|10:23 pm] |
| [ | Музыка |
| | шум стройки за окном | ] | Все не так просто оказалось ;) PDBPlus и PDBDump используют dbghelp.dll и DIA соответственно, а я хочу реализовать без использования специальных библиотек, однако не всё так плохо, хотя описание формата я не нашёл в сети, но в сорцах wine есть работа с PDB. Однако на мой беглый взгляд там много лишнего, хочу написать тестовый консольный дампер всей информации, и посмотреть какая мне нужна, планирую работать только со структурами, енумами и typedef'ами.
Заметил в ваулте 90210 забавный сорц sw_remove.rar - интересная техника работы на smp-системах м IDT, и поиск оригинального IDT в ntoskrnl.exe по анализу релоков. Советую посмотреть, кто не видел ;) |
|
|