| Посл.ответ |
Сообщение |
|
Создано: 28 марта 2008 15:30:10 · Поправил: Модератор Личное сообщение #1
На http://dump.ru/files/o/o489862518/ я выложил свой первый туториал по анализу AsProtect v2.4 build 12.20. В этом туториале я подробно описал процесс восстановления эмулированных инструкций типа: PUSH 0 PUSH 0CC5850 PUSH 0DB180C CALL 00CEB814 Это - первая статья из нескольких статей по анализу протектора AsProtect v2.4 build 12.20. Мной уже подготовлены статьи по восстановлению таблицы IAT на основе таблиц данных AsProtect, прохода на OEP, и завершаю подготовку статьи по работе ключа активации программы. Буду благодарен за критику, замечания, пожелания и отзывы. Возможно, удастся совместными усилиями разработать универсальный скрипт для восстановления всех эмулируемых инструкций.
|
|
|
Создано: 7 июня 2008 10:06:54 · Поправил: Medsft Личное сообщение #2
А что нельзя использовать теорию vnekrilov`а по нахождению ворованного после bpmx ведь как я понял и он анализирует прогу стоя на так называемом boep который находиться в секции code
|
|
Создано: 7 июня 2008 11:01:42 Личное сообщение #3
Smon пишет:
ни один аспр не ворует оеп у библ, по всей видимости из-за сложностей в реализации
+1
//возможно из-за релоков
----- Чтобы юзер в нэте не делал,его всё равно жалко.. |
|
Создано: 7 июня 2008 16:03:52 Личное сообщение #4
Medsft пишет:
Но вот вопрос возможно ли сделать скрипты из статьи универсальными или нет.
Не получается! Я проверил несколько последних версий аспра, по восстановлению эмулированных инструкций. В каждой версии, в таблице ТЭИ используются разные адреса, которые содержат нужные данные для восстановления кода подпрограммы. Поэтому приходится делать сравнительную таблицу этих адресов, и выполнять их корректировку. Хотя, если использовать оригинальные инструкции CALL EDX, то, вероятно, это возможно сделать. Но скрипт будет усложнен. Хотя можно попытаться это сделать.
|
|
Создано: 7 июня 2008 18:19:11 Личное сообщение #5
vnekrilov пишет:
Но вот вопрос возможно ли сделать скрипты из статьи универсальными или нет.
Так у волка универсальные скрипты
|
|
Создано: 7 июня 2008 18:27:46 Личное сообщение #6
pavka пишет:
Так у волка универсальные скрипты
Скрипты волка не восстанавливают инструкции типа
PUSH 0
PUSH 0CC5850
PUSH 0DB180C
CALL 00CEB814
Как я понял, Medsft это имел ввиду.
|
|
Создано: 7 июня 2008 18:31:40 Личное сообщение #7
vnekrilov
 Те аспры что китайцы выкладывали анпакнуты скриптами волка
|
|
Создано: 7 июня 2008 20:19:56 Личное сообщение #8
pavka пишет:
Те аспры что китайцы выкладывали анпакнуты скриптами волка
Я проверил последний скрипт волка на AsProtect v2.41 build 02.26 (оригинальном, не пропатченном файле). Этот скрипт не восстанавливает инструкции типа:
004A47CE PUSH D3808EE5
004A47D3 PUSH 2D7FB744
004A47D8 PUSH 0D7A224
004A47DD CALL 00CD6A20
А здесь разработчики пакера предусмотрели очень интересный ход. Выполнение CALL 00CD6A20 раскриптовывает закриптованные данные эмулированных инструкций, и меняет этот код на следующий:
004A47CE PUSH 0
004A47D3 PUSH 2D3FB744
004A47D8 PUSH 0D80CC8
004A47DD CALL 00CD6A4C
Однако реализация эмуляции этого кода проводится несколько иначе (это относится к первому байту опкода инструкций). Здесь разработчики используют инструкцию BT [EAX],EDX, и после тестирования байта, указанного в регистре EDX, выполняют нужную ветку кода. В прямом виде получить раскриптованный первый байт опкода мне пока не удалось. Сейчас думаю, как это сделать. В частности, в коде программы AsProtect v2.41 build 02.26, таких инструкций я насчитал 28.
Китайцы, в своей анпакнутой версии AsProtect v2.4 build 11.20, восстановили эти куски кода, судя по записи кода в таких местах, по ранним версиям этого пакера, которые не содержали эмуляцию инструкций такого типа.
|
|
Создано: 7 июня 2008 21:32:33 Личное сообщение #9
Такие же эмуленные инструкции есть и в коде ASProtect 2.30 build 06.26, китайцами они восстановлены в анпакнутой by shoooo версии, и есть предположение, что этот код срисован с предыдущего билда - ASProtect 2.30 build 05.14, где такой эмуляции в секции кода изначально нет, она только в aspr.dll
----- © Не каждый программист - крэкер, но каждый крэкер - программист ;) |
|
Создано: 8 июня 2008 21:08:51 Личное сообщение #10
vnekrilov пишет:
В прямом виде получить раскриптованный первый байт опкода мне пока не удалось. Сейчас думаю, как это сделать.
И не получится. Они сделали обычную замену опкодов, а всё остальное осталось также.
Например nop 90h теперь 1Dh.
А насчет BT не парься, она здесь для другого.
----- Любой каприз за ваши деньги
|
|
Создано: 9 июня 2008 09:48:53 Личное сообщение #11
PE_Kill пишет:
А насчет BT не парься, она здесь для другого
Да! Инструкция BT здесь применяется для указания ветки кода, где извлекаются и выполняются остальные байты опкода инструкций. Для уточнения этой ветки кода разработчики заложили еще два рядом идущих закриптованных параметра, которые раскриптовываются с помощью последнего байта константы. Эти параметры также получаются на базе первого байта опкода инструкций. Хочу посмотреть, как аспр определяет эти три параметра: ведь он должен использовать какой-то алгоритм для обработки первого байта опкода инструкций, чтобы получить эти три параметра. Попытаюсь проработать этот вопрос.
|
|
Создано: 9 июня 2008 10:18:30 Личное сообщение #12
Для начала надо найти опкоды замены, т.е. таблицу какому опкоду соответствует какой индекс, думаю она есть где то в теле протектора.
----- Любой каприз за ваши деньги
|
|
Создано: 9 июня 2008 10:48:59 Личное сообщение #13
Спасибо за подсказку. Я примерно так и думал.
|
|
Создано: 10 июня 2008 08:13:44 Личное сообщение #14
Нужен совет. Для определения первого байта опкода эмулированной инструкции разработчики применяют инструкцию BT [EAX],EDX. Число этих инструкций в Asprotect.dll - 34. При этом одним из основных параметров этой инструкции является значение регистра EDX, которое указывает, какой нужно тестировать байт. Регистр EDX может иметь следующие значения: 0, 1, 2, 3, 6 и 7. Для вычисления нужной ветки кода, которая должна соответствовать, например, инструкции MOV EAX,EBX, первый опкод которой - это байт 8B, пакер несколько раз вызывает инструкцию BT [EAX],EDX, с разными значениями регистра EDX. При этом он тестирует несколько битов в содержимом регистра EAX, после чего делает вывод о том, что это будет инструкция MOV. Мне кажется, что это каким-то образом напоминает своеобразный штрих-код, в котором в двоичном виде записана вся необходимая информация об этом байте опкода. Возникает вопрос, каким образом, имея значение регистра EAX (оно берется из таблицы ТЭИ), и зная, какие тестируются биты, можно определить значение первого байта опкода? Может быть кто-то может поделиться какими-то идеями. Можно, чтобы не засорять топик, писать мне на ПМ vnekrilov@yandex.ru.
|
|
Создано: 10 июня 2008 09:53:32 Личное сообщение #15
vnekrilov чисто математически это невозможно, надо искать как аспр кодирует эти значения. А засорять тут нечего так как это и есть контент топика.
----- Любой каприз за ваши деньги
|
|
Создано: 10 июня 2008 15:15:00 Личное сообщение #16
У кого доступ на exetools качните сюда плз. последний скрипт от волка.
|
|
Создано: 10 июня 2008 15:31:58 Личное сообщение #17
Сам нашел если еще у кого то нет ссылка внизу теперь другой вопрос odbscript 1.64 может кто поделится
b397_10.06.2008_CRACKLAB.rU.tgz - aspr2.xx v1.14ae.RAR
|
|
Создано: 10 июня 2008 15:47:32 Личное сообщение #18 |
|
Создано: 13 июня 2008 09:48:30 · Поправил: vnekrilov Личное сообщение #19
Потихоньку добиваю вопрос восстановления эмулированных инструкций типа:
004A47CE PUSH D3808EE5
004A47D3 PUSH 2D7FB744
004A47D8 PUSH 0D7A224
004A47DD CALL 00CD6A20
Возникла следующая идея. Для выполнения эмулированной инструкции, протектор использует инструкцию BT [EAX],EDX, в сочетании с двумя другими значениями, которые расположены в таблице ТЭИ по адресам Byte_15h и Byte_16h. При этом, как мне кажется, первый байт опкода инструкции жестко привязан к конкретной ветке кода подпрограммы эмуляции, поскольку, далее пакер извлекает второй и последующие байты опкода эмулируемой инструкции, после чего выполняет ее. Попытки сделать защиту тестовой программы, которая имела бы такой-же эмулированный код, у меня не увенчалась успехом.
Может ли кто-либо проконсультировать, как сделать такую защиту тестовой программы, поскольку хелп такой подсказки не дает.
|
|
Создано: 13 июня 2008 23:43:38 Личное сообщение #20
vnekrilov мне удалось это. Делается так. Берешь исходник какого нибудь проекта, оформальяешь функции макросом begin_crypt/end_crypt только одним и темже например первым. Функций должно быть не меньше 6, лучше 10-15. Затем компилишь и накрываешь аспром с опциями использовать активационные ключи, расшифровывать куски кода и ОБЯЗАТЕЛЬНО привязка к Hardware ID. Только тогда СКОРЕЕ ВСЕГО аспр накроет новой ВМ ОДНУ из функций обрамленных криптомакросами. Ну и конечно чтобы это увидеть надо запустить защищенную прогу и сгенерить ей ключ чтобы расшифровался код.
И еще функции не должны быть слишком маленькими.
----- Любой каприз за ваши деньги
|
|
Создано: 14 июня 2008 01:53:22 Личное сообщение #21
ADD Если и после этого аспр не навесит ВМ, то надо просто накатать какую нибудь прожку которая будет проверять куски пошифрованого кода на предмет ВМ 68????????68????????... и перезащищать файл пока он не навесит ВМ. По нормальному надо бы найти в аспре где вызывается рандом и пофиксить его. А пока у меня выходит из 10 попыток защитить 2 раза навешивается ВМ.
----- Любой каприз за ваши деньги
|
|
Создано: 14 июня 2008 02:42:51 · Поправил: PE_Kill Личное сообщение #22
Хочу поделиться тем что я нарыл поверхностно осмотрев ВМ. Первое тестирование
бита (когда тестируется 7й бит) нужно аспру для определения размера операнда.
По дефолту стоит 4 - DWORD, это и понятно 32 битная система всё таки.
Вот тут это происходит
mov edx, 7h
mov eax, dword ptr [esi+82h]
call 0C93FECh
test al, al
je 0C9A7E1h
Если je 0C9A7E1h не выполнится то аспр установит указатель размерности в 1,
я так понимаю BYTE.
Разбираю опкоды 90h-9Fh. В аспровом case они проходят как индекс 1Dh,
в ветке, которая обрабатывает 1Dh тестируется нулевой бит. Если бита нет то
аспр перейдет в другой case, иначе это однобайтовая команда диапазона 90h-97h.
С ними всё просто, их аспр рассматривает как
xchg r32, r32, даже nop. Т.к. по спецификациям кодирования он проходит как
xchg eax, eax. Далее команды:
mov al, byte ptr [eax]
add al, byte ptr [esi+4h]
and eax, 0FFh
извлекают правые 4 бита опкода. Т.е. если команда была xchg eax, edx (92h), то в
al у нас будет 02h.
Тут в принципе всё ясно.
А вот во втором case идет сопоставление индексов опкодам.
Команды
mov al, byte ptr [eax]
add al, byte ptr [esi+4h]
and eax, 0FFh
Расшифровывают индекс и пошло сравнение:
Индекс A8h - Опкод 98h (CWDE)
Индекс 1Dh - Опкод 99h (CDQ)
*** и так далее ***
Пока не знаю весь ли диапазон 98h-9Fh охватывет этот case, некогда смотреть.
Но то, что видно уже щас говорит о том, что как в аспре всё было на коленке
сделано, так и осталось.
----- Любой каприз за ваши деньги
|
|
Создано: 14 июня 2008 06:21:34 Личное сообщение #23
PE_Kill
Очень интересный анализ. Спасибо за подсказку. Посмотрю в этом направлении.
|
|
Создано: 21 июня 2008 14:01:42 · Поправил: vnekrilov Личное сообщение #24
На обменнике http://www.sendspace.com/file/mz4n9f я выложил свою очередную статью, в которой описал эмуляцию инструкций пакером в главной области кода программы. Это - первая часть статьи, в которой описан процесс эмуляции инструкций первого типа. Во второй части статьи я опишу процесс эмуляции инструкций второго типа.
Хочу выразить благодарность PE_Kill за его ценные советы и подсказки. Как всегда, буду признателен за отзывы, пожелания, замечания и критику.
|
|
Создано: 21 июня 2008 16:42:16 Личное сообщение #25
vnekrilov,do you have English tutorials about your asprotect unpacking tutorials?
|
|
Создано: 21 июня 2008 17:11:38 Личное сообщение #26
winndy пишет:
vnekrilov,do you have English tutorials
Unfortunately, I do not know sufficiently English language to make their translation. There can be it will make someone who well knows English.
|
|
Создано: 21 июня 2008 17:23:16 Личное сообщение #27
your tutorials are worth with translation.
It's great.
Few people would like to share their knowledge.
I use google translate to read your tutorials.
But if there is anyone who knows both Russian and English.
It will be great.
Your tutorials will be more popular.
Thanks
BR
|
|
Создано: 21 июня 2008 22:50:16 Личное сообщение #28
winndy
Thanks for an estimation of mine tutorials.
|
|
Создано: 22 июня 2008 19:03:59 Личное сообщение #29
vnekrilov
в данном контексте:
Полученный результат является указателем, который сообщает подпрограмме эмуляции, прибавлять ли ImageBase области кода к извлеченному значению из таблицы ТЭИ, или нет.
слово "указатель" следует заменить на "флаг", т.к. термин "указатель" имеет другое значение.
----- EnJoy!
|
|
Создано: 23 июня 2008 08:46:02 Личное сообщение #30
Jupiter пишет:
слово "указатель" следует заменить на "флаг", т.к. термин "указатель" имеет другое значение
Спасибо за уточнение, учту.
Судя по всему, я нашел подход к созданию скрипта для восстановления эмулированных инструкций в области кода программы. Правда, пока он будет восстанавливать только те инструкции, которые выполняются в подпрограмме, описанной в первой части статьи. А вот эмулированные инструкции, которые выполняются во второй подпрограмме, пока-что, по видимому, придется восстанавливать вручную. Правда, таких инструкций в программе имеется немного. Скоро, через день-два, я выложу вторую часть статьи, в которой описана работа второй подпрограммы при выполнении эмулированных инструкций. Черновик этой статьи уже готов.
И еще одна просьба к участникам форума. У меня что-то не получается прикрепить к топику статьи. Происходит сброс (видимо маленькая скорость передачи данных). Если кто-то может, прикрепите к данному топику первую часть статьи, а потом, когда я выложу вторую часть, то и вторую часть статьи.
|
|
Создано: 23 июня 2008 09:31:41 Личное сообщение #31 |