PDA

Просмотр полной версии : [Помогите!] Как искать оффсеты?


mars2107
08.12.2012, 14:55
Порой есть исходники некоторых читов и ботов для старых версий aion'а. Но оффсеты там устарели.

Есть просьба, кто знает как их искать :rolleyeyes: (мысленно 2 человека в голове уже вертятся), напишите гайд специально по айону, пошагово для чайников. Со скринами и видео если таково возможно. Причем разных параметров. Например CX, ноуаним и такие как поиск координат. информацию о других персонажей. Для меня это как черный лес манит любопытством, но и отталкивает отсутствием о нем информации.

RemoteAccess
08.12.2012, 23:19
С помощью CheatEngine. Вот один ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) гайд, вот другой ([Ссылки могут видеть только зарегистрированные и активированные пользователи]). От этих оффсетов ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) можно отталкиваться в поисках.

-Emp-
08.12.2012, 23:56
(мысленно 2 человека в голове уже вертятся)

Кто это? :eek:

Если ты имеешь ввиду "информацию о других персонажей", как окружающие объекты, то просто знать оффсет тут мало, нужна ещё функция обхода в глубину. Например мы нашли EntityOffset. И начиная от этого адреса идет список других адресов, а в них ещё другие, как дерево.

Вот пример картинки:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

И так вот мы проходим через каждый указатель и фильтруем его. Если объект удовлетворяет нас (Игрок, НПС, Игрок противоположной расы), то добавляем его в список Entity, а потом отображаем их на экране или в окне программы, отфильтровав ещё раз по характеристикам НПС или Игрок, Игрок твоей расы или противоположной.

mars2107
10.12.2012, 10:44
Дохожу в Гайде ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) до 9ого пункта и клиент с игрой крашиться и вылетает sendlog. Для начала хотел попробовать найти оффсет на свои хп.

Когда искал понял что понятие не имею как найти чужое хп, левл и другие параметры которые не отображаются заранее. Также например изменение координат xyz, все таки хочется научиться, чтоб других не напрягать.

-Emp-
10.12.2012, 11:08
Дохожу в Гайде ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) до 9ого пункта и клиент с игрой крашиться и вылетает sendlog.

В настройках CE, во вкладке Debugger выбери Use VEH Debugger.

mars2107
10.12.2012, 12:57
Пробую искать свое ХП, но на 6-ом пункте после просеивания мне сразу выдает 2 зеленых значения.


[Ссылки могут видеть только зарегистрированные и активированные пользователи]

дальше по пунктам выполняю и он ничего не находит.

Вопрос: для значений с точкой, что выставлять в Scan Type и Value Type ?? Ставил Float искал, но тоже фейл на каком то пункте. уже не помню.

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


[Ссылки могут видеть только зарегистрированные и активированные пользователи]

-Emp-
10.12.2012, 13:50
Зеленый это и есть статический адрес. Дальше искать не нужно ты его нашел.
С деньгами по-сложнее. Лучше пока ищи хп, ману, опыт, координаты. Координаты: тип float. Ищешь неизвесное значение, потом двигаешься только не шаг вперед, а норм, чтоб левее, правее. И отсеивай Changed value, иногда не двигайся и отсеивай Unchanged value.

RemoteAccess
10.12.2012, 16:03
Дохожу в Гайде до 9ого пункта и клиент с игрой крашиться и вылетает sendlog.

Если крашится после подключения отладчика, то надо в настройках читэнжина в "Debugger options" поставить "Use cernelmode debugger"

-Emp-
10.12.2012, 16:14
Если крашится после подключения отладчика, то надо в настройках читэнжина в "Debugger options" поставить "Use cernelmode debugger"

Нет) Наоборот Use VEH Debugger

RemoteAccess
10.12.2012, 16:16
Нет) Наоборот Use VEH Debugger

Похоже на то, что оба метода работают. Так что, можно любой из двух включить, а не по умолчанию оставлять.

Ginrey
28.12.2012, 21:36
дальше по пунктам выполняю и он ничего не находит.

Вопрос: для значений с точкой, что выставлять в Scan Type и Value Type ?? Ставил Float искал, но тоже фейл на каком то пункте. уже не помню.

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


