Сейчас на форуме: Magister Yoda (+3 невидимых) |
eXeL@B —› Основной форум —› Вопросы по написанию универсального распаковщика |
. 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 16 января 2009 11:21 · Поправил: Wolfram · Личное сообщение · #1 Привет всем! Форум читаю достаточно давно, узнал много нового, но сейчас возникли вопросы, на которые я не смог ответить самостоятельно, поэтому прошу помощи. Сначала краткая предыстория. Крякингом я занимаюсь меньше полугода, научился за это время ломать сильно тупые защиты, где разработчик понадеялся на упаковщик/протектор. Автоматическим распаковщиком (или на "полуавтомате" - break'n'enter - EP - bpm esp-4 - OEP - dump - ImpRec) снимаем защиту, патчим пару байт - и готово. Но это, понятно, проходит далеко не всегда. Тупая защита + не самый простой пакер = приехали И где-то месяца 2 назад я начал писать собственный универсальный распаковщик. Принцип действия у него задумывается такой: - создаём замороженный поток. - в EP втыкаем хук (jmp eip, чтобы не трассировать стандартным методом через TF, что обычно палится защитой) отпускаем программу до EP, замораживаем (SuspendThread), снимаем хук. - далее эмулируем работу подопытной программы на виртуальных регистрах, но на её реальной памяти (Read/WriteProcessMemory). - при этом ловим программу при возникновении исключений на входе в обработчик и на выходе из него; на возврате из системных вызовов (KiFastSystemCallRet); вообще, полностью отслеживаем передачу управления. Для этого предусмотрено втыкание хука в любое нужное место. - на всём пути выполнения каким-либо образом запоминаем порядок передачи управления и адреса участков памяти, которые были изменены в адресном пространстве подопытной программы. - когда доходим до OEP (определим, например, на основе статистики по нескольким файлам, покарёженных одним и тем же пакером), дампим всё, что было изменено. - восстанавливаем импорт (пока с этим вопросом подробно не разбирался) - делаем ещё какие-нибудь дополнительные приседания - получаем рабочий дамп, который можно изучать в дизассемблере Понятно, что, например, для Armadillo дополнительных приседаний будет очень много, но ASProtect вполне мог бы поддаться на такую провокацию. С него я и решил начать. Запаковал виндовский блокнот с помощью ASProtect2.1, научился проходить на EP и стал "обучать" свой распаковщик ассемблерным инструкциям по одной. Проверка простая: если при встрече с незнакомой инструкцией актуализировать контекст и отпустить программу (ResumeThread), и она не грохнется, то с большой вероятностью все предыдущие инструкции выучены правильно. <отредактировано Wolfram> (Перенёс первый вопрос в свой второй пост, чтобы он не повторялся на каждой странице) Заранее спасибо за ответы. Прошу модераторов не закрывать данную тему, когда они будут получены, потому что распаковщик пишется, и новые вопросы непременно будут возникать. |
|
Создано: 16 января 2009 11:47 · Личное сообщение · #2 |
|
Создано: 16 января 2009 12:00 · Поправил: Wolfram · Личное сообщение · #3 Теперь о наших успехах в учёбе. Вот протокол трассировки с EP: 01001000 6801400101 PUSH 01014001 01001005 E801000000 CALL 0100100B 0100100B C3 RET 0100100A C3 RET 01014001 60 PUSHAD 01014002 E803000000 CALL 0101400A 0101400A 5D POP EBP 0101400B 45 INC EBP 0101400C 55 PUSH EBP 0101400D C3 RET 01014008 EB04 JMP 0101400E 0101400E E801000000 CALL 01014014 01014014 5D POP EBP 01014015 BBEDFFFFFF MOV EBX, FFFFFFEDh 0101401A 03DD ADD EBX, EBP Всё это до последнего pop корректно исполняется и, если программу отпустить, то она спокойно продолжит своё выполнение. На этом успехи в обучении кончаются. Если попытаться сделать то же самое после mov, то "...Приложение будет закрыто". Если же, находясь на pop, поставить хук на add и проскочить mov, то всё нормально запускается. Самая вероятная причина, конечно, - косяк в эмуляции mov. Но всё, что эта функция делает - это загрузка в ebx числа 0xffffffed и увеличение eip на 5. Неужели реальный mov делает что-то ещё? (Если в OllyDbg, находясь на mov, занопить его, пройти на add, вернуть всё на место, а затем выполнить вручную указанные операции, то прога запускается, т.е. отладчик знает, что "ещё" нужно сделать). Однако до меня это так и не дошло, поэтому спрашиваю: в чём может быть дело? Возможно, это тупой вопрос, но я перерыл кучу литературы и ответа на него не нашёл. 2borov: Я же говорю: патчить просто, когда встроенная защита тупая, да ещё файл ничем не запакован или распаковался автоматической тулзой. А я сейчас поставил перед собой задачу распаковки в более общем смысле, а не взлома. И надеюсь на помощь на этом нелёгком пути. |
|
Создано: 16 января 2009 13:37 · Личное сообщение · #4 |
|
Создано: 16 января 2009 13:56 · Поправил: Gideon Vi · Личное сообщение · #5 Wolfram, ты не пужайся, подтянуться люди окромя флудерастов, посоветуют. В кой-то веке что-то интересное Loco пишет: что берет твой распаковщик ничего Loco пишет: на каком языке пишешь? какая тебе разница? borov пишет: раз тебе патчить это просто, а ты хочешь сложностей, тогда кейгень Вообще туши свет. |
|
Создано: 16 января 2009 13:56 · Личное сообщение · #6 Пишу на C в Visual Studio 2003. Он пока ничего не берёт, он ещё маленький, ходит в школу и учит ассемблерные инструкции . А mov ему не даётся, и я прошу помочь понять, почему. Сейчас нашёл ещё проще пример - запаковал тот же блокнот MEW1.1. Там начало такое: 0101FD4A E90504FEFF JMP 01000154 01000154 BE1C500101 MOV ESI, 0101501C 01000159 8BDE MOV EBX, ESI Jmp обрабатывается корректно, если не делаем первый mov, то прога выполняется дальше. Если сделали - всё падает. А если проделываем то же самое вручную в отладчике - работает. В общем, та же история... Только здесь проблемы начинаются со второй строчки, вроде бы и ошибаться-то негде! Что ещё происходит при выполнении этого mov, кроме изменения регистра-приёмника и увеличения eip? |
|
Создано: 16 января 2009 14:27 · Личное сообщение · #7 |
|
Создано: 16 января 2009 14:58 · Личное сообщение · #8 |
|
Создано: 16 января 2009 15:01 · Поправил: mak · Личное сообщение · #9 Wolfram ты должен проверить обращения к памяти , где чтение может быть запрещено или типо этого. Это ошибка работы с памятью когда ты гонишь в Отладчике и там нет исключения а в обыкновенном варианте есть. Или убери любые игноры на исключения , хотя я думаю те это врядли поможет, что же касается инструкции mov то вот как раз та и причина , эмуляция видимо выполняет неправомерные дейстивия. Решение простое =) ставь сех на этот участок и запускай еще раз в сехе ставь месагу с обработкой адреса исключения и узнаешь быстро где у тя проблемы с памятью. ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube |
|
Создано: 16 января 2009 15:12 · Личное сообщение · #10 Дизассемблер встроенный в Olly. Кажется, я вышел на след решения проблемы. Когда, перед тем как сделать ResumeThread я делаю SetThreadContext, то реально контекст не устанавливается! (смотрел в Olly). Сейчас копаюсь в MSDN, ищу, как изменить права доступа к потоку, чтобы это можно было сделать. Кто пишет на С, может, посоветуете? Там нужно 1-2 строчки дописать, только какие? Сам ищу, но пока безуспешно. |
|
Создано: 16 января 2009 16:09 · Личное сообщение · #11 Глядя на концепт-сразу скажу про потенциальные косяки и ограничения: -патчить код на оеп не всегда хорошо, ТЛС коллбек может пропалить это; -полная эмуляция кода распаковщика штука адская, учитывая трюки антэмуляции и тд, писать будешь до пенсии; -если дампить всё, что изменено, дамп будет под 100М, ибо там будет стек, куча, возможно, патч системных либ и фиг знает, что ещё; -если за основу ОЕП брать статистику по пакеру, это не generic unpacker, а multi unpacker, другими словами, неизвестное не возьмёт; -не совсем ясно, как ставится хук, если за основу взят DebugApi-это зло; -некоторые концептуальные вещи могут быть не охвачены, типа многопоточности: иногда расшифровкой кода занимается 1 поток, он запускает поток 2, который и идёт на оеп, а 1 дохнет, как это будет обработано-хз. Если по делу-прошагай mov своим эмулем и в ольке да сравни результаты все внимательно, включая флаги. Что значит контекст не устанавливается? Если функа вернула успех-значит, устанавливается. Открывай с правами на полный доступ и не заморачивайся, этого точно хватит. З.Ы. Не пытайся играться с контекстом до ЕП, запуск процесса происходит хитро, там 1 потоком не обходится, поэтому до ЕП контекст не трогай. |
|
Создано: 16 января 2009 17:42 · Личное сообщение · #12 |
|
Создано: 16 января 2009 18:38 · Личное сообщение · #13 Многие скажут, что флуд, но не могу не высказаться. Прошу читать и попытаться воспринять объективно. Wolfram взялся изначально за неподъемную задачу. Loco спросил на чем Wolfram пишет и Loco сразу сказали - флудер. А вопрос ведь по делу. Wolfram пишет в Визуал Студио, навыки, судя по всему, программирования имеет небольшие, тож касается и знания крэкинга. Отсюда напрашивается вывод, с программированием дружит слабо. Далее. Любой программист ставит конкретные задачи, т.к. знает, что объемные бессмысленные задачи просто практически не реализуемы одним человеком, а иногда даже и десятком программистов. Вот перлы: Wolfram пишет: - при этом ловим программу при возникновении исключений на входе в обработчик и на выходе из него; на возврате из системных вызовов (KiFastSystemCallRet); вообще, полностью отслеживаем передачу управления. Для этого предусмотрено втыкание хука в любое нужное место. Wolfram пишет: - на всём пути выполнения каким-либо образом запоминаем порядок передачи управления и адреса участков памяти, которые были изменены в адресном пространстве подопытной программы. Wolfram пишет: - восстанавливаем импорт (пока с этим вопросом подробно не разбирался) - делаем ещё какие-нибудь дополнительные приседания И напоследок: писался уже один универсальный распаковщик QuickUpack, а потом было объяснением людей его писавших, почему проект закрыт. Wolfram никогда не реализиует свой проект, потому что изначально поставлены нереальные цели. |
|
Создано: 16 января 2009 19:07 · Личное сообщение · #14 |
|
Создано: 17 января 2009 00:02 · Личное сообщение · #15 Wolfram пишет: Самая вероятная причина, конечно, - косяк в эмуляции mov. Wolfram пишет: Когда, перед тем как сделать ResumeThread я делаю SetThreadContext, то реально контекст не устанавливается! Как можно состыковать эмуляцию и виндовые апи работы с контекстом??? 0_o Wolfram пишет: Если попытаться сделать то же самое после mov, то "...Приложение будет закрыто". А это как вообще может быть? Эмулируешь команды, а ругается винда??? Как при эмуляции прога может упасть??? Может возникнуть эксепшн в эмуляторе, но прога то при чем, это же не процесс а образ в эмуляторе. ИМХО понос мыслей. ----- Yann Tiersen best and do not fuck |
|
Создано: 17 января 2009 00:48 · Личное сообщение · #16 |
|
Создано: 17 января 2009 02:20 · Личное сообщение · #17 |
|
Создано: 17 января 2009 02:51 · Личное сообщение · #18 |
|
Создано: 17 января 2009 16:29 · Личное сообщение · #19 |
|
Создано: 17 января 2009 16:40 · Личное сообщение · #20 pavka пишет: А если к примеру пеп дампить? Ниче, те у кого 3 гига смогут себе это позволить, но нафиг, да и не надо о этом париться так как пепой ничено, кроме продктов автора не накрыто. progopis, верно, ap0x сначала написал несколько распаковщиков, потом специальный сдк создал, а потом и автораспаковщик сделал. Wolfram, напиши лучше хоть просто дескрэмблер для какого-нибудь скрэмблера, о я придумал, для ASPack Scrambler 0.2, на каком-то сайте видел тутор для написания дескремблера UPX |
|
Создано: 17 января 2009 16:58 · Личное сообщение · #21 Вообще Generic Unpacker-ов несколько есть. Лучше уж начать с разглядывания их. QuickUnpack, Generic unpacker от deroko, RL!dePacker, GUnPacker, VM Unpacker. Последний не generic, а multi, ещё и статик. Ну и, возможно, не совсем обоснованно накинулись сразу. Как говорил Эйнштейн, открытия делаются так: все знают, что это сделать нельзя, но находится 1 неуч, который этого не знает, он то и делает открытие. З.Ы. Тестеров тут и много, может, да вот только QuickUnpack реально тестили люди, которых пересчитать по пальцам 1 руки можно. Если не брать в расчёт возгласы типа кг/ам, потырен файндер из пеид и импорт из импрека, что же сделал автор. Или: кг/ам у меня не пашет, при этом на все пожелания выложить, где и на чём не пашет, было тихо. Видимо, никому не надо было, потому и был закрыт. Ну да ладно. Просто к тому, что на тестеров я бы не очень надеялся. |
|
Создано: 17 января 2009 17:09 · Поправил: Flashback/TMX · Личное сообщение · #22 |
|
Создано: 17 января 2009 17:38 · Личное сообщение · #23 |
|
Создано: 17 января 2009 17:57 · Личное сообщение · #24 |
|
Создано: 17 января 2009 19:40 · Личное сообщение · #25 AoRE Unpacker берет: !EP_(EXE_Pack)_1.2
|
|
Создано: 17 января 2009 19:46 · Личное сообщение · #26 |
|
Создано: 17 января 2009 19:55 · Поправил: Demon666 · Личное сообщение · #27 Archer ИМХО, зря заморозил проект ;( Хз. попробую высказать свое мнение по QUnpack, короче что думаю Насчет тестеров, надо брать пример с китайчиков – они пишут "что анпакер анпачит все, что движеццо и шевелиццо", при этом функционала там до заявленного.. Ну чтобы не пиздеть, лучше потереть в реадми абзац со списком протов, которые может анпачить QUnpack Тогда сталобыть (возможно) что начнут пробовать на всем на чем только можно Это как минимум создаст движняк(нужный!), а лучше позиционировать как анпачед ВСЕ Думаю тут многие удивлялись что написано анпачед фимку, а на "UPX" падает – тут главное не то что падает, а то что его юзают и пытаются найти чтобы хоть что-то заанпачил %)) Что касается SDK Экспортировать все что только можно(из фунок которые ты сам юзаешь внутри QUnpack(типа как у оли)), для начала просто даже можно без описания просто прототипы на дельфи/си/ASM Назвать их просто осмыслено чтобы интуитивно понятно было(типа как у тебя скриптовые команды названы – DisableBreakAll, GetProcAddress итд.),ну уж вообще чтобы классно было небольшое описание этих фунок, ну и маленький проектик(пример) Насчет скриптов там ты их называл типа как для кодера больше подходящие, но не для крэкера ИМХО, неправильный подход – лучше название команд сделать как в олискрипт типа: RUN, BC, GPA итд. Луа позволяет все это без проблем реализовать Есть даже более - специальные хаки, для более мощного расширения http://lua-users.org/lists/lua-l/2008-01/msg00654.html http://lua-users.org/lists/lua-l/2008-01/msg00654.html гуд весч, сам юзаю.. Еще че заметил, что проект лежит мертвый а потом через год-два начинают, появляться тем кому действительно это нужно А хс - даже больше скажу: - это так всегда на 90%! Все это - ИМХО ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 18 января 2009 04:46 · Личное сообщение · #28 |
|
Создано: 18 января 2009 05:00 · Личное сообщение · #29 Archer пишет: Вообще Generic Unpacker-ов несколько есть. Лучше уж начать с разглядывания их. QuickUnpack, Generic unpacker от deroko, RL!dePacker, GUnPacker, VM Unpacker. Вообще то GUnPacker позиционируется как хелпер.. что имхо правильно.. Для сложных протекторов , реверсерам нужен именно хелпер Для простых статик VM Unpacker лучший вариант |
|
Создано: 18 января 2009 05:01 · Личное сообщение · #30 |
. 1 . 2 . 3 . >> |
eXeL@B —› Основной форум —› Вопросы по написанию универсального распаковщика |