![]() |
eXeL@B —› Протекторы —› Распаковка AsProtect >1.23 - от А до Я. |
<< . 1 . 2 . 3 . 4 . 5 . >> |
Посл.ответ | Сообщение |
|
Создано: 18 августа 2005 11:56 · Поправил: nice · Личное сообщение · #1 Эта тема по распаковке AsProtect'a последних версий, для надругательств выбрана программа: AlfaClock 1.82 сайт программы: www.alfasoftweb.com/rus/ прямая ссылка: www.alfasoftweb.com/rus/AlfaClock_rus.exe В этот раздел можно постить всё что касается защиты в этой программе, а также скрипты для распаковки, утилиты для снятия, ссылки на статьи. За флейм будем наказывать! Нашел ОЕР inferno_mteam 004C5444 55 PUSH EBP 004C5445 8BEC MOV EBP,ESP 004C5447 83C4 C0 ADD ESP,-40 004C544A 53 PUSH EBX 004C544B 33C0 XOR EAX,EAX 004C544D 8945 D4 MOV DWORD PTR SS:[EBP-2C],EAX 004C5450 8945 D0 MOV DWORD PTR SS:[EBP-30],EAX В Ольке можно быстро попасть на ОЕР сл. образом, открываем программу, жмем Ctrl+G (перейти на строку) вбиваем туда ОЕР=04С5444, правой кнопкой мыши: Breakpoint->Hardware, on execution после чего отключаем все Exceptions: menu->Options->Exceptions и ставим все галочки, .теперь нажите F9 и вы на ОЕР ----- Подписи - ЗЛО! Нужно убирать! ![]() |
|
Создано: 03 октября 2005 02:28 · Личное сообщение · #2 |
|
Создано: 03 октября 2005 02:50 · Личное сообщение · #3 |
|
Создано: 03 октября 2005 07:49 · Личное сообщение · #4 На досуге решил попробовать распаковать Advanced Archive Password Recovery 3. Смотрю, а импорт там уже по другому восстанавливать надо и по мимо FF15 и FF25 есть ещё callыVM и все они на одно лицо, сейчас пытаюсь разобраться кто есть кто. FF25 видно из далека они все в низу, а с остальными пока проблема. Если заентересуешся ссылка на прогу есть в одноимённом топике на форуме. Что касается IAT то сейчас часть скрипта выглядит примерно так : @reconstruct: mov OEP,eip bp VirtualAllocAddr run mov temp, esp add temp, 40 mov realfunction, [temp] run mov temp, esp add temp, 2C cmp realfunction, [temp] je ee add temp, 40 mov realfunction, [temp] ee: bc VirtualAllocAddr mov eip,OEP// здесь соответственно адреэтого кела bp OEP run bc OEP Однко какую прогу не возьми практически везде подходы разные. Однако плодовитый товарищ Солодовников. ![]() |
|
Создано: 03 октября 2005 20:21 · Личное сообщение · #5 Да мне хотелось бы закончить начатую прогу. Я разобрался, почему в некоторых Call VM скрипт выдает неправильный адрес возврата. Но пока не знаю, как это исправить. Если не разобраться в принципе формирования адреса возврата, то получение адреса возврата из ВМ возможно только при прохождении кода, т.е в динамике. Статическое сканирование кода (как мы делали ранее) приводит к не всегда верным результатам. В принципе, используя уже существующие наработки, можно и в ручную. Но уж больно долго. У меня есть вопрос, я уже ранее его задавал, но никто не среагировал. Как в Олли посмотреть в динамике изменение какой-нибудь локальной переменной (или нескольких)? Почему у меня не получается привести диссасемблерный текст программы к виду, например: Mov [eax],[Local.35]. При этом, необходимые крыжики в опциях стоят. Делал анализ кода (use все три опции), ничего не меняется. ![]() |
|
Создано: 03 октября 2005 23:21 · Личное сообщение · #6 Я тоже не дождался подсказки по формированою правельного смещения. Да делал в ручную и pushы переделывал и прикрутил к файлу, не надо в память подгружать, а вот адреса селлов пришлось переписывать, а так не плохо получилось( селлы у меня только там где были пуши, остальные джампы), но гдето вкралась ошибка, а перелопачивать это сного не хочу. А вот и о Advanced Archive Password: Похоже здесь всё очень просто, восстановили импорт нижние идущие подряд FF25, все остальные FF15. Только одно но, после некоторых Сall [ addr IAT] появляются нелепые инструкции типа PS, ?? и т.д. и для того чтобы вернуть всё к удобочитаемому варианту необходимо первый байт после Сall [ addr IAT] изменить #90# и всё вернётся на круги своя. Вот вообщем и вся распаковка, прога прекрасно работает. Спасибо ребятам с одноимённого топика за нужные байты. Давно хотел заиметь подобную прогу, а то на предыдущую версию терпения не хватило. ![]() |
|
Создано: 04 октября 2005 01:46 · Личное сообщение · #7 |
|
Создано: 04 октября 2005 03:20 · Личное сообщение · #8 |
|
Создано: 04 октября 2005 03:27 · Личное сообщение · #9 |
|
Создано: 04 октября 2005 06:21 · Личное сообщение · #10 |
|
Создано: 04 октября 2005 07:46 · Поправил: SergSh · Личное сообщение · #11 |
|
Создано: 05 октября 2005 03:49 · Личное сообщение · #12 Нашёл про адреса. Вот накропал пока замену Pusha c Celloм попробуй вроде робит. Осталось разобраться со смещениями при возврате с адресом Cell из проги: var x var ak var y var puh var cal mov x, eip mov y, eip sub eip,5 mov ak,[eip] and ak, 000000ff cmp ak,00000068 jne kon add eip,1 mov puh,[eip] mov cal, 13A0000 add x,5 sub puh,x mov ak,puh and puh,0000ff00 add puh,3 cmp puh,0 sub puh,3 je kor mov eip,y mov [eip],E9 add eip,1 and [eip],ffff0000 add [eip],ak jmp DAL kor: mov eip,y mov [eip],EB add eip,1 mov [eip],90909000 add [eip],ak jmp DAL DAL: mov eip,y sub eip,5 mov [eip],E8 sub cal,5 sub cal,eip add eip,1 mov [eip],cal pause kon: ret ![]() |
|
Создано: 05 октября 2005 06:14 · Личное сообщение · #13 SergSh пишет: Нашёл про адреса Ты хоть бы писал, что прежней проге вернулся. А то ведь не понять с ходу, что ты делаешь. У меня ведь немного другой подход, я эти Pushи не трогаю пока. И вообще, я зарылся в обнаружение функций с двумя адресами вовзрата (в зависимости от флага Z). Идет очень сложно, делаю пока в ручную. В скрипте реализовать его не получилось. В одной из функций флаг поменялся через примерно 20-й цикл прохождения через функцию. А в других он не меняется. Пока попадаются ошибки, связанные как раз с этими двуликими функциями. ![]() |
|
Создано: 07 октября 2005 00:14 · Личное сообщение · #14 |
|
Создано: 07 октября 2005 02:14 · Поправил: tar4 · Личное сообщение · #15 |
|
Создано: 07 октября 2005 02:50 · Личное сообщение · #16 |
|
Создано: 07 октября 2005 05:14 · Личное сообщение · #17 Может тебе поможет. У меня в скрипте была проблема, связанная с тем, что он не реагировал на изменение значения флага (0 или 1). Я решил ее просто. Изменение флага продублировал изменением некой переменной. Ну, которую сам создал. И сравнивал, не возвращаемое значение флага, а значение переменной. Вроде работало. А в причине не стал разбираться. У меня вообще сложилось впечатление, что в скриптовом алгоритме достаточно много глюков (Это только мое мнение). ![]() |
|
Создано: 07 октября 2005 15:05 · Личное сообщение · #18 |
|
Создано: 07 октября 2005 23:35 · Поправил: tar4 · Личное сообщение · #19 |
|
Создано: 08 октября 2005 01:37 · Личное сообщение · #20 Я, по-видимому, подошел к распаковке 2-й части проги. В ней адреса входа и выхода из ВМ уже другие. Сразу не понял, потерял время. Хочу пройти пока вручную, а уже потом пытаться как автоматизировать эту работу. Слишком много нюансов. Адрес возврата из функций меняются не только по факту изменения флага Z в последовательности (сначало 0, затем 1), а так же есть случаи и наоборот. То есть, может быть 1, затем 0, затем снова 1. ![]() |
|
Создано: 08 октября 2005 06:32 · Личное сообщение · #21 |
|
Создано: 09 октября 2005 09:35 · Личное сообщение · #22 Кажись разобрался в прыжках. Всё оказалось довольно просто. Происходит так: До прыжка по JMP [esp-4] есть такой код ....6F44 JB ....6F58 ....6F46 JE ....6F85 ....6F48 DEC AL ....6F4A JE ....6FD2 ..................... ..................... ....7006 JE ....701F- меняя условный переход в этом месте добиваемся смены в JMP [esp-4]. ..................... ..................... ....6F65 JNZ ....6F77- если этот переход не происходит то в JMP [esp-4] адрес из проги. Адрес из проги будет возвращён только когда перед CALL 013A0000 будет PUSH addr. Из этого делаем вывод, что если есть PUSH addr, то CALL 013A0000 не надо проходить дважды. Если же этот переход происходит то JMP [esp-4] то -же сменится, т.к. установлен флаг "С", но меняя переход по ....7006 мы добьёмся такого-же результата не зависимо от того установлен флаг "С" или нет. Завтра попробую реализовать. ![]() |
|
Создано: 10 октября 2005 23:06 · Личное сообщение · #23 Придумал как осуществить автоматический поиск CALL 013A0000. Их надо искать не по названию, как это делалось ренее, а по смещению. Примерно так: @continue: mov filesecend, 13A0000 findop startscan, #E8# //Ищем оп-код call`а mov startscan, $RESULT //Сохранили адрес найденного байта mov temp,$RESULT sub filesecend,temp sub filesecend,5 add $RESULT,1 cmp [$RESULT],filesecend jne @continue Идея заключается в том, что после нахождения #E8#, рассчитывается смещение изходя из предположения, что по этому адресу находится CALL 013A0000 и затем полученное смещение сравнивается с тем которое действительно там находится и соответственно делается вывод. Это прекрасно работает правда 4 CALL 013A0000 не видит, их соответственно в ручную. Либо можно прогнать поиск ещё раз. ![]() |
|
Создано: 11 октября 2005 03:25 · Личное сообщение · #24 Немного усовершенствовал автопоиск сейчас работает безупречно и находит все CALL 013A0000 @continue: cmp startscan,endscan //endscan-адрес последнего CALL 013A0000 je @endscript findop startscan, #E8# //Ищем оп-код call`а add startscan,1 mov temp,$RESULT sub filesecend,temp sub filesecend,5 add $RESULT,1 cmp [$RESULT],filesecend mov filesecend, 13A0000//13A0000-соответственно искомый CALL jne @continue ![]() |
|
Создано: 12 октября 2005 10:00 · Личное сообщение · #25 SergSh в ДАМПЕ после стека идет участок памяти 0130000 (размером 29000). Но в оригинале этом участок имеет указанный размер только на ЕР. В дальнейшем он увеличивается до 2D000 (на 1-ом исключении), а на VOEP - уже размером 2Е000. В конце проги идет обращение к добавленному участку памяти. В принципе, можно эту секцию сдампить и прикрепить к новой проге, а затем, через VirtualAlloc, создать дополнительный участок и скопировать туда недостающие данные. Но мне этот путь по некоторым причинам не очень нравиться. Ты как здесь поступил? ![]() |
|
Создано: 12 октября 2005 10:31 · Личное сообщение · #26 |
|
Создано: 13 октября 2005 14:40 · Личное сообщение · #27 У меня такое ощущение, что без скрипта все же не обойтись. В ручную -- слишком много работы. Пока у меня сложилось следующее впечатление о защите: 1. Сначало идет 1-я ветвь кода, забранная аспром (у меня это Address=019A0000 Size=00005000). В этой секции обращение к ВМ было типа CALL 02180000 (переделываем на jmp - адрес возврата, расположенный в секции 02190000). В этой ветви адрес возврата часто меняется в зависимости от флага Z 2. Вторая ветвь начинается с перехода JMP 01AC0000 (Address=01AC0000 Size=00001000). Эму область надо так же дополнительно создавать в дампе. В ней уже обращение к ВМ другого типа, например: 01AC0926 CALL 01DA0000. Адрес возврата находится в следующей секции 01DB0000. И он не зависит от значения флага Z 3. А третья ветвь начинается здесь: 00562B27 JMP 01AE0000 (Address=01AE0000 Size=00002000) А из нее идет другое обращение к ВМ, типа 01AE001E CALL 01E00000. Адрес возврата так же находится в следующей секции (+10000) и вроде не зависит от значения флага. Более того, есть ощущения, что это не конец и есть продолжение. В принципе, можно на каждый кусок (ветвь) написать свой скрипт. Но тогда не ясно, как вносить изменения в дамп. С другой стороны, мне кажется, общий скрипт будет слишком сложен. ![]() |
|
Создано: 29 октября 2005 21:01 · Личное сообщение · #28 |
|
Создано: 29 октября 2005 21:43 · Поправил: Z0oMiK · Личное сообщение · #29 |
|
Создано: 29 октября 2005 22:15 · Личное сообщение · #30 |
|
Создано: 29 октября 2005 22:23 · Личное сообщение · #31 |
<< . 1 . 2 . 3 . 4 . 5 . >> |
![]() |
eXeL@B —› Протекторы —› Распаковка AsProtect >1.23 - от А до Я. |