С Аионом еще не сталкивался , но в PW опыт имеется. Разницы между ними никакой.
Смотри. Предположим ты ищешь деньги, после окончательного отсеивания у тебя как раз и остается 1 белый адрес, это динамический адресс( то есть каждый раз при входе игру он будет меняться). Зеленый адресс статический (то есть неизменный) но обычно мало неизменных адресов, в основном все динамические и методом ветвления мы находим один единственный адресс из которого все эти значения исходят, таковой называют - базовым адресом.
Так вот, отошли от темы, чтобы найти ветку от найденного тобой динамического адреса к статическому нужно сделать несколько действий. каких , я рассписывать не буду, пример ты можешь посмотреть в этой теме ([Ссылки могут видеть только зарегистрированные и активированные пользователи]). Все довольно просто, а остальное в зависимости от языка на котором программируешь, составляешь программу

Levapishe
09.01.2013, 15:39
Вопрос на счет Дебаггера - у меня 7ка 64ая - стандартный дает крэш когда делаю Брейкпоинт на Доступ. Кернелмод дает БСОД а ВЕХ норм но потом не реагирует на изменения-пустой экран. что посоветуете, кроме установки х32?

-Emp-
09.01.2013, 17:37
ВЕХ норм но потом не реагирует на изменения-пустой экран

У меня тоже х64, какая разница. Не реагирует значит ничего не нашел на доступ. Но VEH лучше всего использовать, это походу фишка Cheat Engine, они как то на форуме своем советовали.

Levapishe
09.01.2013, 17:58
Спасибо! буду продолжать

warenav1
29.05.2013, 12:39
У меня есть базовый адрес моих координат, как мне нужно его менять? Как запихать его в программу? Тоже очень бы хотелось разобраться с этими вопросами, очень хочется написать, что-то своё.

mars2107
25.06.2013, 13:32
Тигрь, к тебе вопрос. У тебя в теме Руководство по написанию чит программ. Часть 1 by Тигрь! ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) все описано, спасибо. Но опять же оффсеты, то ты там не описал. Можешь объяснить как с этим работать. Я нашел указатели, для примера взял значение хп.

Что то подоюное получилось, сохранив в артмани:


"Значение 1","Game.dll+P000B1324","","","","ni4","","0",
"Значение 2","Game.dll+P001BF634","","","","ni4","","0",
"Значение 3","Game.dll+P0051A5EE","","","","ni4","","0",


набрал в поиск кол-во хп, нашел отсеял, взял уже из результата адрес и снова нашел, но уже не значение, а указатель. Вывел 3 результата. Как их испоьзовать, я в этом еще новенький. Знаю только делфи, недавно познакомился с указателями. Можно попросить пример использования чтения с клиента информации, а не только записи.

Я там видел у тебя такие значения $00D1B4F0 на найденые мною P000B1324 отличаются, я про формат. Как правильно их в надлежащую форму привести?

Тигрь
25.06.2013, 14:52
Тигрь, к тебе вопрос. У тебя в теме Руководство по написанию чит программ. Часть 1 by Тигрь! ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) все описано, спасибо. Но опять же оффсеты, то ты там не описал. Можешь объяснить как с этим работать. Я нашел указатели, для примера взял значение хп.

Что то подоюное получилось, сохранив в артмани:


"Значение 1","Game.dll+P000B1324","","","","ni4","","0",
"Значение 2","Game.dll+P001BF634","","","","ni4","","0",
"Значение 3","Game.dll+P0051A5EE","","","","ni4","","0",


набрал в поиск кол-во хп, нашел отсеял, взял уже из результата адрес и снова нашел, но уже не значение, а указатель. Вывел 3 результата. Как их испоьзовать, я в этом еще новенький. Знаю только делфи, недавно познакомился с указателями. Можно попросить пример использования чтения с клиента информации, а не только записи.

Я там видел у тебя такие значения $00D1B4F0 на найденые мною P000B1324 отличаются, я про формат. Как правильно их в надлежащую форму привести?

Там в примере чтение и запись в память показана как делается. $00D1B4F0, знак $ Означает что записанное следом за ним число представлено в 16-ричной системе счисления. Просто вписываешь значение свое и все.

warenav
14.07.2013, 14:02
Собственно хотел попытаться считать свои хп, но при компиляции выскакивает единственная ошибка в константе базового адреса:
[Error] Unit1.pas(9): Undeclared identifier: 'game'
Может кто-нибудь пояснить, как от этого избавиться?

