[Скрипт] "Патчер памяти" или "Пишем флайхак" [Delphi] - Zhyk.Ru Forums
Регистрация Главная Пользователи Все разделы прочитаны
Сообщения за день Справка Регистрация
Навигация
Zhyk.Ru LIVE! Реклама на Zhyk.Ru Доска почета top.zhyk.ru (beta) Премиум-аккаунт

"Патчер памяти" или "Пишем флайхак" [Delphi]

-

Разработка ПО для Perfect World

- Бюро разработчиков Zhyk.Ru: создание ботов, снифферов и прочих программ для Perfect World

Ответ
 
Опции темы Опции просмотра
Старый 05.09.2010, 14:05   #1
Reaper
 Фельдмаршал
Аватар для Dinmaite
 
Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(
Регистрация: 13.08.2009
Сообщений: 1,000
Популярность: 22697
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 108
Поблагодарили 827 раз(а) в 393 сообщениях
Отправить сообщение для Dinmaite с помощью ICQ
 
По умолчанию "Патчер памяти" или "Пишем флайхак" [Delphi]

Причин к написанию данной темы было три:
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);

Вуаля, флайхак готов.

В аттаче исходник проекта.
Вложения
Тип файла: rar флайхак.rar (2.1 Кб, 903 просмотров)
  Ответить с цитированием
12 пользователя(ей) сказали cпасибо:
AEBus (05.09.2010), Богомол (20.11.2010), Amba (22.11.2010), Babls77 (08.04.2011), Kozalo (29.12.2010), mat-mat (01.10.2010), Meg(0) (05.09.2010), miopolop11 (22.12.2010), MySexy (05.09.2010), Saphire (05.09.2010), Sirioga (05.09.2010), Sterka_ru (09.09.2010)
Старый 06.09.2010, 11:59   #2
 Сержант
Аватар для jdark
 
jdark скоро будет известенjdark скоро будет известенjdark скоро будет известен
Регистрация: 30.08.2010
Сообщений: 121
Популярность: 249
Сказал(а) спасибо: 10
Поблагодарили 77 раз(а) в 23 сообщениях
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

а не подскажите делаю тоже самое но для джампа, смещение у него
+BF4 Jumping

заменил fly_offset=$BF4;
buf 10 на 1, и не работает зараза
  Ответить с цитированием
Старый 06.09.2010, 12:02   #3
Reaper
 Фельдмаршал
