PDA

Просмотр полной версии : [Статья] [Unfreeze для всех версий]


KloneB@DGuY
04.03.2010, 10:54
[ Unfreeze для всех версий Perfect World ]

В этой небольшой статье, я расскажу вам [и покажу],
как сделать "разморозку" окна игры Perfect World.

Что это такое и зачем оно нужно? Могут спросить те,
кто не в курсе. При игре в оконном режиме, если вы
переключаетесь на другое приложение, окно игры,
"застывает" и вы не можете видеть, что сейчас
происходит с вашим персонажем. Неудобно!

Так вот. Эта статья, поможет исправить такое
неудобство и вы сможете нормально играть.

Если не хотите сами делать, то качайте
уже готовую утилиту PW Window Unfreezer ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Для работы, нам понадобиться утилита Cheat Engine ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
Если, у вас, ее нет, то скачайте последнюю версию ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Теперь будем двигаться пошагово:
0. Запускаем Cheat Engine ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
1. Запускаем игру,* но не заходим в меню выбора персонажа** [не логинимся!]
2. Заходим в Settings > Hotkeys > Next Scan-Exact Value и назначаем клавишу F12 [Ссылки могут видеть только зарегистрированные и активированные пользователи]
3. Открываем процесс игры, через Process > elementclient.exe, либо через иконку [Ссылки могут видеть только зарегистрированные и активированные пользователи]
4. Вводим в поле Hex цифру 0, опцию Scan Type ставим в положение Exact Value и жмем First Scan*** [Ссылки могут видеть только зарегистрированные и активированные пользователи]
5. Меняем значение в поле Hex на цифру 1 и переходим в окно игры [Ссылки могут видеть только зарегистрированные и активированные пользователи]
6. Нажимаем F12 и ждем, когда закончиться сканирование
7. Если вы все правильно сделали, то должно появиться небольшой список адресов
8. Перейдите в самый низ в окно с адресами, там будут несколько выделенных зеленым [Ссылки могут видеть только зарегистрированные и активированные пользователи]
9. Теперь вычисляем, какой из них верный, играя с фокусом окна игры****

Теперь осталось только включить его. Дважды щелкните по нашему [Ссылки могут видеть только зарегистрированные и активированные пользователи]
адресу, он появиться в нижнем окне. Затем впишите в поле Value
цифру 1 и поставьте галочку в Frozen Все. Только помните,
разморозка действует, пока запущена утилита Cheat Engine ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Примечание: В Шаге 4 можно не ждать полного завершение
сканирования. Достаточно, чтобы полоса заполнилась на 1/3-ть

* в оконном режиме и с маленьким разрешением. Так будет удобнее
** так будет меньше левых адресов выдавать во время поиска
*** во время сканирования не трогайте мышь и ничего не делайте
**** если окно игры в фокусе, то в нашем адресе стоит 1 если не в фокусе то 0

Автор статьи: KloneB@DGuY ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

kantr
02.12.2011, 19:55
9. Теперь вычисляем, какой из них верный, играя с фокусом окна игры****
можно поподробней?

Kitsune
02.12.2011, 20:12
можно поподробней?
Меняй фокус окна и смотри значение по какому адресу меняется на 0 (не активно) или 1 (активно).

kantr
03.12.2011, 10:41
Меняй фокус окна и смотри значение по какому адресу меняется на 0 (не активно) или 1 (активно).
Там много активных а вот какое именно

VeTaL_UA
03.12.2011, 12:03
Там много активных а вот какое именно
Отсеивай, пока не останется 1 "зелёный" адрес...

BritishColonist
14.01.2012, 12:43
Небольшая справочка:
У активного окна всегда как минимум два зелёных адреса, по которым лежит 1, это сто проц. Скорей всего их даже больше. Один из них, как мы уже выяснили, влияет на прорисовку. Второй должен отвечать за звук (тоже зависит от активности/неактивности окна игры). Наверняка ещё есть зелёный адрес, отвечающий за отлов клавиш (пока равен 1, клавиши проверяются, когда 0 - нет).

А в дополнение к статье можно добавить пункты, описывающие патчинг клиента (например, через Olly Dbg или DLL Injection).

VeTaL_UA
14.01.2012, 13:04
Наверняка ещё есть зелёный адрес, отвечающий за отлов клавиш (пока равен 1, клавиши проверяются, когда 0 - нет).
Долго искал, но этот магический адрес я не нашёл. И я сомневаюсь, что кто-то его найдёт, потому что клавиши в клиент посылаются тогда, когда флаг разморозки равен единице. Думаю, что все названные тобой флаги входят в флаг разморозки...

P.S. При поиске флага разморозки у меня всегда остаётся 1 зелёный адрес ;)

BritishColonist
14.01.2012, 13:15
Звук точно не входит в флаг разморозки, т.к. из неактивного окна не идёт звук в любом случае.

VeTaL_UA
14.01.2012, 13:27
Звук точно не входит в флаг разморозки, т.к. из неактивного окна не идёт звук в любом случае.
Разве? У меня, при размороженном клиенте, музыка играет даже, когда в браузере сидишь...

BritishColonist
15.01.2012, 06:44
Может, ты используешь другой способ анфриза?
Я пропатчил команду
SETNC AL
Заменил на
MOV AL, 01
NOP

Может, у тебя какой-нибудь джамп вообще в обход этого кода?

Мегазадрот
15.01.2012, 23:10
10 Можно идти еще дальше, нажать правой кнопкой по найденному адресу, и там в меню выбрать функцию поиска инструкций, которые записывает данные по этому найденому адресу.

11 В своем боте при нажатии "логин", запускать клиент игры с флагом CREATE_SUSPENDED, и пропатчить по адресу найденной инструкции свой код, например так:

//Патч, исключающий "заморозку" окна при потере им фокуса.

SIZE_T InjectedBytes;

BYTE AlwaysUnfreezePatch[] = {0xb0, 0x01}; //0x00431f02 mov al,1;

if (WriteProcessMemory(m_ProcessHandle, (LPVOID)0x00431f02, AlwaysUnfreezePatch, sizeof(AlwaysUnfreezePatch), &InjectedBytes) == FALSE)
{
ProcessTerminate();

return;
}

if (InjectedBytes != sizeof(AlwaysUnfreezePatch))
{
ProcessTerminate();

return;
}



Можно заодно многооконку сделать и прибить мультик с зелеными уродцами... Рыбки мне гораздо больше нравились)))) и музыка такая спокойная была (не та, в которой китаец по английский пел))))))

12 разморозить запущенный клиент....

BritishColonist
16.01.2012, 17:33
Ну тогда вот ещё несколько патчей до кучи (код вызывается из DLL):


DWORD dwClientBase = (DWORD)GetModuleHandle(NULL);

*(DWORD*)(dwClientBase+0x31EFF) = 0x849001B0; // unfreeze
*(BYTE*)(dwClientBase+0x431A0) = 0xEB; // multi-client
*(BYTE*)(dwClientBase+0x6BF045) = 0x31; // intro skip
*(BYTE*)(dwClientBase+0x4198B3) = 0x90; // extended smiles limit

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