FuryRang
15.07.2013, 14:18
Собственно хотел попытаться считать свои хп, но при компиляции выскакивает единственная ошибка в константе базового адреса:
[Error] Unit1.pas(9): Undeclared identifier: 'game'
Может кто-нибудь пояснить, как от этого избавиться?

Апну, мучил гугл, не нашёл.

-Emp-
15.07.2013, 20:08
Собственно хотел попытаться считать свои хп, но при компиляции выскакивает единственная ошибка в константе базового адреса:
[Error] Unit1.pas(9): Undeclared identifier: 'game'
Может кто-нибудь пояснить, как от этого избавиться?

Ты не объявил переменную 'game'

FuryRang
15.07.2013, 20:12
Ты не объявил переменную 'game'

Нашёл, как нужно сделать, ба нужно объявлять вот так:

b_addr = Hex(Proc.GetModuleBaseFromProcessName("AION.bin", "game.dll"))

Tr0y
16.07.2013, 18:16
Game.dll это динамическая библиотека, которая в том числе, будучи загруженной, хранит знаечния показателей персонажа, в том числе и его значений ХП.

Вообще по всем ошибкам можно найти ответ в гуглах. В данном случае ошибка поруске:
[Ошибка] Unit1.pas(9): Неопознанный идентификатор: 'game'

А чтобы найти "базовый адрес дллки", я юзаю:
function GetModuleHandleEx(dwProcessID: DWord; pModuleName: PChar): DWord;
var
FSnapshotHandle: THandle;
FModuleEntry32 : TModuleEntry32;
ContinueLoop : Boolean; tpmSTR: PWideChar;
begin
Result := 0;
dwProcessID := GetProcessID(dwProcessID);
if (dwProcessID = 0) then
Exit;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwProce ssID);
FModuleEntry32.dwSize := Sizeof(FModuleEntry32);
ContinueLoop := Module32First(FSnapshotHandle,FModuleEntry32);
while ContinueLoop do begin
tpmSTR := FModuleEntry32.szModule;
tpmSTR := PWideChar(tpmSTR);
if (Pos(UpperCase(pModuleName),UpperCase(tpmSTR)) > 0) then
Result := FModuleEntry32.hModule;
ContinueLoop := Module32Next(FSnapshotHandle,FModuleEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

Юзается как: hGame := GetModuleHandleEx(HWND_AionClient, PChar('game.dll'));
,где HWND_AionClient -хендл процесса клиента с правами на доступ(см. Openprocess ([Ссылки могут видеть только зарегистрированные и активированные пользователи](v=vs.85).aspx))

warenav
16.07.2013, 19:05
Game.dll это динамическая библиотека, которая в том числе, будучи загруженной, хранит знаечния показателей персонажа, в том числе и его значений ХП.

Вообще по всем ошибкам можно найти ответ в гуглах. В данном случае ошибка поруске:
[Ошибка] Unit1.pas(9): Неопознанный идентификатор: 'game'

А чтобы найти "базовый адрес дллки", я юзаю:
function GetModuleHandleEx(dwProcessID: DWord; pModuleName: PChar): DWord;
var
FSnapshotHandle: THandle;
FModuleEntry32 : TModuleEntry32;
ContinueLoop : Boolean; tpmSTR: PWideChar;
begin
Result := 0;
dwProcessID := GetProcessID(dwProcessID);
if (dwProcessID = 0) then
Exit;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwProce ssID);
FModuleEntry32.dwSize := Sizeof(FModuleEntry32);
ContinueLoop := Module32First(FSnapshotHandle,FModuleEntry32);
while ContinueLoop do begin
tpmSTR := FModuleEntry32.szModule;
tpmSTR := PWideChar(tpmSTR);
if (Pos(UpperCase(pModuleName),UpperCase(tpmSTR)) > 0) then
Result := FModuleEntry32.hModule;
ContinueLoop := Module32Next(FSnapshotHandle,FModuleEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

Юзается как: hGame := GetModuleHandleEx(HWND_AionClient, PChar('game.dll'));
,где HWND_AionClient -хендл процесса клиента с правами на доступ(см. Openprocess ([Ссылки могут видеть только зарегистрированные и активированные пользователи](v=vs.85).aspx))
Спасибо большое. :hd:

-Emp-
16.07.2013, 19:29
Ну тогда вот моя для паскаля и си++)