Аватар для Dinmaite
 
Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(
Регистрация: 13.08.2009
Сообщений: 1,000
Популярность: 22697
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 108
Поблагодарили 827 раз(а) в 393 сообщениях
Отправить сообщение для Dinmaite с помощью ICQ
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

Если и подскажу, то не в этой теме.
  Ответить с цитированием
Старый 07.09.2010, 13:58   #4
 Разведчик
Аватар для Mazzahaka777
 
Mazzahaka777 никому не известный тип
Регистрация: 17.04.2010
Сообщений: 3
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

Вопрос:как юзать хекс\dec оффсеты Оо
  Ответить с цитированием
Старый 07.09.2010, 14:04   #5
Reaper
 Фельдмаршал
Аватар для Dinmaite
 
Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(
Регистрация: 13.08.2009
Сообщений: 1,000
Популярность: 22697
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 108
Поблагодарили 827 раз(а) в 393 сообщениях
Отправить сообщение для Dinmaite с помощью ICQ
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

Вопрос не ясен, расскажи хотя бы где ты их собираешься юзать и для чего.
  Ответить с цитированием
Старый 07.09.2010, 14:14   #6
 Разведчик
Аватар для Mazzahaka777
 
Mazzahaka777 никому не известный тип
Регистрация: 17.04.2010
Сообщений: 3
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

Собсно для извлечения инфы из процесса(левел бла бла и тд).откуда ?offset retriever by noob
Или это не те оффсеты ?х)

Последний раз редактировалось Mazzahaka777; 07.09.2010 в 14:29.
  Ответить с цитированием
Старый 07.09.2010, 14:36   #7
Reaper
 Фельдмаршал
Аватар для Dinmaite
 
Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(
Регистрация: 13.08.2009
Сообщений: 1,000
Популярность: 22697
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 108
Поблагодарили 827 раз(а) в 393 сообщениях
Отправить сообщение для Dinmaite с помощью ICQ
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

Да я как-то вот не могу понять что конкретно ты хочешь спросить.
Для извлечения инфы нужно читать байты по смещениям указанным в той теме.
  Ответить с цитированием
Старый 07.09.2010, 14:41   #8
 Разведчик
Аватар для Mazzahaka777
 
Mazzahaka777 никому не известный тип
Регистрация: 17.04.2010
Сообщений: 3
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

Ну так ведь нужно знать оффсеты что бы прочитать из памяти так вот я хочу узнать как из (оффсет левела из offsetretriever клиент 1.3.4) 00000448 сделать (пример)$009C0E6C.
  Ответить с цитированием
Старый 07.09.2010, 18:01   #9
-= Илитный Мастер =-
 Главнокомандующий
Аватар для AEBus
 
AEBus сломал счётчик популярности :(AEBus сломал счётчик популярности :(AEBus сломал счётчик популярности :(AEBus сломал счётчик популярности :(AEBus сломал счётчик популярности :(AEBus сломал счётчик популярности :(AEBus сломал счётчик популярности :(AEBus сломал счётчик популярности :(AEBus сломал счётчик популярности :(AEBus сломал счётчик популярности :(AEBus сломал счётчик популярности :(
Регистрация: 27.03.2009
Сообщений: 1,669
Популярность: 67466
Сказал(а) спасибо: 246
Поблагодарили 1,560 раз(а) в 691 сообщениях
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

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


[Ссылки могут видеть только зарегистрированные пользователи. ]
  Ответить с цитированием
Старый 10.09.2010, 13:40   #10
 Разведчик
Аватар для Sergiuz
 
Sergiuz никому не известный тип
Регистрация: 28.11.2009
Сообщений: 6
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

Практически понятно
т.е. для получение к примеру уровня мы используем код:
Код:
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+$464), @buf, sizeof(buf), BytesCount);
и обрабатываем переменную buf.
У меня не возникло проблем с числовыми значениями.
А вот когда использую оффсет имя персонажа $608 и перевожу процедурой inttostr (buf) он мне дает значение типа 7046586 . Так вот вопрос как получить имя персонажа?
Если не трудно подскажи
  Ответить с цитированием
Старый 10.09.2010, 13:49   #11
-= Элитный Мастер =-
 Главнокомандующий
Аватар для Kitsune
 
Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(
Регистрация: 20.01.2010
Сообщений: 1,541
Популярность: 22780
Золото Zhyk.Ru: 600
Сказал(а) спасибо: 43
Поблагодарили 1,716 раз(а) в 538 сообщениях
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

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;
________________
Fireball - Быстрое снятие и загрузка скриншотов на хостинг.
  Ответить с цитированием
Старый 10.09.2010, 14:34   #12
 Разведчик
Аватар для Sergiuz
 
Sergiuz никому не известный тип
Регистрация: 28.11.2009
Сообщений: 6
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

TBX1n, спасибо
Но теперь возникла еще одна проблема по оффсету с именем персонажа выдает китайский иероглиф.
П.С. убрал смещение $20, то с использование оффсета $608 получаю сообщение
"Золотой карп бессмертный. Вы не можете его поймать если не заслуживаете этого" Ну это так лирическое отступление.
  Ответить с цитированием
Старый 10.09.2010, 14:53   #13
Reaper
 Фельдмаршал
Аватар для Dinmaite
 
Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(
Регистрация: 13.08.2009
Сообщений: 1,000
Популярность: 22697
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 108
Поблагодарили 827 раз(а) в 393 сообщениях
Отправить сообщение для Dinmaite с помощью ICQ
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

потому что оффсет имени [ba]+$1C+$20+$608+$0
  Ответить с цитированием
Старый 10.09.2010, 17:08   #14
 Сержант
Аватар для НЕТилиДа
 
НЕТилиДа лучик света в грозовом небеНЕТилиДа лучик света в грозовом небеНЕТилиДа лучик света в грозовом небеНЕТилиДа лучик света в грозовом небеНЕТилиДа лучик света в грозовом небеНЕТилиДа лучик света в грозовом небеНЕТилиДа лучик света в грозовом небе
Регистрация: 05.04.2010
Сообщений: 134
Популярность: 805
Сказал(а) спасибо: 38
Поблагодарили 55 раз(а) в 33 сообщениях
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

Я не понимаю зачем писать флайхак если его можно щас скачать.
Ведь сервак всеравно откидывать будет
________________
Спасибо не говорят, СПАСИБО нажимают
  Ответить с цитированием
Старый 10.09.2010, 17:21   #15
 Сержант
Аватар для Nitrosgen
 
Nitrosgen гордость нацииNitrosgen гордость нацииNitrosgen гордость нацииNitrosgen гордость нацииNitrosgen гордость нацииNitrosgen гордость нацииNitrosgen гордость нацииNitrosgen гордость нацииNitrosgen гордость нацииNitrosgen гордость нацииNitrosgen гордость нации
Регистрация: 16.08.2010
Сообщений: 165
Популярность: 2760
Сказал(а) спасибо: 6
Поблагодарили 45 раз(а) в 35 сообщениях
 
По умолчанию Re: "Патчер памяти" или "Пишем флайхак" [Delphi]

НЕТилиДА, это просто руководство, для тех, кто хочет разобраться в клиенте пв, для тех, кто хочет научиться писать программы под него но не знает что и как
оно показывает пример программирования на делфи
  Ответить с цитированием
Ответ

Метки
flyhack, патчер памяти, пишем флайхак, perfect world

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] Мало памяти для JVM Shaikan Вопросы и ответы, обсуждения 2 14.01.2013 03:11
[Статья] Пишем брутфорс [Delphi] ReAct1[on] Pascal/Delphi 1 16.11.2012 19:34
СЕ на PvPwar + еще 1 редактор памяти Lumer Rising Force Online 26 25.02.2009 21:35

www.webmoney.ru
Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 08:59.

Пишите нам: forum@zhyk.ru
Copyright © 2019 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net