Сейчас на форуме: Magister Yoda (+3 невидимых)

 eXeL@B —› Основной форум —› Вопросы по написанию универсального распаковщика
. 1 . 2 . 3 . >>
Посл.ответ Сообщение

Ранг: 11.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 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>
(Перенёс первый вопрос в свой второй пост, чтобы он не повторялся на каждой странице)

Заранее спасибо за ответы. Прошу модераторов не закрывать данную тему, когда они будут получены, потому что распаковщик пишется, и новые вопросы непременно будут возникать.




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 16 января 2009 11:47
· Личное сообщение · #2

Wolfram пишет:
снимаем защиту, патчим пару байт - и готово. Тупая защита + не самый простой пакер = приехали

раз тебе патчить это просто, а ты хочешь сложностей, тогда кейгень

-----
Лучше быть одиноким, но свободным © $me




Ранг: 11.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 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:
Я же говорю: патчить просто, когда встроенная защита тупая, да ещё файл ничем не запакован или распаковался автоматической тулзой. А я сейчас поставил перед собой задачу распаковки в более общем смысле, а не взлома. И надеюсь на помощь на этом нелёгком пути.




Ранг: 118.1 (ветеран)
Активность: 0.140
Статус: Участник

Создано: 16 января 2009 13:37
· Личное сообщение · #4

Тогда напрашуется вопрос следущего содержания: что берет твой распаковщик, на каком языке пишешь?

-----
PSP-Gamer.ru





Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 16 января 2009 13:56 · Поправил: Gideon Vi
· Личное сообщение · #5

Wolfram, ты не пужайся, подтянуться люди окромя флудерастов, посоветуют. В кой-то веке что-то интересное

Loco пишет:
что берет твой распаковщик


ничего

Loco пишет:
на каком языке пишешь?


какая тебе разница?

borov пишет:
раз тебе патчить это просто, а ты хочешь сложностей, тогда кейгень


Вообще туши свет.



Ранг: 11.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 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?




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 16 января 2009 14:27
· Личное сообщение · #7

какой ты используешь дизассемблер? может быть, косяк в нём?
ты проверяешь инструкции на корректность?

-----
EnJoy!





Ранг: 105.9 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 16 января 2009 14:58
· Личное сообщение · #8

Не совсем понятно как происходит эмуляция, но есть предположение, что при эмуляции mov меняются флаги, которые меняться не должны.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 16 января 2009 15:01 · Поправил: mak
· Личное сообщение · #9

Wolfram ты должен проверить обращения к памяти , где чтение может быть запрещено или типо этого. Это ошибка работы с памятью когда ты гонишь в Отладчике и там нет исключения а в обыкновенном варианте есть. Или убери любые игноры на исключения , хотя я думаю те это врядли поможет, что же касается инструкции mov то вот как раз та и причина , эмуляция видимо выполняет неправомерные дейстивия. Решение простое =) ставь сех на этот участок и запускай еще раз в сехе ставь месагу с обработкой адреса исключения и узнаешь быстро где у тя проблемы с памятью.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 11.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 16 января 2009 15:12
· Личное сообщение · #10

Дизассемблер встроенный в Olly.
Кажется, я вышел на след решения проблемы. Когда, перед тем как сделать ResumeThread я делаю SetThreadContext, то реально контекст не устанавливается! (смотрел в Olly). Сейчас копаюсь в MSDN, ищу, как изменить права доступа к потоку, чтобы это можно было сделать. Кто пишет на С, может, посоветуете? Там нужно 1-2 строчки дописать, только какие? Сам ищу, но пока безуспешно.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 16 января 2009 16:09
· Личное сообщение · #11

Глядя на концепт-сразу скажу про потенциальные косяки и ограничения:
-патчить код на оеп не всегда хорошо, ТЛС коллбек может пропалить это;
-полная эмуляция кода распаковщика штука адская, учитывая трюки антэмуляции и тд, писать будешь до пенсии;
-если дампить всё, что изменено, дамп будет под 100М, ибо там будет стек, куча, возможно, патч системных либ и фиг знает, что ещё;
-если за основу ОЕП брать статистику по пакеру, это не generic unpacker, а multi unpacker, другими словами, неизвестное не возьмёт;
-не совсем ясно, как ставится хук, если за основу взят DebugApi-это зло;
-некоторые концептуальные вещи могут быть не охвачены, типа многопоточности: иногда расшифровкой кода занимается 1 поток, он запускает поток 2, который и идёт на оеп, а 1 дохнет, как это будет обработано-хз.

