Перейти к содержанию

Ghost Master Demo, оконный режим через отладку.


Рекомендуемые сообщения

Тема. Установка оконного режима в ручную.

Описание всех фукнкций и процедур можно найти в интернете. Они есть у всех в библиотеках user32.dll (если не ошибаюсь).

Похали. Берём игрушку и OllyDbg. Ищем все вложенные функции. Обращаем внимание на те, которые я пишу ниже.

При создании окна работают CreateWindowExA (или CreateWindow). Нужно поставить на них всех брейкпоинт, когда он сработает, то нужно изменить параметры в функции: высоту и ширину. Далее отпустить игру.

После задания размеров окна игра пытается получить его EnumDisplaySettings.

Далее фунцией ChangeDisplaySettings (или ChangeDisplaySettingsEx) пытается запомнить режим и включить полноэкранный.

LONG ChangeDisplaySettings(

LPDEVMODE lpDevMode, // графический режим

DWORD dwflags // параметры графического режима

);

Я не разобрался ещё какие цифры какой означают флаг, пока известно вот что:

dwflags при двойке - я думаю так или иначе был сохранением экрана.

dwflags при четвёрке - немедленно включал полноэкранный.

Болле подробно о флагах и инструкциях можно посомтреть здесь

Не допускайте чтобы флаг был четвёркой, пример ниже.

Как я устаналвивал оконный режим в игре "Ghost Master Demo" в OllyDbg.

1. Перехватил CreateWindowExA (поставил ширину и высоту 800 на 600)

2. На ChangeDisplaySettings внутри user32 поставил бряк. Когда он прервался я вышел вверх на неявный call (см. ниже)

jle метка1 // этот прыжок я сделал безусловным

цикл

call ebx // неявный вызов ChangeDisplaySettings(указатель, 2)

call ebx //второй неявный ChangeDisplaySettings(указатель, 4)

конец цикла

Метка1:

// тут же в отладке проскочила инфа в регистрах о том что режим остался "vga"

Во вреия игры при загрузке нового уровня, часто выполнялся тот прыжок jle метка1 и его пришлось просто пропатчить на jmp метка1.

Таким образом Игра была постоянно в оконном режиме (доказательство на рисунке). Хочу заметить что d3dWindower не помог, иначе бы не было этого туториала. На этом всё.

okno.jpg
Ссылка на комментарий
Поделиться на другие сайты

Выставление оконного режима по горячей клавише F2.

Весь интернет облазил как реализовать  ChangeDisplaySettings(NULL,0) на Дельфи. Просто ради интереса. Дело в том что NULL  нельзя поставить в Дельфи и в C#, потому что там должен быть укзатель на структуру. Можно в VC++ и средах ассемблера... Никто не знает ответа... Но не МастерGh  B)

Для результа - один раз восстановить окно дисплея подходит следующий метод  Внизу я написал код с указателем на объект DevMode (или это запись, уже точно не помню), затем скомпилировал, пошёл в OllyDbg и пропатчил начальные параметры перед функциией

Было 

004520BE   PUSH                             Project1.00459542; //флаг
004520C0 PUSH Project1.004595A4 // указатель на структуру 
004520C5 CALL ; ChangeDisplaySettingsA

Стало

000514BE     PUSH 0 // а вот и Null тот самый.
000514C0  PUSH Project1.004595A4
000514C5  CALL ; ChangeDisplaySettingsA

Сначала я написал такой код (кинул на пустую форму таймер и добавил строки (выделенные), остальное всё автоматически генерировалось)

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls;

type

TForm1 = class(TForm)

Timer1: TTimer;

procedure Button1Click(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

var

DevMode : TDeviceMode;

Msg : TMSG;

procedure TForm1.Button1Click(Sender: TObject);

begin

ChangeDisplaySettings(DevMode,0);

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

TranslateMessage(Msg);

if (GetAsyncKeyState(VK_F2) <> 0) then  ChangeDisplaySettings(DevMode,0);

DispatchMessage(Msg);

end;

end.

После патча, программа ставила основной режим и игра была в окне если его разрешение было меньше чем рабочего стола перед запуском игры.

Вот задание написать эту программу максимально маленького размера, а если не можете или лень то можете скачать отсюда.

Если игра постоянно проверяет видеорежим и выставляет свой, то моя программа не поможе - окно вновь будет восстанавливаться, но я думаю таких игр мало. В этом случе тоже можно написать утиль, но его придётся уже писать с хуками: после срабатывани ChangeDisplaySettings на установку полноэкранного режима надо пресекать исполнения режима и выводить ложный результат, дескать режим был установлен...

Ссылка на комментарий
Поделиться на другие сайты

Флаги функции ChangeDisplaySettings


dwflags
Indicates how the graphics mode should be changed. This parameter can be one of the following values. Value Meaning
0 The graphics mode for the current screen will be changed dynamically.
CDS_FULLSCREEN The mode is temporary in nature.
Windows NT/2000/XP: If you change to and from another desktop, this mode will not be reset.

CDS_GLOBAL The settings will be saved in the global settings area so that they will affect all users on the machine. Otherwise, only the settings for the user are modified. This flag is only valid when specified with the CDS_UPDATEREGISTRY flag.
CDS_NORESET The settings will be saved in the registry, but will not take affect. This flag is only valid when specified with the CDS_UPDATEREGISTRY flag.
CDS_RESET The settings should be changed, even if the requested settings are the same as the current settings.
CDS_SET_PRIMARY This device will become the primary device.
CDS_TEST The system tests if the requested graphics mode could be set.
CDS_UPDATEREGISTRY The graphics mode for the current screen will be changed dynamically and the graphics mode will be updated in the registry. The mode information is stored in the USER profile.
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.