function GetModuleAddress(iProcId: Cardinal; DllName: String): Cardinal;
var
hSnap: THandle;
cModule: ModuleEntry32;
begin
Result := 0;
hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPMODULE, iProcId);
cModule.dwSize := SizeOf(cModule);
if Module32First(hSnap, cModule) then
begin
while Module32Next(hSnap, cModule) do
if cModule.szModule = DllName then
Result := Cardinal(cModule.modBaseAddr);
end;
CloseHandle(hSnap);
end;



DWORD GetModuleAddress(DWORD iProcId, char* DllName)
{
HANDLE hSnap;
MODULEENTRY32 cModule;
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, iProcId);
cModule.dwSize = sizeof(cModule);

if (Module32First(hSnap, &cModule))
{
while (Module32Next(hSnap, &cModule))
{
if (strcmp(cModule.szModule, DllName) == 0)
{
CloseHandle(hSnap);
return (DWORD)cModule.modBaseAddr;
}
}
}
CloseHandle(hSnap);
return 0;
}

warenav
19.07.2013, 21:09
Опять умоляю о хелпе, сейчас просто не понимаю, что я не так сделал. Перелопатил MSDN по ReadProcessMemory.
Но так и не могу понять, почему не читается =_=
Листинг

const Curr_HP = $10A2A84;

var
buf:byte;
hProcess,PID:dword;
BytesCount:cardinal;
Form1: TForm1;
base:integer;
..........

{Здесь получается хэндл окна и идиентификатор процесса(всё проверено, всё верно)}
..........

base:=GetModuleAddress(PID,'Game.dll');
ReadProcessMemory(PID,ptr(base+curr_hp),@buf,4,byt escount);
label1.caption:=inttostr(bytescount); {но выводится 0}
end;



Собственно не знаю в чём проблема, оффсет верен, добавил в CE, там всё работает. Буду рад, если кто-нибудь растолкует, что я делаю не так.

warenav
20.07.2013, 22:36
Посмотрел несколько листингов программ с использованием ReadProcessMemory, абсолютно всё так же как у меня, проверить работоспособность не могу, но по коду всё верно.

Добавлено через 21 час 32 минуты
Попробовал перевести базовый адрес в Hex систему, и сложить в ручную. Не помогло.

Tr0y
21.07.2013, 20:22
Там еще от версии Delphi зависит, в свое время она (2007 ?) перешла на Unicode и многие API с кодировки по умолчанию ANSI перешли на Unicode.

Тема "Патчер памяти" или "Пишем флайхак" [Delphi] ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Если учишся програмить, то я бы выбрал c#, т.к. последний имеет большую популярность и инет уже полон инфы по нему.

warenav
21.07.2013, 20:53
c#
Знаний в делфи у меня всё таки по-более будет, там хоть что-то могу. Хотя языки одинаковые практически, то есть нужно выучить лишь операторы обоих.
з.ы. а в чём всё таки проблема у меня?

Добавлено через 3 минуты
з.ы.ы. пользуюсь 2007ой, да.

-Emp-
21.07.2013, 21:26
Опять умоляю о хелпе, сейчас просто не понимаю, что я не так сделал. Перелопатил MSDN по ReadProcessMemory.
Но так и не могу понять, почему не читается =_=
Листинг

const Curr_HP = $10A2A84;

var
buf:byte; - byte = 255(адрес сюда даже не влезит, нада Dword)
hProcess,PID:dword;
BytesCount:cardinal;
Form1: TForm1;
base:integer;
..........

{Здесь получается хэндл окна и идиентификатор процесса(всё проверено, всё верно)}
..........

base:=GetModuleAddress(PID,'Game.dll');
ReadProcessMemory(PID,ptr(base+curr_hp),@buf,4,byt escount); - buf - 1 байт, а читаешь 4 байта. И чего добиться хотел?
label1.caption:=inttostr(bytescount); {но выводится 0} - Он у тебя всегда будет 0, нас интересует адрес (это buf) а ник кол-во байтов.
end;



Собственно не знаю в чём проблема, оффсет верен, добавил в CE, там всё работает. Буду рад, если кто-нибудь растолкует, что я делаю не так.

Ахинеи понаписал)))
0 - выводится потому, что в GetModuleAddress мы юзаем ProcessID, а в ReadProcessMemory мы юзаем handle процесса. И выводим мы buf, а ни bytescount. Перечитай функцию ReadProcessMemory и посмотри примеры различные.