Если по делу-прошагай mov своим эмулем и в ольке да сравни результаты все внимательно, включая флаги.
Что значит контекст не устанавливается? Если функа вернула успех-значит, устанавливается. Открывай с правами на полный доступ и не заморачивайся, этого точно хватит.
З.Ы. Не пытайся играться с контекстом до ЕП, запуск процесса происходит хитро, там 1 потоком не обходится, поэтому до ЕП контекст не трогай.



Ранг: 1045.7 (!!!!), 31thx
Активность: 0.570
Статус: Участник

Создано: 16 января 2009 17:42
· Личное сообщение · #12

Archer пишет:
-если дампить всё, что изменено, дамп будет под 100М

А если к примеру пеп дампить?



Ранг: 53.8 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 16 января 2009 18:38
· Личное сообщение · #13

Многие скажут, что флуд, но не могу не высказаться. Прошу читать и попытаться воспринять объективно.
Wolfram взялся изначально за неподъемную задачу. Loco спросил на чем Wolfram пишет и Loco сразу сказали - флудер. А вопрос ведь по делу. Wolfram пишет в Визуал Студио, навыки, судя по всему, программирования имеет небольшие, тож касается и знания крэкинга. Отсюда напрашивается вывод, с программированием дружит слабо. Далее. Любой программист ставит конкретные задачи, т.к. знает, что объемные бессмысленные задачи просто практически не реализуемы одним человеком, а иногда даже и десятком программистов. Вот перлы:
Wolfram пишет:
- при этом ловим программу при возникновении исключений на входе в обработчик и на выходе из него; на возврате из системных вызовов (KiFastSystemCallRet); вообще, полностью отслеживаем передачу управления. Для этого предусмотрено втыкание хука в любое нужное место.


Wolfram пишет:
- на всём пути выполнения каким-либо образом запоминаем порядок передачи управления и адреса участков памяти, которые были изменены в адресном пространстве подопытной программы.

Wolfram пишет:
- восстанавливаем импорт (пока с этим вопросом подробно не разбирался)
- делаем ещё какие-нибудь дополнительные приседания


И напоследок: писался уже один универсальный распаковщик QuickUpack, а потом было объяснением людей его писавших, почему проект закрыт.
Wolfram никогда не реализиует свой проект, потому что изначально поставлены нереальные цели.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 16 января 2009 19:07
· Личное сообщение · #14

dimaxmaster +1

по теме, полезнее было бы накодить эмулятор, засунуть его в длл, вывести основные функции в экспорт и снабдить подробным описанием, вот это было бы полезно и более реально.

-----
[nice coder and reverser]





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 17 января 2009 00:02
· Личное сообщение · #15

Wolfram пишет:
Самая вероятная причина, конечно, - косяк в эмуляции mov.


Wolfram пишет:
Когда, перед тем как сделать ResumeThread я делаю SetThreadContext, то реально контекст не устанавливается!


Как можно состыковать эмуляцию и виндовые апи работы с контекстом??? 0_o

Wolfram пишет:
Если попытаться сделать то же самое после mov, то "...Приложение будет закрыто".


А это как вообще может быть? Эмулируешь команды, а ругается винда??? Как при эмуляции прога может упасть??? Может возникнуть эксепшн в эмуляторе, но прога то при чем, это же не процесс а образ в эмуляторе.

ИМХО понос мыслей.

-----
Yann Tiersen best and do not fuck




Ранг: 78.8 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 17 января 2009 00:48
· Личное сообщение · #16

у топикстартера в голове каша.. либо от незнания теории, либо от путаницы..
хочешь совет - не гонись за количеством, а гонись за качеством.. напиши хотя бы один анпакер... например для mew (fsg, upx, pecompact....) и дай народу потестить.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 17 января 2009 02:20
· Личное сообщение · #17

UnPackMan
Так ему и дали совет: начинать не с универсального, а хотя бы для одного написать. ИМХО лучше UPX, так как импорт вообще не защищён. И OEP найти легко по восстановлению стека.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 17 января 2009 02:51
· Личное сообщение · #18

Правильно, начни с простого, и цепляй к одной проге плагами...
По мере накопления опыта будешь по-немногу прогу расширять и доводить до ума
а тестеров тут много, быстро фикситься всё будет... И может получится в результате что-то приятное

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 62.9 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 17 января 2009 16:29
· Личное сообщение · #19

Wolfram
Если бы ты показал код, то все проблемы были бы решены за пару секунд.



Ранг: 64.4 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 17 января 2009 16:40
· Личное сообщение · #20

pavka пишет:
А если к примеру пеп дампить?

