Причин к написанию данной темы было три:
1. Меня попросили.
2. Когда-то давно я очень долго искал подобную тему, и не нашел.
3. Флайхаки работают только на фришках.
Итак начнем.
Первым делом опишу какие функции мы будем использовать:
1. FindWindow (модуль Windows)
function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall;
lpClassName - Имя класса окна (для PW - ElementClient Window)
lpWindowName - Текст заголовка окна (для PW - Element Client, для офа ПВ - Perfect World)
С помощью этой функции мы получим дескриптор (handle) окна.
2. GetWindowThreadProcessId (модуль Windows)
function GetWindowThreadProcessId(hWnd: HWND; lpdwProcessId: Pointer = nil): DWORD; stdcall; overload;
hWnd - дескриптор окна.
lpdwProcessId - указатель на переменную типа Dword, после использования функции в него скопируется идентификатор потока создавшего окно.
От этой функции нам нужен идентификатор потока (PID).
3. OpenProcess (модуль Windows)
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; stdcall;
dwDesiredAccess - Устанавливает права доступа к объекту (мы будем получать полные права доступа PROCESS_ALL_ACCESS)
bInheritHandle - Параметр дескриптора наследования.
dwProcessId - идентификатор потока.
С помощью этой функции мы получим права доступа к памяти объекта, и идинтификатор объекта.
После окончания работы с идентификатором объекта необходимо закрыть его функцией CloseHandle.
4. ReadProcessMemory (модуль Windows)
function ReadProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
nSize: DWORD; var lpNumberOfBytesRead: DWORD): BOOL; stdcall;
hProcess - Идентификатор объекта
lpBaseAddress - указатель на адрес из которого будем читать
lpBuffer - указатель на переменную-буфер, в которую будем читать значение из памяти.
nSize - количество байт, которое мы хотим прочитать.
lpNumberOfBytesRead - переменная-буфер, в которой устанавливается значение соответствующее количеству прочитанных байт.
С помощью этой функции мы будем "подбираться" к нужному нам адресу.
5. WriteProcessMemory (модуль Windows)
function WriteProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
nSize: DWORD; var lpNumberOfBytesWritten: DWORD): BOOL; stdcall;
hProcess - Идентификатор объекта
lpBaseAddress - указатель на адрес в который будем писать
lpBuffer - указатель на переменную-буфер, значение которой будем записывать в память.
nSize - количество байт, которое мы запишем в память
lpNumberOfBytesRead - переменная-буфер, в которой устанавливается значение соответствующее количеству записанных байт.
Теперь немного о структуре памяти Perfect World.
На жуке и иных порталах много говорят о оффсетах, но не все понимают что же это за зверь.
Оффсет это смещение относительно некоего адреса памяти.
[Ссылки могут видеть только зарегистрированные пользователи. ]
На скриншоте все что выше красной стрелки - отрицательные смещения, все что ниже - положительные.
К примеру у нас есть базовый адрес игры Perfect World - $009C0E6C и есть смещение $1C.
Запись вида [ba]+$1C значит что нужно прочесть значение лежащее по адресу $009C0E6C и прибавить к нему $1C, таким образом мы получим адрес начала блока игровой сессии, который по незнанию называют базовым адресом (более приемлимое (и принятое) название base pointer - базовый указатель) и используют в PWGtm (то есть можно сказать что [ba]+$1C=bp).
Запись вида [ba]+$1C+$20 значи что нам нужно прочесть значение лежащее по базовому адресу, прибавить к нему $1C, и получить базовый указатель, затем прочитать значение лежащее по адресу базового указателя и прибавить к нему $20. Таким образом мы получим указатель на начало структуры данных о персонаже.
$668 - смещение адреса в памяти отвечающего за полет (на самом деле в по этому адресу находится битовая структура с флагами состояния персонажа, но для простоты мы будем работать с целым байтом), относительно начала структуры данных о персонаже. Путь [ba]+$1C+$20+$668 приведет нас к нему.
Итак надеюсь все понятно, начнем кодить
Для начала бросим на форму две кнопки, и назовем их ВКЛ и ВЫКЛ
[Ссылки могут видеть только зарегистрированные пользователи. ]
Переключимся на редактор кода и напишем процедурку:
Код:
procedure FlyHack(state:bool);
const
base_addr=$009C0E6C;
fly_offset=$668;
var
WndHndl:THandle;
buf:byte;
ipbuf,PID,hProcess,BytesCount:dword;
begin
WndHndl:=findwindow('ElementClient Window',nil);
GetWindowThreadProcessId(WndHndl, @PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
if hProcess <> 0 then // Проверяем получен ли идентификатор объекта
try
ReadProcessMemory(hProcess, ptr(base_addr), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+$1C), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+$20), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+fly_offset), @buf, sizeof(buf), BytesCount);
if (buf<>$0) and (buf<>$10) then
messagebox(0,'Неверная версия клиента','Пишем флайхак',16)
else
begin
if state=true then // Если нажали "ВКЛ"
begin
buf:=$10;
writeprocessmemory(hProcess,ptr(ipbuf+fly_offset),@buf,1,BytesCount);
messagebox(0,'Клиент пропатчен','Пишем флайхак,64);
end;
if state=false then // Если нажали "ВЫКЛ"
begin
buf:=$0;
writeprocessmemory(hProcess,ptr(ipbuf+fly_offset),@buf,1,BytesCount);
messagebox(0,'Клиент пропатчен','Пишем флайхак',64);
end;
end;
finally
closehandle(hProcess);
end;
end;
Теперь в обработчики событий OnClick наших кнопок запишем:
для "ВКЛ" - FlyHack(true);
для "Выкл" - FlyHack(false);
Вуаля, флайхак готов.
В аттаче исходник проекта.
________________
Ни одно доброе дело не остается безнаказанным.
Программы:
PW: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
JD: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
Статьи: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
________________
Ни одно доброе дело не остается безнаказанным.
Программы:
PW: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
JD: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
Статьи: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Вопрос не ясен, расскажи хотя бы где ты их собираешься юзать и для чего.
________________
Ни одно доброе дело не остается безнаказанным.
Программы:
PW: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
JD: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
Статьи: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Да я как-то вот не могу понять что конкретно ты хочешь спросить.
Для извлечения инфы нужно читать байты по смещениям указанным в той теме.
________________
Ни одно доброе дело не остается безнаказанным.
Программы:
PW: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
JD: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
Статьи: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Ну так ведь нужно знать оффсеты что бы прочитать из памяти так вот я хочу узнать как из (оффсет левела из offsetretriever клиент 1.3.4) 00000448 сделать (пример)$009C0E6C.
и обрабатываем переменную buf.
У меня не возникло проблем с числовыми значениями.
А вот когда использую оффсет имя персонажа $608 и перевожу процедурой inttostr (buf) он мне дает значение типа 7046586 . Так вот вопрос как получить имя персонажа?
Если не трудно подскажи
Sergiuz, имя персонажа это не число, а строка. Я хоть и не знаю делфи, но что-то мне подсказывает, что inttostr - это перевод числа в строку.
Код процедуры, для получения строки из памяти. Под свои нужды подгоняйте сами
Код:
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~ Procedure to get UNICODE STRING from memory
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function TaPWT.getSTRING(aProcessID, aPointer: Cardinal; length: integer): WideString;
var
dwReaded: DWORD;
buf16: array [0 .. 16] of WideChar;
buf32: array [0 .. 32] of WideChar;
buf64: array [0 .. 64] of WideChar;
begin
if length = 16 then
begin
ReadProcessMemory(aProcessID, ptr(aPointer), @buf16, length, dwReaded);
Result := buf16;
end;
if length = 32 then
begin
ReadProcessMemory(aProcessID, ptr(aPointer), @buf32, length, dwReaded);
Result := buf32;
end;
if length = 64 then
begin
ReadProcessMemory(aProcessID, ptr(aPointer), @buf64, length, dwReaded);
Result := buf64;
end;
end;
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Быстрое снятие и загрузка скриншотов на хостинг.
TBX1n, спасибо
Но теперь возникла еще одна проблема по оффсету с именем персонажа выдает китайский иероглиф.
П.С. убрал смещение $20, то с использование оффсета $608 получаю сообщение
"Золотой карп бессмертный. Вы не можете его поймать если не заслуживаете этого" Ну это так лирическое отступление.
________________
Ни одно доброе дело не остается безнаказанным.
Программы:
PW: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
JD: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
Статьи: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Я не понимаю зачем писать флайхак если его можно щас скачать.
Ведь сервак всеравно откидывать будет
________________
Спасибо не говорят, СПАСИБО нажимают Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
НЕТилиДА, это просто руководство, для тех, кто хочет разобраться в клиенте пв, для тех, кто хочет научиться писать программы под него но не знает что и как
оно показывает пример программирования на делфи