eXeL@B —› Основной форум —› StarForce 5.7 MMOG |
<< . 1 . 2 . |
Посл.ответ | Сообщение |
|
Создано: 24 октября 2012 20:14 · Поправил: Once · Личное сообщение · #1 Есть одна игра - Мне нужно научиться обходить защиту или, что ещё лучше, научиться её снимать. Снятие защиты мне необходимо для поиска багов в игре. У меня есть старая, не накрытая Старом версия. Раньше сам exe'шник весил мало и подтягивал все функции из dll, сейчас всё в одном exe. Сама игра весит 1.7 GB, но я собрал необходимые файлы в архив: Новая версия (20MB) - Старая версия (12MB) - То что нашел сам: Файл PW_Game.exe защищён StarForce 5.70.37.002 MMOG Защитный модуль имеет название sakijapi.dll. В старой версии он имеется, но, похоже, не используется. Упакован UPX, распаковывается легко если надо. Если запустить PW_Game.exe - появится MessageBox, который говорит, что нужно запустить лаунчер. Это нормально, т.к. PW_Game.exe запускается с набором параментров о сессии, логине, разрешении, и т.д. Скрыть Olly помогает плагин фантом. OEP - 00A094DD В старой версии EP - 00401443 Сдампив на этом OEP без восстановления импорта, можно запустить дамп, но возникает исключение - деление на 0 в модуле защиты по адресу 015FDF57. Не знаю, нужно ли там восстанавливать импорт? По адресу 00A092AC происходит вызов Старовской функции, в которой вызывается _initterm_e (в старой версии exe'шника вызов этой функции виден по адресу 00401212), которая и вызывает функцию, в которой происходит исключение. Не знаю куда дальше двигаться.. Если занопить _initterm_e и следом за ним _initterm, то исключение будет в ntdll Эти initterm'ы, как я понимаю, вызывают конструкторы классов, используемых в приложении, а может и нет =) |
|
Создано: 09 ноября 2012 07:55 · Поправил: Nightshade · Личное сообщение · #2 Вм стара выделяет 2 или 3 куска памяти(таблица контекстов и сам контекст). Прилепляем к ехе новую секцию и при вызове VirtualAlloc, правим указатели на свою секцию. В итоге на оеп у нас все память вм в последней секции и все указатели на память вм всегда валидны. Ресурсы крайне редко защищены. Иногда бывает, что ресурсы в 2 разных секциях и надо собрать их в 1. Такие дампы очень удобны для исследования вм. CPUID не запатчить так просто. Перед этим надо снять защиту CRC. ВМ стара проверяет овердокуя адресов в вм на валидность. Чаще всего проверки вида (константа xor кусок_кода)=номер регистра в вм. (кусок кода) xor (кусок кода) xor (кусок кода) xor (константа)= лента пикода вм. Другой тип проверок, когда получают определенный адрес вм, в цикле складывают dword ы от адреса и ниже. А потом смотрят на сумму и делают прыжок на ошибку, если не сошлось. Запатчишь небольшой кусок - получишь неверный номер регистра или нарушишь логику работы вм. Cpuid ов в коде от 200-300 до 1000. А теперь прикинь сколько у тебя будет ошибок. В правильном дампе все проверки патчатся, а потом уже патчатся cpuid, апи и всякие fs[18] и fs[30] |
Ранг: 281.8 (наставник), 272thx Активность: 0.25↘0.01 Статус: Участник Destroyer of protectors |
Создано: 09 ноября 2012 08:20 · Поправил: MasterSoft · Личное сообщение · #3 Pchelovod пишет: Насколько я помню,она в 90% случаев запакована UPX ,и чтобы загрузить жертву в отладчик с распакованной dll нужно пропатчить проверку контрольной суммы (Старфорс кричит что файл заражен вирусов и типа галактика в опасности) как патчить я уже писал, ничего там сложного нет, всё даже наоборот, но зачем вообще снимать с неё упх? ну хз, может для удобства... Nightshade пишет: Запатчишь небольшой кусок - получишь неверный номер регистра или нарушишь логику работы вм. Cpuid ов в коде от 200-300 до 1000. А теперь прикинь сколько у тебя будет ошибок. смотря где находиться этот кусок, он говорит про патч сразу после анпака дллки, (а ты смело подумал, что он цпуид уже патчить вздумал) патчицо одна инструкция в PSC_StartInitialization, как правило этого достаточно, чтобы всё работало без ошибок. по поводу патча чего-либо другого - полностью согласен. Nightshade пишет: Сам код(не в секции вм который) ничем не защищен и там можно патчить триалы, демы, проверки на упх и прочую ерунду. +1 Nightshade пишет: Как сцена вообще пропускает такие релизы? так уж пошло, что в чужих релизах ковыряться не хорошо, поэтому думаю судят по работоспособности, работает - значит гуд. |
|
Создано: 09 ноября 2012 08:29 · Поправил: Nightshade · Личное сообщение · #4 Вм распаковывается для того, чтобы красиво ее потом вырезать и приклеить только вм, без секции кода. Сам код(не в секции вм который) ничем не защищен и там можно патчить триалы, демы, проверки на упх и прочую ерунду. Про патч я писал Veliant у, который предлагает патч cpuid на другую инструкцию. В том кряке от скидов, где дамп вм, не запатченны антидампы. Как сцена вообще пропускает такие релизы? |
|
Создано: 09 ноября 2012 14:05 · Поправил: Pchelovod · Личное сообщение · #5 Nightshade пишет: CPUID не запатчить так просто. Перед этим надо снять защиту CRC. ВМ стара проверяет овердокуя адресов в вм на валидность Если у нас дамп с приклеенной памятью,то его работа для ВМ ничем не отличается от запуска игры под эмулятором Daemon Tools с образа. Все адреса ВМ должны быть как в оригинале,иначе у вас даже дамп с привязкой к одному CPU не будет работать. Поэтому не совсем понятен смысл данной фразы |
|
Создано: 09 ноября 2012 14:23 · Личное сообщение · #6 |
|
Создано: 09 ноября 2012 17:52 · Поправил: Pchelovod · Личное сообщение · #7 ARCHANGEL Да это уже ежу давно понятно. Он пишет что "ВМ стара проверяет овердокуя адресов в вм на валидность ", а я говорю что ВМ стара и без вашего cpuid проверяет кучу адресов. Иными словами,никакой разницы в работе виртуальной машины нет если это дамп с полностью приклеянной памятью И вообще не вижу смысла в ваших демагогиях на эту тему: завсегдатаи форума заниматься этим не хотят,кроме Veliant ,а новичкам ваши рассуждения ни к чему.Им нужны мануалы в картинках |
|
Создано: 10 ноября 2012 10:19 · Личное сообщение · #8 |
|
Создано: 10 ноября 2012 18:48 · Личное сообщение · #9 Что делать,если в полученном дампе нет инструкций 0F A2 CPUID? Трасса в аттаче 0577_10.11.2012_EXELAB.rU.tgz - rtrace.txt |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 10 ноября 2012 20:30 · Поправил: ELF_7719116 · Личное сообщение · #10 Pchelovod пишет: Что делать,если в полученном дампе нет инструкций 0F A2 CPUID? Они все в выделенной памяти. Почитал и стало интересно. VM старфорса толком не исследовал. Поэтому не совсем понимаю, что мешает, как в SecuROM VM полностью перестроить aka выдрать привязку? Там все достаточно просто - CPUID идет на декодирование таблицы "островков"; запретив шифрование на первом островке, выдираем декодер в нем и остальных 254 (их же адреса известны из таблицы). По времени конечно придется посидеть (удобно написать визуализатор) - но ведь работает! ADD: Или самый быстрый способ с минимальныйми переделками - в дампе, перед первым заходом в VM, сами перекодируем таблицу дельта-смещений с текущим CPUID...PROFIT! |
|
Создано: 10 ноября 2012 20:49 · Поправил: Модератор · Личное сообщение · #11 Так всё равно ничего не понятно.Кто может поясните на примере,как это сделать.Достаточно 1 адреса, остальные 254 доделаем сами. Вот 3 рабочих дампа разных без фикса cpuid: http://depositfiles.com/files/51izhm4f2 http://depositfiles.com/files/h9g3x1xxi http://depositfiles.com/files/swqzr9emb Рабочих означает что там уже всё что нужно приклеено,пофиксено и восстановлено. Но пашет только на 1 процессоре Если бы можно было эмулировать CPUID ,то проблема решилась проще.Делаем 1 дамп,пишем лоадер который подсунет дампу вместо реального идентификатора процессора "правильный" и всё работало. Но как я понимаю сделать это нельзя,потому что значение берется напрямую из железа? |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 10 ноября 2012 21:07 · Личное сообщение · #12 Pchelovod пишет: Но как я понимаю сделать это нельзя,потому что значение берется напрямую из железа Ага! CPUID по сути обычная инструкция, поэтому проблема одна - надо знать когда и где она вызывается. Тут два варианта - ставить перед входом в VM свой обработчик и править опкод 0F A2 на 0F 0B (UD2) чтоб получить исключение и подсунуть нужные данные (далеко не факт, что подправим абсолютно все и там где надо - проектор можен шифровать критические участки своего кода) OR заниматься самотрейсингом, проверяя каждую инструкцию на предмет схожести с CPUID... но это слишком медленно. |
Ранг: 281.8 (наставник), 272thx Активность: 0.25↘0.01 Статус: Участник Destroyer of protectors |
Создано: 10 ноября 2012 21:49 · Личное сообщение · #13 |
|
Создано: 10 ноября 2012 22:57 · Личное сообщение · #14 |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 11 ноября 2012 12:10 · Личное сообщение · #15 |
|
Создано: 11 ноября 2012 17:09 · Личное сообщение · #16 |
|
Создано: 11 ноября 2012 21:13 · Поправил: Veliant · Личное сообщение · #17 По выложенному выше трейсу где можно распарсил формат команд. Остальные надо смотреть. Пасс к архиву дефолтный для раздела "скачать" этого ресурса. f1-f4 - флаги r1-r3 - регистры a - адреса o - опкод c - константа 5686_11.11.2012_EXELAB.rU.tgz - op_format.zip |
|
Создано: 12 ноября 2012 07:56 · Личное сообщение · #18 |
|
Создано: 12 ноября 2012 09:49 · Поправил: ClockMan · Личное сообщение · #19 |
|
Создано: 12 ноября 2012 09:53 · Поправил: Nightshade · Личное сообщение · #20 |
|
Создано: 12 ноября 2012 11:19 · Личное сообщение · #21 Nightshade пишет: я тебя могу обрадовать. Смещения в ленте вм не постоянны и меняются в каждом билде. Такую таблицу декомпиль должен создавать сам. Руками парсить нет смысла. Да вообще-то я в курсе. А тк декомпиля у меня пока нет, то сделал руками. Да и заняло это не так много времени. Впринципе статически это не так сложно распарсить, можно даже масками. Все биты читаются reg = dword [edi+20+n]/shr reg, a/and reg, b. Для начала надо сделать нормальное извлечение кода без левых переходов. В моем представлении надо смотреть последовательно команды и записывать какие флаги они изменяют, потом в случае всяких stc/jc просто отбрасывать ветвления. Тоже самое с cmp esi, 0/cmp edi,0/cmp esp,0. Остается только как-то определять код вида Code:
|
|
Создано: 12 ноября 2012 11:56 · Личное сообщение · #22 я сейчас пишу анализатор таких ветвлений. Но извлечение правильного кода, пока не придумал как делать. Во многих обработчиках есть ветвления byte, word, dword, qword.плюс логические операции. Не зная всех шаблонов команд я не пойму ветвление это обработчика или мусор. С обработкой ветвления мусора проще. Там всегда можно вычислить прыжок. Пока хочу дернуть все хендлеры без учета ветвлений самого хэндлера, а потом составить их шаблоны. |
|
Создано: 13 ноября 2012 03:31 · Поправил: kioresk · Личное сообщение · #23 Veliant, Остается только как-то определять код вида Code:
Рекомендую посмотреть связку Mediana в роли дизасма и ntldr'овский x86_64_emu в роли эмулятора. Такие куски можно сворачивать даже с помощью несложного паттерна: Code:
Код: Code:
Макросы: Code:
Эмулятор соответственно подключается когда надо что-то вычислить. | Сообщение посчитали полезным: Veliant |
|
Создано: 14 ноября 2012 12:37 · Личное сообщение · #24 Добрый день.Не стал создавать новую тему,я так сказать тоже интересуюсь исследованием SF.Опыта у меня пока мало,почитал темы - более менее понятно.Единственный вопрос возник,как найти проверку контрольной суммы у PROTECT.DLL? Нужно пропатчить код: 5B33C0 394D 085F 0F94C0 ЗАМЕНИТЬ НА 33C040 (SETE AL ---> XOR EAX,EAX + INC EAX) Как найти это место и почему именно его надо патчить? |
|
Создано: 14 ноября 2012 15:59 · Личное сообщение · #25 |
Ранг: 281.8 (наставник), 272thx Активность: 0.25↘0.01 Статус: Участник Destroyer of protectors |
Создано: 14 ноября 2012 17:36 · Личное сообщение · #26 |
|
Создано: 15 ноября 2012 10:18 · Личное сообщение · #27 |
|
Создано: 15 ноября 2012 11:25 · Личное сообщение · #28 |
|
Создано: 22 ноября 2012 13:11 · Личное сообщение · #29 |
<< . 1 . 2 . |
eXeL@B —› Основной форум —› StarForce 5.7 MMOG |