Ниче, те у кого 3 гига смогут себе это позволить, но нафиг, да и не надо о этом париться так как пепой ничено, кроме продктов автора не накрыто.
progopis, верно, ap0x сначала написал несколько распаковщиков, потом специальный сдк создал, а потом и автораспаковщик сделал.
Wolfram, напиши лучше хоть просто дескрэмблер для какого-нибудь скрэмблера, о я придумал, для ASPack Scrambler 0.2, на каком-то сайте видел тутор для написания дескремблера UPX




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 17 января 2009 16:58
· Личное сообщение · #21

Вообще Generic Unpacker-ов несколько есть. Лучше уж начать с разглядывания их. QuickUnpack, Generic unpacker от deroko, RL!dePacker, GUnPacker, VM Unpacker. Последний не generic, а multi, ещё и статик.
Ну и, возможно, не совсем обоснованно накинулись сразу. Как говорил Эйнштейн, открытия делаются так: все знают, что это сделать нельзя, но находится 1 неуч, который этого не знает, он то и делает открытие.
З.Ы. Тестеров тут и много, может, да вот только QuickUnpack реально тестили люди, которых пересчитать по пальцам 1 руки можно. Если не брать в расчёт возгласы типа кг/ам, потырен файндер из пеид и импорт из импрека, что же сделал автор. Или: кг/ам у меня не пашет, при этом на все пожелания выложить, где и на чём не пашет, было тихо. Видимо, никому не надо было, потому и был закрыт. Ну да ладно. Просто к тому, что на тестеров я бы не очень надеялся.



Ранг: 64.4 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 17 января 2009 17:09 · Поправил: Flashback/TMX
· Личное сообщение · #22

Archer, а от AoRE? Я бы тестил, я люблю тестить.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 17 января 2009 17:38
· Личное сообщение · #23

А у аоре есть какие-то генерик анпакеры разве? У них много разных узкоспециализованных анпакеров, типа для аспака, пекомпакта и тд свалены в кучу (да и то не ихние)-это знаю, а про именно ихний генерик не слышал.




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 17 января 2009 17:57
· Личное сообщение · #24

Есть, но у меня он многое не хотел анпакать

-----
Лучше быть одиноким, но свободным © $me




Ранг: 78.8 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 17 января 2009 19:40
· Личное сообщение · #25

AoRE Unpacker берет:

!EP_(EXE_Pack)_1.2
antiOllyDBG
ASDPack 2.0
ASPack v2.12
AverCryptor 1.0
CryptX 1.0
dePack
DexCrypt 2.0
eXPressor 1.2.0/1.3.0.1
GHF Protector (packing Only)
HidePE
HidePX
JeyJey_UPX_Protector
MEW_1.1
Molebox 2.2.4
Morphnah 0.2
NsPack 2.9/3.0/3.3/3.4/3.6/3.7
Packman V0.0.0.1/Packman V1.0
PC Shrinker 0.71
PE_Lock_NT_2.04
PE Pack 1.0
PeCompact 1.30/1.50/1.84
Pohernah 1.0.1/1.0.3 (standard)
PolyEnE_0.01
RCryptor 1.1
ReCrypt_0.15
SimplePack 1.0X/1.11/1.21
Ste@lth PE 2.10
The Best Cryptor
Mucki's Protector 2
UPX 1.25/1.91/2.00/2.01/2.02/2.90/3.00/3.01
UPXScramb_2.2





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 17 января 2009 19:46
· Личное сообщение · #26

все к чему есть открытые сорсы, или есть сорсы анпакеров

-----
Лучше быть одиноким, но свободным © $me




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 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




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 18 января 2009 04:46
· Личное сообщение · #28

Ссори за флуд.
Интересно а кто не будь писал анпакер с AI?
Просто знаю одни черти писале на прологе софтину-анпакер с AI самое интересное что оно реально работало причем еще и самообучалось.



Ранг: 1045.7 (!!!!), 31thx
Активность: 0.570
Статус: Участник

Создано: 18 января 2009 05:00
· Личное сообщение · #29

Archer пишет:
Вообще Generic Unpacker-ов несколько есть. Лучше уж начать с разглядывания их. QuickUnpack, Generic unpacker от deroko, RL!dePacker, GUnPacker, VM Unpacker.

Вообще то GUnPacker позиционируется как хелпер.. что имхо правильно..
Для сложных протекторов , реверсерам нужен именно хелпер
Для простых статик VM Unpacker лучший вариант




Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 18 января 2009 05:01
· Личное сообщение · #30

и в чем выражалось самообучение?


. 1 . 2 . 3 . >>
 eXeL@B —› Основной форум —› Вопросы по написанию универсального распаковщика
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати