-
Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
- Статус темы:
-
Закрыта.
-
LaurenceD
User- Регистрация:
- 15.09.15
- Сообщения:
- 2
- Симпатии:
- 0
-
Themida — это дополнительный модуль защиты игры запрещающий модификацию файлов клиента. В данном случае, или Темида обнаружила что файлы были каким-либо образом модифицированы (возможно без вашего ведома вирусом) или у нее просто нет доступа для проверки файлов (мешает антивирус).
Первое, что стоит предпринять: Полная проверка файлов игры с помощью утилиты check4game. Внимательно читайте инструкцию по ссылке.
Второе: Попробуйте запустить игру при отключенном антивирусе и брандмауэре. Если помогло — значит ошибка в доступе Темиды к файлам клиента. Нужно добавить игру в список доверенных для антивируса и брандмауэра.
Как это сделать, для антивируса — гайд. (гайды написаны еще при Запускаторе, но они работают. Просто добавляйте папку с приложением 4game, по умолчанию это C:Program Files (x86)4game)
Как настроить брандмауэр — гайд. -
LaurenceD
User- Регистрация:
- 15.09.15
- Сообщения:
- 2
- Симпатии:
- 0
я же написал …. Что все пробывал из перечисленного .. не помогает
-
Уточните, Ваша проблема актуальна ?
-
Закрыто в связи с утерей актуальности.
- Статус темы:
-
Закрыта.
В сегодняшней статье поговорим о навороченном протекторе Themida. Рассмотрим простой способ обхода Themida. Я покажу, как сбросить триал программы защищенной Themida.
Еще по теме: Обход защиты StarForce
Статья в образовательных целях и не призывает к каким-либо незаконным действиям. Ни редакция spy-soft.net, ни автор не несут ответственность за ваши действия.
Обход защиты Themida
В статье не будем рассматривать «традиционные» способы обхода триала Themida, вместо этого рассмотрим самый простой и понятный метод взлома и патча защищенной программы.
Итак, есть приложение, которое использует третью версию Themida. Как обычно, нам понадобиться минимальный инструментарий (x64dbg и его плагины).
Следует отметить, что для обнаружения Themida не стоит полагаться на DetectItEasy. С данной защитой лучше работают ExeInfo и Nauz File Detector.
На присутствие защиты Themida в файле как бы намекает наличие между секциями
.idata и
.pdata двух секций с непроизносимыми названиями из 8 случайных символов. Но, в третьей версии разрабы уже не стесняясь прямо называют секции
.themida и
.boot. Код точно зашифрован, упакован и не поддается статическому анализу и реверсу.
Для начала попробуем загрузить защищенную протектором программу в популярный отладчик x64dbg. Конечно, все плохо: при старте отладчик проваливается в виртуальную машину, такую темную на вид, что пропадает желание с ней разбираться. Виртуальная программа сразу же палит отладчик и кроме этого она отслеживает тайминг похождения отдельных участков своего кода.
Сразу приаттачиться к уже активному процессу тоже не получается, разрабы Фемиды предусмотрели и это. Поступим чуть умнее — возможно, по прошлым статьям вы помните прекрасный анти‑антиотладочный плагин ScyllaHide для x64dbg, в котором специально для таких ленивых как я уже есть готовые профили под все популярные защиты. Разумеется, подобный профиль там есть и для Фемиды, правда, он нам не очень и поможет: во время загрузки приложения он не спасает от антиотладчика, однако приаттачиться к запущенному приложению уже позволяет.
Толку от этого мало: после этого бряка трассировка валит приложение наповал. Но это уже какой-то прогресс — далее по нашей стандартной схеме, опробованной ранее на Obsidium, Enigma и прочих протекторах, мы пробуем сдампить прерванный процесс при помощи другого специально предназначенного для этого плагина — Scylla.
Приложение успешно дампится. Будем искать точку входа и во многих случаях этого вполне хватает, но, наш случай сложный. После загрузки сдампленного файла в IDA мы обнаруживаем, что наша программа хорошенько обфусцирована: на большинстве вызовов импортируемых функций (в частности, на библиотечных вызовах QT, на котором написана анализируемая нами программа), стоят заглушки, ведущие на изрядной длины цепочки безумного код подобного вида:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
00007FF6F4FA521D | E9 DB2F5F00 | jmp 7FF6F55981FD 00007FF6F4FA5222 | E9 E5E31D00 | jmp 7FF6F518360C 00007FF6F4FA5227 | E9 25064500 | jmp 7FF6F53F5851 00007FF6F4FA522C | E9 375E5900 | jmp 7FF6F553B068 00007FF6F4FA5231 | 73 D5 | jae 7FF6F4FA5208 00007FF6F4FA5233 | CF | iretd 00007FF6F4FA5234 | 0026 | add byte ptr ds:[rsi],ah 00007FF6F4FA5236 | 49:89ED | mov r13,rbp ... 00007FF6F55981FD | 48:83EC 08 | sub rsp,8 00007FF6F5598201 | E9 E6DB0200 | jmp 7FF6F55C5DEC ... 00007FF6F55C5DEC | 48:83EC 08 | sub rsp,8 00007FF6F55C5DF0 | 48:83EC 08 | sub rsp,8 00007FF6F55C5DF4 | 48:81EC 08000000 | sub rsp,8 00007FF6F55C5DFB | 48:891C24 | mov qword ptr ss:[rsp],rbx 00007FF6F55C5DFF | 8F0424 | pop qword ptr ss:[rsp] 00007FF6F55C5E02 | 8F0424 | pop qword ptr ss:[rsp] 00007FF6F55C5E05 | E9 83000100 | jmp 7FF6F55D5E8D ... |
По‑хорошему было бы неплохо отфильтровать все адреса подобного импорта и написать деобфускатор, но, учитывая их количество, задача выглядит муторной, а я обещал относительно простой и комфортный путь (насколько это возможно вообще в случае столь серьезной защиты). Поэтому самое время приступить к анализу логики программы в процессе ее работы, то есть, изыскать возможность для ее трассировки.
По счастью, умные люди уже подсуетились и создали для нас чудесный плагин Themidie, который позволяет беспроблемно трассировать приаттаченный процесс под Themida. Для его использования необходимы последние версии отладчика x64dbg и плагина ScyllaHide, про которые я писал выше.
Скачайте с GitHub последнюю версию Themidie и извлеките Themidie.dll и Themidie.dp64 в папку плагинов x64dbg. В итоге там должны обязательно присутствовать четыре файла:
- Themidie.dll
- Themidie.dp64
- HookLibraryx64.dll
- ScyllaHideX64DBGPlugin.dp64
Загружаем x64dbg и с чувством полного удовлетворения обнаруживаем в подменю Plugins (Модули) дополнительный пункт Themidie. В опциях ScyllaHide отключаем все, кроме чекбокса Kill Anti-Attach.
Запускаем исследуемую программу из подменю Plugins-Themidie-Start. Если мы все сделали правильно, то должно появиться вот такое окно.
Как следует из текста в этом окошке, программа при запуске не загружается сразу в отладчик (более того, ее и при всем желании принудительно загрузить не получится — Themida спалит наш отладчик при загрузке даже так).
Однако к запущеной столь хитрым образом программе можно приаттачиться, после чего спокойно ставить бряки и отлаживать код, не боясь антиотладчика, что нам, собственно и требовалось. Теперь, не испытывая ни малейших препятствий, обнаруживаем в необфусцированной части кода развилку обхода проверки лицензии:
00007FF630D5C10F call sub_7FF630D5D970 00007FF630D5C114 mov rdx, [rax] 00007FF630D5C117 mov rcx, rax 00007FF630D5C11A call qword ptr [rdx+8] 00007FF630D5C11D test al, al 00007FF630D5C11F jz loc_7FF630D5CEE4 00007FF630D5C125 lea rcx, [rsp+0EA8h+var_810] 00007FF630D5C12D call sub_7FF631797E20 00007FF630D5C132 xor bl, bl |
Если бы на приложении не было навешено «Фемиды», можно было бы пить шампанское: делов то — поправить пару байтиков условного перехода je. Но тут начинается самое интересное. Исходный код у нас зашифрован и упакован, реверсить виртуальную машину Themida, как мы уже успели убедиться, — вещь достаточно трудоемкая. Причесать и деобфусцировать сдампленный чуть раньше код, конечно, чуть попроще, но все равно задача выглядит весьма непростой.
Самым легким вариантом кажется использование лоадера или инлайн патча. Чтобы не кодить лоадер, попробуем второй вариант. Суть в том, что если нельзя пропатчить код самого защищенного приложения, то можно попробовать сделать это из какой‑нибудь незащищенной внешней библиотеки, благо, QT-шных либ рядом с программой валяется в изобилии, и контроля целостности на них нет.
Слегка поковыряв код, обнаруживаем ближайший к нашей развилке обфусцированный вызов функции
bool __cdecl QWidget::isVisible(void) библиотеки qt5widgets.dll.
00007FF6EE96BDAE | 49:8BCF | mov rcx,r15 00007FF6EE96BDB1 | FF15 B1B75401 | call qword ptr ds:[7FF6EFEB7568] 00007FF6EE96BDB7 | 84C0 | test al,al 00007FF6EE96BDB9 | 0F85 EB020000 | jne 7FF6EE96C0AA 00007FF6EE96BDBF | 48:8D8C24 20090000 | lea rcx,qword ptr ss:[rsp+920] |
После прохождения всей последовательности обфусцированного кода вызов упирается в коротенькую реализацию данной функции внутри qt5widgets.dll, ее код мы и будем использовать для автопатча основной программы:
mov rax,qword ptr ds:[rcx+28] mov eax,dword ptr ds:[rax+8] shr eax,F and al,1 ret |
Следующая сложность заключается в том, что мы не можем так просто взять и поправить код исполняемого процесса из него же. Значит, надо искать переменные в секции данных, правка которых дала бы тот же эффект. Итак, нам надо добиться, чтобы вызов метода
00007FF630D5C11A call qword ptr [rdx+8] |
возвращал в AL ненулевое значение.
Еще немного покопавшись в отладчике, превращаем данный метод вот в такую последовательность действий:
mov rcx,qword ptr ds:[7FF6F47F6EF8] mov rcx,qword ptr ds:[rcx+10] movzx eax,byte ptr ds:[rcx+A1E] |
Это означает, что для того, чтобы программа почувствовала себя лицензионной, нужно установить по адресу:
[[[7FF6F47F6EF8]+10]+A1E] |
любое ненулевое значение байта (например, 1).
Алгоритм наших действий таков:
Выполняем исходный код метода
bool __cdecl QWidget::isVisible(void), результат в регистре AL, регистр RCX программе уже не интересен, его можно использовать в своих целях, что мы и сделаем.
Проверим, из нужного ли места был вызван метод
isVisible, поскольку секция кода садится каждый раз на разные адреса, самое простое и более‑менее надежное — проверять последние несколько байт адреса, например 16 бит, искомый адрес вызова должен быть:
Адрес вызова мы также используем для относительной адресации переменной:
Несложно посчитать, что смещение между ее адресом и адресом вызова равно
0x5AAB44C.
На всякий случай проверяем значение этой переменной (на момент вызова нашего
isVisible она запросто может быть еще не инициализирована) и устанавливаем значение
[[[7FF6F47F6EF8]+10]+A1E] в 1.
Теперь, когда алгоритм понятен, ищем в коде библиотеки qt5widgets.dll ближайший пустой кусок достаточной длины и устанавливаем обработчик
isVisible на него. Поправленный и дополненный код
isVisible выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
00007FFDB8EFF04F | 48:8B41 28 | mov rax,qword ptr ds:[rcx+28] 00007FFDB8EFF053 | 8B40 08 | mov eax,dword ptr ds:[rax+8] 00007FFDB8EFF056 | C1E8 0F | shr eax,F 00007FFDB8EFF059 | 24 01 | and al,1 <— В AL результат isVisible 00007FFDB8EFF05B | 48:8B0C24 | mov rcx,qword ptr ss:[rsp] <— Адрес вызова, точнее, возврата 00007FFDB8EFF05F | 81E1 FFFF0000 | and ecx,FFFF <— Берем от него младшие 16 бит... 00007FFDB8EFF066 | 48:81F9 B7BD0000 | cmp rcx,BDB7 <— И проверяем их на ????????????BDB7 00007FFDB8EFF06D | 74 01 | je qt5widgets.7FFDB8EFF070 00007FFDB8EFF06F | C3 | ret <— Если вызов не оттуда то ничего не делаем и просто возвращаем AL 00007FFDB8EFF070 | 48:8B0C24 | mov rcx,qword ptr ss:[rsp] <— Адрес вызова, точнее, возврата 00007FFDB8EFF074 | 48:81C1 41B1E805 | add rcx,5E8B141 <— В rcx адрес [7FF6F47F6EF8] 00007FFDB8EFF07B | 48:8B09 | mov rcx,qword ptr ds:[rcx] 00007FFDB8EFF07E | 48:85C9 | test rcx,rcx 00007FFDB8EFF081 | 74 EC | je qt5widgets.7FFDB8EFF06F <— Если [7FF6F47F6EF8] не инициализированна то тоженичего не делаем 00007FFDB8EFF083 | 48:8B49 10 | mov rcx,qword ptr ds:[rcx+10] 00007FFDB8EFF087 | C681 1E0A0000 01 | mov byte ptr ds:[rcx+A1E],1 <— Устанавливаем признак лицензированности и возвращаем AL 00007FFDB8EFF08E | C3 | ret |
Все это кажется каким‑то извращением, но это работает: внешняя стандартная библиотека QT при обращении к ней из нужного места делает накрытую Themida программу «лицензионной», даже не модифицируя ее код.
Я, конечно, не претендую на чистоту, правильность и надежность приведенного выше кода, но, на мой взгляд, это самый простой и быстрый принцип автопатча, пригодный не только для обхода Themida, но и любой другой серьезной защиты, шифрующей код и проверяющей его целостность.
Еще по теме: Отладка программ с помощью WinDbg
Поскольку в последнее время возникает всё больше и больше одинаковых технических вопросов, и многие игроки с фри-серверов переходят на офф, решил создать данную тему. Это подборка технических рекомендаций, если у вас что-то не получается (в техническом плане) с л2. Рекомендуется к ознакомлению перед создание новой темы в этом разделе :). Данную тему буду обновлять по мере появления «массовых» новых проблем. Тему закрываю и прикрепляю, все обсуждения по данной теме, а также ваши пожелания и, возможно, советы по исправлению моих неточностей и ошибок прошу высказывать здесь: Обсуждение темы: «FAQ по техническому разделу».
Итак, поехали:
1. Я только что перешёл на офф, но у меня остался старый клиент с фришарда, что мне делать?
Если вы только что пришли на офф и клиент был взят не с офф-источников, то вам обязательно нужно обновить клиент. Делается это просто: в корневой папке клиента есть файл LineageII.exe, запускаете его, и если обновление не пошло само собой, нажимаете кнопку <Check Files>. Также можно скачать полностью последнюю версию клиента, перейдя по адресу:
http://www.lineage2.com/pds/pds_client.html
Offtopic: Компания NCSoft примерно раз в пол года выпускает новые обновления к игре, так что, если у Вас клиент «от друга», у вас есть шанс, что он окажется устаревшим. Тем более, если раньше вы играли на одном из фри-серверов, то администрация данного сервера могла изменять файлы клиента по их усмотрению и это могло привести к его неработоспособности на офф-сервере.
2. Я ставил какие-то патчи, когда играл на моём фришарде, а теперь официальный клиент не хочет работать, в чём проблема?
Если вы до перехода на офф-сервер играли на одном из фришардов, то вам обязательно нужно проверить файл Hosts на наличие лишних строк. Он находится здесь: C:WINDOWSsystem32driversetc , и в нём должна находиться лишь одна не закомментированная строка:
Offtopic: Поскольку официальный клиент был разработан только для официальных серверов, то в клиенте «вшиты» адреса серверов. Администрация фришардов «патчами» добавляет в файл Hosts «переадресацию» на свои сервера. По сути говоря, в данном файле находится сопоставление DNS-имён с IP-адресами.
3. Я пользуюсь Firewall’ом, и игра почему-то не запускается/обновляется, что-то не так?
Если вы используете Firewall, то обязательно должны быть открыты порты: 7777, 2106, 2009, 80, 53. Как открыть данные порты, вы можете найти в справке по своему Firewall’у.
Для игры на Русс-Оффе дополнительно должен быть открыт порт 17453 (с) AbyssMoon
Offtopic: Порт 7777 — это «главный» порт клиента, через него клиент л2 получает/отправляет всю информацию, которая происходит ingame. Порт 2106 используется логин-сервером, он должен быть открыт, если вы хотите залогиниться в игру. Порты 2009, 80 и 53 используются апдейтером клиента, а также GameGuard’ом — они также должны быть обязательно открыты.
4. Проделал всё указанное выше, но клиент снова выдаёт сообщение об ошибке/не обновляется/не запускается. Что можно сделать теперь?
Если у вас всё ещё возникают проблемы с запуском/обновлением клиента — удалите полностью папку System в каталоге клиента и повторите пункт 1. Если и после этого остались проблемы (например, с прорисовкой текстур), то придется качать весь клиент заново.
Offtopic: Иногда бывает так, что даже после того, как была нажата кнопка <Check Files> и апдейтер успешно завершил обновления, некоторые файлы остаются не обновленными. И в 95% случаев это файлы из каталога System.
5. Я пробовал отключать антивирусы/файрволлы, однако у меня всё равно возникают проблемы при входе в игру. Как это исправить?
Если после этого у вас всё ещё не удается зайти в л2, то попробуйте ПОЛНОСТЬЮ удалить антивирусы и файрволлы, которые стоят в системе, сделать перезагрузку и опять попробовать зайти в л2. Если после этого удалось зайти в игру, то проблема в этом программном обеспечении. Прочитайте в мануале по вашему антивирусу/файрволлу как добавить папку с клиентом л2 в доверенную зону.
Offtopic: Защита, которая используется в официальном клиенте л2 (GameGuard), иногда преподносит сюрпризы при работе с некоторыми антивирусами и файрволлами. Очень важно именно удалить ПОЛНОСТЬЮ данное программное обеспечение, т.к. при нажатии кнопок «выход/остановить» многие антивирусы и файрволлы всё же продолжают мониторить систему.
6. Мой провайдер предоставляет мне доступ в Интернет только через прокси-сервер. Какое мне ПО использовать, чтобы можно было играть через прокси?
Если вы выходите в Интернет через прокси-сервер, то вам придется поменять провайдера, если хотите играть в л2, т.к. клиент л2 (а точнее GameGuard) не поддерживает игру через прокси-сервер.
Offtopic: Да — это суровый факт. Также не удастся использовать специальное программное обеспечение, типа FreeCap, т.к. GameGuard через него не сможет работать.
7. Очень часто, когда я оставляю чара на трэйде в Гиране, то через некоторое время вижу, что мой клиент завершился с критической ошибкой. В чём проблема?
Если у вас клиент завершается с критической ошибкой, когда вы сидите на трэйде в Гиране, то используйте команду /allblock
Offtopic: Это один из багов, который НКСофт еще не исправил. Появился он после введения возможности показывать вещи через Shift. Помогает только указанная выше команда.
8. У меня выход в Интернет через VPN, но постоянно происходят дисконекты, что можно сделать?
Если вы выходите в Интернет через VPN и у вас возникают при этом какие-то проблемы с игрой, советую прочитать тему Gameguard и VPN?
Offtopic: Официальный ответ НКСофта: л2 не поддерживает игру через VPN. Однако это, конечно же, не так В приведенной выше теме вы получите все необходимые ответы по поводу игры через VPN.
9. Достала ошибка «Themida Error» при запуске клиента! Как можно её исправить?
Если у вас Windows Vista и при запуске клиента высвечивается ошибка «Themida Error», то достаточно просто закрыть окно с ошибкой и пытаться запустить клиент, пока он не запустится. Ссылка по теме: Второе окно — Themidia ERROR !
Offtopic: Неизвестно почему происходит эта ошибка у некоторых игроков, но факт остается фактом — данная ошибка носит массовый характер. Будем надеется, что в скором времени её исправят.
10. При заходе в игру, камера начинает крутиться вокруг персонажа и я никак не могу её остановить! Что делать?
Зайдите в опции клиента, перейдите на вкладку «Audio/System» и снимите галочку «Game Pad», затем перезагрузите клиент.
Offtopic: Если к компьютеру подключены дополнительные устройства ввода (джойстик, руль и тп), то клиент л2 не «дружит» с ними при включеной данной опции в настройках.
11. Что еще вы бы могли посоветовать?
Убедитесь, что у вас нет компьютерных вирусов. Регулярно проверяйте компьютер на вирусы.
Offtopic: Критические ошибки клиента, синие экраны, а также неработоспособность клиента могут быть вызваны компьютерными вирусами. А особенно вирусами, которые перехватывают нажатия клавиш. В случае подозрения, проверяйте систему с загрузочного диска.
Вроде пока всё.. Если данные советы вам не помогли, попробуйте воспользоваться поиском (https://forums.goha.ru/search.php?), в этом разделе есть темы практически со всеми решенными проблемами, которые могут у вас возникнуть. Ну а если даже это вам не помогло, то можете смело создавать новый топик с вашим вопросом