Сейчас на форуме: (+5 невидимых) |
eXeL@B —› Дневники и блоги —› Блог DenCoder'а |
<< . 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 05 июля 2015 15:23 · Поправил: DenCoder · Личное сообщение · #1 Всем привет! Всем здоровья, достатка, удачи, успехов... всех благ! ) Вот и нашлось немножко времени, чтобы завести блог. Давно хотел, но время для меня на вес золота... С вашего позволения здесь буду описывать процессы обхода/взлома/разбора защит, с которыми приходилось сталкиваться. Кому-то может пригодиться, кому-то - нет... Но за время работы немного узнал, что есть такая защита, перед которой некоторые коллеги пасуют - VMProtect. Может, в общем и есть такие страшные версии вмпрота, на которые терять кучу времени бессмысленно - не знаю, я с такими не сталкивался. Но скажу, что очень часто снимать вмпрот или разбирать то, что им накрыто, просто нет необходимости! Вмпроты, которые мне попались в мае (сразу 2 подряд) - не такие страшные. Первым из них была накрыта lockpdfu.dll - компонент DRM защиты pdf-ок. Подробнее Человек 2 или 3 года ждал, когда же, наконец, найдётся кто-нибудь, кто даст возможность свободно пользоваться pdf-документами на любом компе и редактировать. И находился некто с других сайтов, кто чуть не кинул... Попробую объяснить морально-идеологический аспект в двух словах прежде всего: Человек - учитель, ему необходим учебный материал без ограничений использования с возможностью редактировать. Одна из купленных тетрадей, на файле которой я помогал решить задачу, стоила что-то вроде 70 гривен, использовать можно только на 2х компах и никак нельзя что-то пометить, что-то исправить. Чтобы, например, поделиться с учениками, сколько-то нужно дополнительно проплачивать... мда... куда катится мир, одни то ли бизнесмены, то ли барыги... Ставим задачу: перехватить расшифровку запротекченной тетради, записать в отдельную папку оригинальный pdf. Из совета Vovan666 запротектил пдф-ку персональной версией, после чего без проблем из памяти AcroRd32 достал чистую pdf-ку. честно говоря, не понял про протект персональной версией, но проверил можно ли что-то из памяти выцепить: даже и обычные pdf-ки в первозданном виде в памяти не хранятся, сигнатур %pdf-1.4 .. %pdf-1.7 нет. То, что находится с такой сигной - какая-то полоска для самого ридера ) Я пошёл своим путём. Раз нельзя выцепить из памяти - незаметно (для защиты) встанем на место после декрипта и незаметно сольём поток в файл. Звучит просто, но пришлось немного попотеть... CreateFile, SetFilePointer, CloseHandle удалось хукнуть джампом без проблем. А вот ветка кода из acrord32.dll, вызывающая чтение функой ReadFile была хукнута в NtReadFile защитой + каким-то магическим образом проверялся crc этой ветки, а также защита не давала поставить ни софт бряк, ни джамп на ReadFile ни до, ни внутри, ни после... в дрова лезть не будем! Софт бряк нельзя поставить, а против харда защита ничего не имеет против! Вспомнил, что имеется такая функция AddVectoredExceptionHandler и быстро нарисовалась идея (что не я - первооткрыватель, знаю, потому и пишу, что вспомнил) поставить 2 харда на ReadFile и после и обрабтать по своему. Потратил немножко времени на кодинг, но удалось, с первой подзадачей справился, осталось только записать файл. Записать файл - тут кажется, проще не бывает. Но во-первых под 7кой и выше нужно перевести для этого акроридер в незащищённый режим, чтобы были привилегии, во-вторых - NtWriteFile также хукнута защитой и возвращала жестокий AD. Снимать хук без изучения защиты бесполезно - работать как надо не будет. ReadFile, WriteFile - так защита обменивалась какими-то важными данными. Не стал тратить время на изучение механизмов, сделал проще: против вызова NtWriteFile в месте после хука защита тоже ничего не имела против. Тут, я думаю, подробности излишни, в ntdll индексы всех фунок(nt-сервисов) идут по возрастающей по порядку во всех версиях винды, не встречалось другого(берём адрес хукнутого сервиса, находим следующий/предыдущий, берём оттуда индекс сервиса и минус/плюс 1) Новичкам с опытом кодинга может быть полезно В следующий раз (может быть сегодня вечером, может и через года 2) опишу отлом какой-то из версий вмпрота под x64, где тоже есть морально-идеологический аспект ----- IZ.RU | Сообщение посчитали полезным: TLN, Zoeken |
|
Создано: 24 декабря 2015 10:54 · Личное сообщение · #2 Тут интересную штуку нашёл. Поделюсь позже и может быть!... Но по всему одно из трёх - 1) либо это баг вмпрота с 3мя различными вм(2 с декрементом vmp, 1 с инкрементом) 2) либо часть ключа проверяется раньше и при верности по вычисленному происходит корректная вторая распаковка(немыслимая гипотеза, но всё же) 3) либо в 3ей вм заложен механизм перезаписи указателей на хендлеры примитивов Пока продолжаю анализ... ----- IZ.RU |
|
Создано: 26 декабря 2015 16:13 · Личное сообщение · #3 |
|
Создано: 30 декабря 2015 22:25 · Поправил: DenCoder · Личное сообщение · #4 |
Ранг: 281.8 (наставник), 272thx Активность: 0.25↘0.01 Статус: Участник Destroyer of protectors |
Создано: 30 декабря 2015 22:28 · Поправил: MasterSoft · Личное сообщение · #5 |
|
Создано: 19 февраля 2016 06:21 · Поправил: DenCoder · Личное сообщение · #6 MasterSoft пишет: дайте файл я найду)) да нету там вашего!!! Итог за уходящий год и вновь пришедший: VMProtect - ерунда... есть планы и разнятся с поставленными задачами... ARM - ерунда... привыкнуть надо... Hex-Rays - не понимаю тех людей, кто им пользуется... для меня изначальный вид в асме проще для понимания, чем си-код, полученный им... mips - ерунда... с delay slot'ами... Отдельно о mips'е: Была поставлена задача. Срок выполнения был оценен расплывчато - от 3х недель до 2 месяцев. И должен сообщить, что достиг-таки того уровня, который позволил мне, не взирая на все проблемы, уложиться в минимальный из поставленных - 3 недели и 2 лня. Были проделаны работы: 1) выяснение формата редчайшей файловой системы - заказчик выяснил бОльшую часть, я устранил некоторые ошибки 2) формат файлов конфигов - полностью на мне необходимый минимум для запуска девайса 3) написание утилиты для вставки и редактирования файлов в эту фс 4) выяснение конкретных данных, алго преобразования их из употребительного вида в исходный вид в файле... 5) прочий реверс в сочетании с ручным декомпилем особо важных частей кода ... Сейчас Какое отличие от всех ранее проделанных работ по другим проектам - впервые за всю свою жизнь не увидел индусского говнокода, и заказчик хорошо железно подкован... Хоть местами своими догадками и мешали друг другу наполовину, сработались отлично в общем! Вот и всё! Никакой конкретики несколько лет к ряду, всё только для истории... ----- IZ.RU |
|
Создано: 26 февраля 2016 17:47 · Поправил: DenCoder · Личное сообщение · #7 DenCoder пишет: VMProtect - ерунда... есть планы и разнятся с поставленными задачами... Я часто писал, что где работаю, туда ветер и дует. И всегда есть желанный причал, куда не доплыть галсом на порывах... где можно не только переоборудоваться и запастись провизией... Нашёл для себя, что есть парусное дело, законы аэродинамики - ветер нельзя изменить, но можно повернуть парус! Веков ещё 20 назад сила ветра использовалась в своих целях независимо от его направления. Можно даже плыть и против ветра - бейдевиндом. Маневрируя в нужные моменты плюсом и минусом угла между ветром и курсом... И вот вопрос - можно ли по принципу аналогии подчинить себе в реверс-инжиниринге "ветер"? Можно ли придумать такую систему "парусов" и манёвров, чтобы независимо от специфики проекта, мы продолжали двигаться тем же курсом? Если ветер - абстрактный вектор специфики проекта, сила ветра - ход работы над ним, в роли паруса - знания и опыт, то какие манёвры тут есть?... Самый главный вопрос - применима ли здесь аналогия? Очень бы хотелось, но, похоже, не в 3х-мерной геометрии это возможно... На аналогии если ехать, можно мозг сломать, но под пиратскую тему она очень подходит. В общем, в планах "побывать-таки на 9 крупных причалах". И что-нибудь придумаю!... ----- IZ.RU |
|
Создано: 12 марта 2016 15:46 · Поправил: DenCoder · Личное сообщение · #8 Столкнулся с FlexLM. Забавно, но как будто копия VMProtect. Логика такая же, только код невиртуализирован: Code:
Примерно такой же вид принял бы девиртуализированный с вмпрота байт-код конца каждой ленты с ветвлением. Продолжение следует.... ----- IZ.RU |
|
Создано: 15 марта 2016 21:04 · Личное сообщение · #9 Ида лажает на spd (Stack Pointer Delta) на функциях с мелкими фрагментами, размазанными по образу. Написал скрипт для фикса Code:
Скрипт специфический под x86/x64 из-за инструкции ret с кодом 0xc3. Но и под другие платформы можно заюзать, если заменить этот опкод на нужный. Не хватает правда пока фиксов для некоторых иснтрукций, типа lea rsp, [rsp - 8]. Но это нетрудно, если надоест вручную править spd после таких, то вставлю пару строчек. Добавлено спустя 17 часов 36 минут Поправил скрипт, теперь в нём учитываются циклы, и это не зацикливает его в 50% случаев. Code:
Кото-то может заинтересуется, подумав над скриптом, откуда там может быть 2 джампа (fl_JN от одного и того же адреса). Всё просто: ветвление осуществляется, если проще - Code:
Чтобы граф красиво выгдядел, и чтоб не путаться при 200+ фрагментах, очень полезно воспользоваться на адресе с retn такими idc-командами Code:
...... Может чего в скрипте лишнего написал? Я впервые на них пишу... Перечисление фрагментов неудобно - от меньшего к большему, от того он раздулся. Функция названа RecursFunc() потому, что изначально задумывалось её сделать рекурсивной, но мне показалось, что это будет чревато вылетами бедной иды. Отдельный момент вызывает интерес: Code:
Почему так? Зачем после первой правки начинать всё сначала? Всё дело в том, что поправив в одном месте spd, необходимо проверить в остальных фрагментах ранее - могут "непредсказуемо" сбиться. Непредсказуемо в кавычках потому, что какая-то логика в "ошибках" иды на самом деле есть. Может, есть какая-то скрытая настройка по части разных сегментов и spd... но это будет отдельная тема... ----- IZ.RU |
|
Создано: 16 марта 2016 18:49 · Поправил: DenCoder · Личное сообщение · #10 Надоело фиксить spd после команд lea rsp, [rsp -/+ 8]. Обновил скрипт. Теперь это делается автоматически. Code:
Но сейчас функция достигла 174 фрагментов и это ещё, кажется, только половина, и времени на скрипт тратится около 1 минуты. Надо либо фиксить нэйтив иды, либо фикс-плаг писать, но времени на это сейчас нет. Добавлено спустя 40 минут Убрал лишний вывод сообщений и пошустрел скрипт - 5 сек Добавлено спустя 15 часов 24 минуты Странная вещь со скриптом. При количестве фрагментов функции, меньшем 100 он ещё нормально работал. Но вот, наконец, функция раскручена полностью в 197 фрагментов, и граф всё-таки построен так, ветвление через retn и jmp [rsp] не мешает - навигация по коду функции как будто ничего такого и не было. Но стали твориться спонтанные вещи... Теперь не всё правит скрипт... Пришлось помучаться! Да да, именно помучаться! Не поизучать нормально характер глюков иды, а помучаться!!! Там нечего изучать - выполняем SetSpDiff() в одном месте - в другом слетает. Что со скриптом? Возможные причины(версии): 1) Случайным образом прерывается, не достигая конца 2) DeleteArray() не всегда полностью удаляет созданный массив 3) DelArrayElement() не всегда удаляет элемент массива, может быть даже не всегда тот 4) Что-то ещё вряд ли кому ведомое Начиная понимать, что эта мистика чисто из-за багов idc-движка, задался экспериментом: несколько раз запустил скрипт, каждый раз перед этим обнуляя везде spDiff вот так Code:
И что же получилось... Я не знаю, каким чудом у вас получается что-то писать на idc, как вы вообще ему верите, но у меня вот такой маленький списочек адресов фрагментов, на которых каждый раз idc не справился со своей задачей: Code:
Была бы проблема со скриптом - адрес каждый раз был бы один и тот же, так как генератора случайных чисел в скрипте нет... Касательно idc - иду в нейтиве править! Надо бы проверить питон... Добавлено спустя 15 часов 28 минут Но вряд ли на это время есть... Добавлено спустя 16 часов 41 минуту Самое интересное - 173 фрагмента в самом наихудшем их расположение потребовали бы таким idc-скриптом, даже если об не прерывался, 2 ^ 173 вызовов recursFunc() И пришла в голову умная мысль на основе наблюдений, что надо фиксить spd у фрагментов в восходящем их порядке! Т.е. так, как они перечисляются функцией NextFuncFchunk(). Но заранее неизвестно, у какого фрагмента какой должен быть spd. Поэтому их придётся запоминать по мере выполнения в третьем массиве... Пока что из этой функи вытащил столько, с чем можно пробовать и созрели пара вариантов для достижения цели. Если не выгорит, придётся копать выше и тогда уже реализую новый скрипт. Цель - пока секрет, позже напишу ----- IZ.RU |
|
Создано: 17 марта 2016 21:27 · Личное сообщение · #11 |
|
Создано: 21 марта 2016 14:09 · Личное сообщение · #12 DenCoder пишет: Цель - пока секрет, позже напишу Не суеверен особо, но стараюсь держаться поговорки "не говори оп, пока не перепрыгнул". Цель была необычная - исправить "баг" плагина под известное приложение. Повозился немного... Достоинства защиты: 1) Неизученные пока методы антидебага 2) Противодействие аттачу дебаггером 3) Противодействие установке в контексте регистра Dr7 как изнутри, так и извне 4) Антипатчинг ... но поборол! Как? Инжект + AddVectoredExceptionHandler() + PAGE_EXECUTE_READ + маленький встроенный дизасм + взвод TF.... ))) Добавлено спустя 5 минут Суть "бага" - то ли защита каким-то образом обнаруживала, что её обошли, то ли недообошли - не знаю, оригинальный кряк делал не я. Но на определённых действиях плагин портил свой код, для чего и понадобилось поудобней представить ту самую функу в 173(или 174) куска. Дальше была просто найдено несколько возможных целей - попытки хукнуть не увенчались успехом... нашёлся способ проще - таблица! с rva правок - ну не палево? ) .... ----- IZ.RU |
|
Создано: 28 марта 2016 22:13 · Личное сообщение · #13 DenCoder пишет: 1) Неизученные пока методы антидебага 2) Противодействие аттачу дебаггером 3) Противодействие установке в контексте регистра Dr7 как изнутри, так и извне 4) Антипатчинг что там неизученного такого?))) интересно же а вех да, рулит! ) ----- [nice coder and reverser] | Сообщение посчитали полезным: HandMill |
|
Создано: 29 марта 2016 14:35 · Поправил: DenCoder · Личное сообщение · #14 Да мной не изучено. Не тратил время на изучение, так обошёл, без дебага. Изучение, возможно, ещё предстоит ) В противодействии аттачу дебаггером сделал пару проверок на хуки - их не было... дальше - я не гадалка, оставил это дело - бороться с антидебагом, не это была цель. Антидебаг в основном построен на 2х известных функциях - IsDebuggerPresent() и CheckRemoteDebuggerPresent(). Но не только, были ещё непонятные эксепшены, которые как ни передавай приложению - дебаг вылетал... Хотя, может, чего-то упустил... Добавлено спустя 5 минут Hellspawn пишет: а вех да, рулит! Кстати, из возможных противодействий веху - периодическая проверка последнего установленного хендлера и установка своего на переднем плане. В том числе можно и напрямую список проверять, не забывая ксорить с процессКуки... Ни разу такого пока не встречалось... ----- IZ.RU |
|
Создано: 06 апреля 2016 14:00 · Поправил: DenCoder · Личное сообщение · #15 Наконец, выдалась пара свободных дней. Эти дни, конечно, можно отдохнуть, но я б хотел продолжить один из своих забытых проектов. В "борьбе с багами" флекса написался маленький x64-дизасм, помогший обойти дополнительные проверки лицензии. По всем правилам лучше б было разобрать все эти проверки полностью и сделать что-то универсальное типа кейгена, но глюки иды, без которых это и так затратно, вынудили сократить исследования... Из всего можно извлечь пользу. И польза в том, что этот проект не просто напомнил мне о забытом дизасме, который имел только лишь поддержку x86, без fpu и mmx, sse, sse2. А и побудил нацелиться расширить область применения и исправить пробелы. Надеюсь, 2-3 дней хватит хотя бы на основу (в основе структуры и константы, ими управляется логика дизасма, тут уж я люблю так ), а если нет - попутного мне ветра! Преимущества своего дизасма в том, что не надо никого просить исправлять баги. В любое свободное время сел и поправил. В том числе, появляется возможность прикрутить его к вмтрейсеру и сделать из него эволюционное продолжение в направлении "инструмента статической распаковки"(позаимствовал термин у Faust'а), не основанного ни на какой платформе, будь то ида, олли или ещё что. Возможность расширенного сигнатурного анализа с какими угодно масками с проверками по смыслу и т.д... Замахи большие, но ветер слабый... ----- IZ.RU |
|
Создано: 17 апреля 2016 17:06 · Поправил: DenCoder · Личное сообщение · #16 Добавил rex-префиксы, удалил несколько инструкций, которых нет под x64, добавил movsxd, cqo и cdqe. Подправил большую декодирования полей modR/M и SIB, из-за rex-префиксов над декодингом ещё надо будет поработать... Необходимость делать что-то другое, периодически что-то даже новое, не даёт вплотную заняться своим дизасмом. Так вот получил первый опыт по "форсированной" регистрации андроид-приложения, у которого в качестве основной защиты использовался класс LicenseChecker... Запатчил в 2х местах. Патчить код лучше в smali-виде, так надёжнее. Хорошо, что есть справочник по его опкодам, для справки в паре мест пригодилось. Благо, какие-то инструменты уже есть. В принципе, всё что надо из них - apktool и SignApk, что-нить удобное для поиска... ну и мозги, конечно. Можно и иду использовать, но почему-то на некоторые методы она не переходит. Пробовал для подписи заюзать keytool и JarSigner - не хочет на планшете ставиться apk. Также для более удобного чтения кода неплохо бы в джаву преобразовать. dex2jar - первый этап, он нужен для преобразования apk в jar-архив. Дальше нужен декомпилятор, вот тут не повезло немного: jd-gui разбирает коряво некоторые методы, а бывает и целые классы. Посоветовали fernflower, но пока не юзал, мне хватило и этого всего. ----- IZ.RU |
|
Создано: 23 мая 2016 20:24 · Поправил: DenCoder · Личное сообщение · #17 Тем временем, после выбора очередного проекта и небольшого отдыха Я там не поставил лайк. Ну и? И не поставлю И началось выклянчивание через личку. Не удовлетворил ответом - пошли в ход грубости... Я думаю, не стоит выкладывать ради чистоты истории... Оставлю только в общих чертах. Что ж, клянчили-клянчили, и выклянчили. Выклянчили пост в теме про денуво (пост там попросил сам удалить): Молодец, Bronco!!! Только это не повод закидывать меня спамом в личке! У меня своих задач хватает, чем-то помочь могу только по свободе от них. ELF_7719116 пишет в личке: Я еще поспамлю немного ) Вопрос: так понимаю есть наработки по вм вмпрота. таки было бы неплохо пустить их для денувки. по крайней мере я могу приспособить будущий софт на денувку под Ваши наработки Вот блин, не ожидал от тебя ещё. У вас, чё, мания всё выклянчивать? Я не только вмпротом занимаюсь, это не единственное дело-то! Раз Вам не плохо было бы - пускаете свои наработки! А я не вижу в этом никакой выгоды ни для себя, ни для семьи, ни для человечества в целом! Чем я хочу заниматься, у меня времени нет, а ещё Вам тут вынь, да положь. Всё, что надыбал по вмпроту, читайте в блоге здесь же. Не дебилы же? Будет у меня время, хорошо, раскрою там непонятные вопросы. ============================================================================= Добавлено спустя 7 минут Про что забыл - про желание упомянуть. Теперь очень сложно его вызвать... Моё мнение по всему этому - то ли ребята коллективно забухали по скайпу (возможно, это известная конфа), то ли от счастья крыша поехала. У вас много свободного от работы времени - пожалуйста, при чём здесь я? Я у Вамита ничего не клянчил, у него почерпнул только некоторые термины... зареганный вмпрот не имею права дать, и даже забудьте про это! Наработки - Вы заметили, что не так часто бывает свободное время, и кое-чем даже не имею права поделиться. В vmprotect 2.xx нет ничего такого, чем смог, тем поделился. Чем делюсь - оно в блоге, в основном для истории, мне же самому полезно бывает, потому как здесь я описываю так, как порой не вспомню. Добавлено спустя 13 часов 4 минуты Как я понял позже, исходя из переписки с ELF_7719116, "проект" встал, потому как запустить распакованное дело от OEP проблемно. Это уместилось в одно небольшое предложение! А не в 5 абзацев, как первоначально у Bronco: Привет! Вопрос как к опытному. Функи_процедуры в Лариске, опечатывали в три слоя или захода. Вторая ВМ имеет таблицу указателей (поксорены), и если я правильно понял, это главное отличие от новой вм. Вопрос 1. Не считая макросов по бекапу регистров на входе в вм, переходы между "блоками" исполняют командой jmp reg. В таблице 256 указателей, без дубликатов порядка 80, не имеющие дубликатов 7, из них 2 возможно уводят в другой цикл, но на них прерываний нет. Как двигло выходит из цикла? Вопрос 2. Учитывая что и опыт и практика у тебя больше моего, может чем то подсобишь в плане вм? Вопрос3. Пикод используется, как символика для скриптового языка ВМДвигла? Мне, честно говоря, пришлось потрудиться, чтоб что-то понять, чтоб на это что-то ответить... Да, донести смысл того, что хочешь, оказывается умение... 2 человека. Один знает, другой хочет спросить. Неужели трудно сосредоточиться и понятным языком задать вопрос? От этого же зависит ответ! И не только. Ценить время другого, которое тратится на понимание вопроса, не все умеют? Некоторые пишут какую-то абракадабру, несвязную чушь, открывая новый топик, и что самое интересное - находятся люди, которые их непонятным чудом понимают... 1 из 5-10... Вот что отвечу на понятый мной вопрос по проблеме(и исключительно потому, что в теме есть 3 адекватных знакомых по их постам здесь, и это не Bronco): В настоящее время вмпротом нет времени продолжать заниматься. Но над проблемой думалось на досуге. В теории запустить дамп можно. Это ведь имелось в виду? Или я опять не понял? Добавлено спустя 13 часов 26 минут Только у вас там, кажется, 3.x - может не совсем подойти. В старте дампа из OEP накрытой ранее вмпротом 2.x dll основных 3 проблемы: импорт, таблица релоков и дельта. Таблицу релоков можно вставить как секцию. Таблица там - не помню, то ли спрятана, то ли так лежит, но проходя стадии распаковки её можно найти. Дельта - необходимый аргумент для вм-диспетчера. Это я упускал всегда из виду - пока серьёзно и не пробовал запускать дампы. Но помню о ней. Импорт - на мой взгляд есть самая быстрая реализация, есть правильная. Правильная - это убрать замусоренные стабы на функи и заменить кривые "адреса" на правильные, для чего нужно по всем пройтись... возможно поиском на этой стадии распаковки. Быстрая - оставляем всё, как есть, но перед OEP вставляем свой импортёр - вырванный кусок вм-ленты процесса импорта. Добавлено спустя 13 часов 30 минут Прог для этого готовых нет, а кодом трассировки делиться не стану - он ужасный Обычно я лучше пишу... Добавлено спустя 13 часов 32 минуты Ну и да - если импортёр вставить правильно, то можно избежать поисков в около 100-200 лент проверок crc. ----- IZ.RU |
|
Создано: 25 мая 2016 14:44 · Поправил: DenCoder · Личное сообщение · #18 |
|
Создано: 11 июня 2016 16:19 · Личное сообщение · #19 Интересная задача встала - реализовать эксплойт под две версии прошивки для девайса на процессоре MIPS. Прошивка размером 128 кб. С нуля искать уязвимости было бы затяжно. Но код уже был к этому времени изучен в процессе предыдущего реверса для восстановления файлов конфигурации... Девайс предоставляет usb-интерфейс для работы с ним, одна из функций которого - запись определённых файлов. Файлы строго определённого формата, суть которого - набор некоторых блоков. Один из блоков - сама начинка, чаще всего это elf, и обязательно должен присутствовать блок с подписью неизвестным ключом из сертификата. Сертификат известен, на факторизация RSA2048 пока на грани фантастики... Набор блоков... Первое, что бросилось в глаза - собирается инфа обо всех блоках в файле, и для каждой такой инфы структура размером 0x18 байт на стеке! Второе - контроля число блоков нет, контроль повтора блоков - слабый, проверяются только соседние блоки, они не должны повторяться. Также есть некий блок, размер которого может быть до 128 байт, и после сбора инфы обо всех блоках он также пишется ниже по стеку. И самое важное - хендлер находится под стеком, что значит - опустив стек до хендлера, можно перезаписать его 128 байт! На x86 в 128 байт влезло бы достаточно... Но мипс имеет ущербный ассемблер. С одной стороны есть преимущества. Например, инструкция Code:
Code:
1) хендлер работает в режиме mips32, что значит - все инструкции либо 4 байта, либо 8, если используется расширение. Необходимо сохранить некоторые регистры перед переключением режима с 32 на 16. И x86-инструкция push reg в один байт на mips32 занимает 4. 2) Переключение режимов с целью выиграть на размере кода возможно 2мя способами, самый малоёмкий - jalx, 4 байта. Но тогда надо сохранять $ra - адрес возврата, по которому должна перейти какая-то функция, выполнявшаяся на момент вызова хендлера. А это 4 байта. Сам этот адрес вовзрата не сохраняется в мипсе, как на x86 при выполнение call. 3) Есть специфические регистры, обмен между которыми что на мипс16, что на мипс32 занимал бы 4 байта. На x86 это всегда 2 байта. Когда надо уложиться в 128 байт, думаешь о каждой мелочи 4) Нельзя в одну команду уложиться, чтоб в регистр записать произвольный адрес, если Code:
... Всё это накладывает ограничения такие, что в один эксплойт не уложиться. И схема такая - первая часть эксплойта восстанавливает хендлер и записывает часть кода по свободному адресу. Вторая часть эксплойта делает то же самое, но уже для восстановления хендлера использует часть сохранённого кода и добавляет немного больше кода по свободному адресу. Второй, третьей, ..., (n-1)-ной частями собираем нужный код и последней частью активируем! Сама по себе уязвимость странная в том, что на блок отводится 128 байт, когда там хватило бы 8! Не буду писать, что это за блок, но стоит призадуматься - большая вероятность, что это закладка, специально кем-то созданная и оставленная во всех версиях, чтоб когда надо ей кому-то воспользоваться... Я уже не говорю про ноутбуки, планшеты и мобильники... Может быть в мультиварках, телевизорах, пылесосах уже пора искать закладки? ----- IZ.RU | Сообщение посчитали полезным: daFix |
|
Создано: 16 июня 2016 03:28 · Личное сообщение · #20 Решено было перезаписать хвост эксепшен-хендлера, так как это даёт больше места для кода за счёт ненадобности восстанавливать исходный хендлер. Но не всё так просто, пришлось побороться с кешем инструкций, чтоб код в хвосте выполнялся. Чтобы сбросить кеш инструкций, мипсу нужно выполнить побольше условных переходов... Одно мешает с некоторой вероятностью - прерывание от таймера в неподходящий момент... ----- IZ.RU |
|
Создано: 18 июня 2016 03:18 · Личное сообщение · #21 |
|
Создано: 30 июня 2016 13:43 · Личное сообщение · #22 |
|
Создано: 18 сентября 2016 16:54 · Поправил: DenCoder · Личное сообщение · #23 DenCoder пишет: Одно мешает с некоторой вероятностью - прерывание от таймера в неподходящий момент... И было выпущено ещё 2 эксплойта под версии прошивки новее. То, что хендлер прерывания от таймера способен попортить код в неподходящем месте, решается определённым количеством невыровненных по границе 4 байт блоков в файле. Правильный подбор невыровненных блоков позволяет повысить вероятность задержки момента конца их разбора в функции настолько, чтобы попасть в нужный интервал времени, когда хвост хендлера перезаписывается сразу после его отработки. К сожалению, из-за таймера и неопределённости момента заливки файла в девайс 100% успеха недостижимо - 64 байта всегда за разные интервалы времени заливаются по usb, и отчасти виновата винда. Достигнуто было в районе 50-80 в зависимости от версии прошивки. ----- IZ.RU | Сообщение посчитали полезным: daFix |
|
Создано: 16 декабря 2016 00:09 · Личное сообщение · #24 |
|
Создано: 23 января 2017 20:03 · Личное сообщение · #25 |
|
Создано: 26 января 2017 13:59 · Личное сообщение · #26 |
|
Создано: 01 марта 2017 18:42 · Личное сообщение · #27 Пишу скрипт на idc... Пожалел 100 раз, что в своё время не решил реализовывать обработку кода с разделением функций между idc и нативным приложением. Эту возможность можно реализовать, например, через пайпу - открыть канал и писать туда команды для нативного приложения, а по другому каналу можно принимать ответ... Почему именно так лучше? Потому что: 1) idc медленный, обработка строк, массивов занимает много больше времени, чем если бы нативно 2) idc ограничен в возможностях кодинга, приходится изобретать много чего, чтоб работало как надо ----- IZ.RU |
|
Создано: 03 марта 2017 03:59 · Поправил: difexacaw · Личное сообщение · #28 |
|
Создано: 03 марта 2017 17:55 · Поправил: DenCoder · Личное сообщение · #29 Вообще лучше, конечно, полностью независимая нативная реализация обработки кода с возможностью обмена информацией с идой. Но это займёт большее время, поскольку обрабатываемый код под процессор ARM. Подцель - детектов циклов и занесение их в список для целей дальнейшего поиска в них какого-то адреса. Для реализации этого нужно следить за пройденным путём, и если следующий адрес блока замечен где-то в пути, то выделять подпуть от того места до конца. На idc алго для этого построен на строках и массивах. Пройденный путь кода, в котором начальные адреса блоков, реализован на idc в виде строки типа Code:
Списков в idc нет, поэтому вместо списка массив, для образования которого используются функции GetLastIndex()/SetArrayLong(). Пройденный путь и подпути можно реализовать и в виде массива idc-функциями GetLastIndex()/SetArrayLong(), каждый массив с элементами цикла содержал бы тогда в имени уникальное строковое представление из одного или нескольких элементов цикла. Очень интересно в idaapi реализованы и строки, и массивы - нет ограничения по размеру. И это одна из возможных причин тормозов функций для работы с ними. 1600 блоков и выделение 300 циклов обрабатывается idc-скриптом около 8 сек. Если заменить эти функции на запись в пайпу, адреса блоков будут передаваться внешнему приложению. Весь вопрос - что быстрее? Преобразование адреса в строку и добавление её в другую или отправка/приём? Добавление элемента в idc-массив или отправка/приём? difexacaw пишет: Порты(LPC) на порядки шустрее. Использование LPC требует либо написания плагина для иды, либо перехвата каких-то функций иды(много вариантов, каких именно функций) и это время. Другой вариант - использовать питон вместо idc. И некогда все эти варианты тестировать, нужно просто знать. Глобальная цель - деобфускация. В замусоривании используются такие приёмы, которые раньше мне не встречались, потому назвал их "лжециклы" и "скрутка". Суть их объясню ниже. Поправьте, если подобное видели и этому есть общепринятое название. лжециклы всевозможные варианты реализации простой конструкции Code:
Например, Code:
скрутка В разных ветках кода имеется общий код проверки какого-то условия. В одной ветке условие истинно, в другой - ложно. Например Code:
В представлении графом асм-кода ветви кода выглядят переплетёнными, скрученными, откуда и название. Для деобфускации подобного пытался найти что-то готовое, не нашёл. Добавлено спустя -48 минут На текущий момент выделены из 344 циклов 24 настоящих, несущих полезную нагрузку 24 "лжецикла" с более сложной реализацией, ждут улучшения скрипта/улучшения общего подхода Остальные все обработаны - развёрнуты, но на это потребовалось при текущей реализации около 24 часов (с перерывами на сон, перекуры, ...). Работа проделывалась в полуавтоматическом режиме - указывался адрес, по которому скрипт делал своё дело. "Скрутки" были обнаружены в ходе работы. Сколько их - надо модифицировать алго. Добавлено спустя 2 часа 47 минут Определил, чем была произведена обфускация. Был использован Android Clang, основанный на известной компиляторной инфраструктуре LLVM. То есть обфускация производится на этапе компиляции. Попробую от этого оттолнкуться... ----- IZ.RU |
|
Создано: 04 марта 2017 03:06 · Поправил: DenCoder · Личное сообщение · #30 Бывает, видим использование какого-то регистра, сравнение или использование в вычислениях, а в ближайшем окружении выше не видно его установки. Функция огромная! Нужно найти адрес установки регистра. На помощь приходит скрипт(для ARM-инструкций): Code:
В скрипте не учтены инструкции LDM. функция CollectLoops() затормаживает процесс на 5-15 секунд при больших функциях. Интересно было бы увидеть, как это будет выглядеть на питоне, и насколько быстрей будет работать. По питону у меня пока уровень знаний чуть больше 0... Кстати, сбор всех циклов и блоков для целей поиска установки регистра не нужен. Не нужен, как оказалось и в моём скрипте, и в следующей модификации интегрирую функцию в findSetReg, чтобы сбор производился по необходимости. Скрипт обновлён 5 марта 2017. Исправлены ошибки в CollectLoops ----- IZ.RU |
|
Создано: 04 марта 2017 21:07 · Поправил: DenCoder · Личное сообщение · #31 Скрипту, конечно, нужна ещё оптимизация, что есть одно из последних дел... Чем полезен скрипт? Во-первых, экономит время и мозги в нахождении простых вещей. Во-вторых, это не просто скрипт, а алгоритм. И его можно переложить на любой другой язык, скриптовый или компилируемый. Может быть на питоне, может быть на си под capstone... Что сделать - это стратегия! Язык - это тактика, дело наживное! Не важно как, если не знать, что! В-третьих, с небольшими изменениями функции findSetReg() в него можно добавить findSetRegForward(поиск установки регистра вперёд) и findUseReg(поиск использования регистра вперёд), что вместе при должной доработке будет базой для деобфускации в части удаления мусорных инструкций, не управляющих ветвлением... Знаю - ничего нового я не открыл, примерно так же и работают деобфускаторы. Но в деобфускации я прохожу какой-то свой собственный путь, жалея время на чтиво(была б возможность параллельно читать теорию - непременно воспользовался бы). На пути иногда посматриваю налево и направо и вижу какие-то элементы теории. Например, прозрачные и непрозрачные предикаты. В VMProtect(также на пример) в невиртуализированном коде как раз используются прозрачные предикаты, в виртуализированном - непрозрачные, но только при несоблюдении условий проверки целостности кода и если стоит точка останова не первом байте вызываемой из вм апи-функции... Добавлено спустя -24 минут Пытаюсь поймать попутку, останавливают - не туда... Иногда подбрасывают поближе ) ----- IZ.RU |
<< . 1 . 2 . 3 . >> |
eXeL@B —› Дневники и блоги —› Блог DenCoder'а |