Вот тебе пример. Должен работать, сам не проверял:

WindowName: Integer;
ProcessId: Integer;
ThreadId: Integer;
HandleWindow: Integer;
base: Cardinal;
buf: Dword;

...

procedure блаблабла:

WindowName := FindWindow(nil, 'Окно');
if WindowName <> 0 then
begin
ThreadId := GetWindowThreadProcessId(WindowName, @ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
base := GetModuleAddress(ProcessId, 'Game.dll');
ReadProcessMemory(HandleWindow, Ptr(base+$10A2A84), @buf, 4, bytescount);
label1.caption:=inttostr(buf);
end;

warenav
21.07.2013, 21:52
Спасибо, сейчас попробую. Выводил байтскаунт, чтобы узнать сколько считалось.

Добавлено через 50 минут
Получилось, большое спасибо.

Tr0y
22.07.2013, 03:51
Вы еще строк не видели))


Типы СЕ и их аналоги в Delphi:
1 byte = Byte
2 byte = Word
4 byte = Cardinal
8 byte = int64
float = single
text = ANSIString, UnicodeString

ReadProcessMemory(HandleWindow, Ptr(base+$10A2A84), @buf, 4, bytescount);
я бы поменял немного, на так:
ReadProcessMemory(HandleWindow, Ptr(base+$10A2A84), @buf, sizeof(buf), bytescount);

-Emp-
22.07.2013, 04:04
Вы еще строк не видели))

Ты о чем?

Tr0y
22.07.2013, 04:17
Ты о чем?
Ну анси символы читаются просто, но с юникодом там небольшая особенность есть с типами в Delphi.
buf_str := buf2;
result := buf_str;костыль такой, гы/dgs (массив символов в строковый)

-Emp-
22.07.2013, 05:53
Да ничего там сложного нет, если ты это имеешь ввиду:

Text = AnsiString(PAnsiChar($address));

или это

s:PAnsiChar;
WideString(AnsiString(s));

или вот:

function StringToWideChar(const Source: string; Dest: PWideChar; DestSize: Integer): PWideChar;

Добавлено через 9 минут

4 byte = Cardinal


Ну раз уж так, то в CE это скорее Dword или Integer, потому что Cardinal - беззнаковое.


Вы еще строк не видели))


Ну а на счет строк, я, не с*издеть, уже довольно много с ними работал. :rolleyeyes:

warenav
22.07.2013, 15:24
Эх, сижу дома и продолжаю мучать айон.
Большое спасибо Емпу и Трою за разъяснения(были бы спасибки :notme:). Всё отлично читается, главное правильно указывать размер и тип того, что читается.
Решил попробовать изменить Z координату и заморозить её при помощи таймера.


var

coord:single;
buf,ipbuf:dword;
hProcess,PID:dword;
BytesCount:cardinal;
base:integer;

const

Pos_Z = $10A242C;

.........................


//Получение PID'а и хэндла
PID:=getPID('AION.bin');
if pid=0 then PID:=getPID('aion.bin');
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,PID );
if hProcess=0 then
begin
messagebox(0,'Aion dont run','error',64);
Application.Terminate;
exit;
end;
base:=GetModuleAddress(PID,'Game.dll');
ReadProcessMemory(hProcess,ptr(base+Pos_Z),@coord, 8,bytescount);
Coord:=coord+1;
Timer1.Enabled:=True;
//Это нажатие на кнопку


.........

//Тут таймер, интервал 80
WriteProcessMemory(hProcess,ptr(base+Pos_Z),@coord ,8,bytescount);



Но не работает, в игре просто ничего не происходит, как падал, так и падаю. Х и У тоже не меняются. Прошу растолковать. Буду благодарен, заранее спасибо.

Добавлено через 19 часов 36 минут
Хм странно, попробовал в халф-лайф, там получилось, патроны изменились и заморозились. А почему с айоном не робит - не пойму.

Добавлено через 23 часа 28 минут
Смена размера записи на
WriteProcessMemory(hProcess,ptr(base+Pos_Z),@coord ,sizeof(coord),bytescount);
ничего не дало...

mars2107
07.07.2014, 16:23
Изучая зарубежные сайты, нашел еще 1 гайд по теме.

offset tutorial ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) придется регаться, для просмотра.