Доброй ночи. Хотел спросить насчёт инжекта использования предмета из инвентаря. Адрес в шапке 00668490 судя по всему работает (хотя помечен звёздочкой). Вобщем, нашёл я кусок кода, который вызывается при использовании предметов в инвентаре. Если проследовать по коду, то после нескольких проверок и джампов в зависимости от того, используемый предмет или нет, откат у предмета или нет мы попадаем к вызову функции как раз по этому адресу. Но там есть один параметр, значение которого я не знаю. Там какой-то адрес, который не меняется, пока не перезапустишь клиент. Судя по всему указывает на какую то структуру. Если в этом параметре прямо числовым значением указать то что показывает Olly в этом регистре перед вызовом функции, то инжект работает. Может кто выложить asm код инжекта, или подсказать на какую структуру указывает этот адрес?
Вот ниже код
Код:
// Использование предмета
void __stdcall UseItem_THREAD(CELL_ITEM* itm)
{
DWORD id = itm->id;
DWORD num = itm->CellNum;
DWORD Function = 0x00668490;
DWORD HZadress = 0x07C3E3C4; // если подставить напрямую значение которое показывает Olly
__asm
{
PUSH 1 // ; /Arg4 = 1
PUSH id // ; |Arg3 // ид предмета (проверил по базе)
PUSH num // ; |Arg2 //номер ячейки, отсчёт от 0
PUSH 0 // ; |Arg1 = 0
MOV ECX,HZadress // ; | // ХЗ что такое(
CALL Function // ; \elementclient.00668490
}
}
void GAME_PROC::UseItem(DWORD id, int cell)
{
CELL_ITEM itm;
itm.id=id;
itm.CellNum=cell;
InjectAndExecute(&UseItem_THREAD, &itm);
}
Добавлено через 4 часа 41 минуту
Всё, допёр что за цепочка была. Вот что получилось
Код:
void __stdcall UseItem_THREAD(CELL_ITEM* itm)
{
DWORD id = itm->id;
DWORD num = itm->CellNum;
DWORD Function = 0x00668490;
__asm
{
PUSH 1 // ; /Arg4 = 1
PUSH id // ; |Arg3
PUSH num // ; |Arg2
PUSH 0 // ; |Arg1 = 0
MOV ECX,[BA]
MOV ECX,[ECX+0x20]
ADD ECX,0x0EC
CALL Function // ; \elementclient.00668490
}
}
Сейчас инжект использования предмета рабочий.
Если кто-нибудь без пакетов делает, пригодится)
Последний раз редактировалось dwa83; 02.04.2012 в 05:21.
Причина: Добавлено сообщение
anderwhat, на общие статы один пакет, на расширенные статы другой пакет, а так же на каждый тип инвентаря свой пакет.
Клиент свои статы не запрашивает, все приходит при подключении к серверу, а так же при любом изменении оных.
З.Ы. На сколько я помню
________________
Официальный твинк Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). 'a.
Используйте packet listener. Запускаете, делаете пкм - показать игрока и смотрите какой пакет поймали. Там более чем тривиально все. Потом будете подменять ID игрока на нужного и получать окошко, но таймаут вам не обойти.
По поводу названий предметов, которые надеты на цели, вам придется найти структуру, схожую с вашим эквипом и распарсить её.
________________
Официальный твинк Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). 'a.
Если её еще никто не нашел и не выложил, то возможный алгоритм поиска таков:
1. Открываем информацию о персонаже Х
2. Видим в слоте "Броня" находится предмет с ID N.
3. Ищем все значения в памяти клиента соответствующие этому ID
4. Открываем другое окна с информацией о персонаже
5. Отсеиваем значения, которые уже равны ID брони второго игрока
6. Делаем так пока не найдем точный адрес
7. Ставим "бряк" на этом адресе (what writes on this address) или как-то так...
8. Снова открываем игрока и в окошке дебагера видим адреса, по которым производится запись в нашу ячейку памяти.
9. Пытаемся найти нужные оффсеты. (есть гайды, например поиск базового адреса)
В целом как-то так.
________________
Официальный твинк Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). 'a.
Подскажите пакет на крафт, в котором на рецепт перетаскивать нужно части. Например, нирвана.
Крафтил много раз, пакеты отличаются только двумя байтами, в котором указана ячейка, откуда берется пуха и восприятия соответственно. При отправке пакета - клиент вылетает со светофором.
Помогите, пожалуйста
________________
Больше не занимаюсь читами, ушёл в серверную часть. Новый ник - int 3.
P.S. Но я всё такой же добрый модератор раздела PW.
Не мог бы кто-нибудь кратко объяснить (можно просто пару ссылок) мне разницу между "использованием пакетов" и инжектом кода, скажем, для реализации функции прыжка? Я нуб, читаю, пытаюсь понять, но пока именно этот момент взрывает мне мозг.
ktulx, инжект это такая функция, которая имитирует действие игрового клиента, используя при этом копию оригинальной функции клиента либо вызывая её, ничего не копируя.
"Пакеты" - это инжект функции отправки пакета. Как правило большинство инжектов, используемых для бота, в конечном итоге формируют и отправляют пакет.
Когда пишут "инжект", имеют в виду инжект действия, если говорят "пакет", то подразумевается отправка пакета этого действия через стандартную функцию клиента.
Некоторые вещи проще делать отправкой пакета, а некоторые - инжектами действий.
Но, как правило, эти варианты взаимоисключающие. Если используешь инжект действия, то клиент дальше сам сформирует пакет. Происходит это посредством "вложенных" вызовов функции-инжекта. Если используешь пакет, то отпадает смысл составлять код инжекта.
Плюс пакетов в том, что внедряемый код весит меньше и в том, что при обновлении версии клиента функцию отправки пакета гораздо проще обновить (т.к. сами пакеты, как правило, остаются одинаковыми всегда).
Короче, пакет - это тоже инжект, поэтому в плане кода и его внедрения в процесс игры здесь разницы нет.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
Последний раз редактировалось BritishColonist; 19.04.2012 в 22:58.
================================================== ===========================
Функция Закрытия окна на Delphi для клиента ver 1.4.5 build 2305
================================================== ===========================
Функция для внедрения:
procedure WinClose(WIN_OFFSET:DWord);
var aParams:TParams;
begin
aParams.Param1:=WIN_OFFSET; //Ñìåùåíèå îêíà èç ñïèñêà
InjectFunc(Form1.hProcess,@WinCloseCall,@aParams,SizeOf(aParams));
end;
Вызов:
Код:
procedure TForm1.Button3Click(Sender: TObject);
begin
WinClose($41C); //Закрыть окно Торговли и Ремоната.
end;
Список смещений для передачи в функцию:
Код:
0x2C8 Действия
0x2D0 Игроки и группы
0x2D4 Служба поддержки
0x324 Характеристики персонажа
0x33C Ремонт
0x37C Призыв духа
0x3F8 Помощь
0x41C Инвентарь и Окно Торговли и Ремонта
0x438 Диалог с NPC
0x448 Домашние животные
0x468 Окно алхимика
0x478 Панель 1-9
0x480 Горячие клавиши
0x4C0 Настройки
0x4D4 Умения
0x51C Системная панель
0x52C Задания
Исходники на Delphi можно скачать тут [Ссылки могут видеть только зарегистрированные пользователи. ]
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------