Данная тема является продолжением предыдущей: Поиск функций в клиенте RF Online. В ней мы нашли, как использовать умения. В данной теме речь пойдет про выделение мобов/персонажей в таргет.
Вот, что мы получим в итоге: . Жмем "1" - выбираются персонажи, "2" - мобы.
Манипуляции будут проводиться на клиенте 2.2.3.2. Итоговый таб-таргет потестил на церберусе - работает. В теории должно работать на любом 2.2.3.2 клиенте. Если версия другая, то можно повторить шаги из гайда, чтобы найти оффсеты, либо попробовать .
Содержание:
Поиск функции выбора объекта в таргет
Поиск массива мобов, персонажей и NPC
Реализация простого таб-таргета
Просто напиши оффсеты не хочу ничего искать
Скролльте до параграфа "Реализация простого таб-таргета"
Поиск функции выбора объекта в таргет
Заходим в игру, выбираем моба в таргет, начинаем искать в CE название монстра Example
Видим статически адрес (RF_Online.bin+1F38E40, он же 02338E40, зеленый на скрине). Если выберите другого моба - значение изменится. По этому адресу всегда лежит имя текущего выделенного моба. Example
Открываем x64dbg и ставим write breakpoint на данный адрес Example
Выделяем моба, breakpoint сработает после команды, выполнившей запись по адресу Example
Далее тактика такая: возвращаемся из функции (execute till return + step over) и NOP-ем ее. Выполняем это до тех пор пока выделение в таргет кликом не перестанет работать. То есть NOP-нули, кликнули на моба, если все еще работает - возвращаем исходный код и повторяем тоже самое с текущей функцией поднимаясь по стеку вызовов.
В итоге мы найдем адрес 00522F6A, который вызывает функцию по адресу 005234E0 Example
Если подняться еще на одну ступеньку выше и NOP-нуть там, то персонаж еще и перестанет двигаться при клике на местность. То есть функция передвижения тоже где-то рядом.
Даем функции имя SelectTarget и смотрим на аргументы. Функция вызывается от имени объекта, который лежит по адресу 12F13D10 (). Забегая вперед, первый аргумент - адрес моба, второй - константа 0. Example
Найти оффсет для 12F13D10 просто: во всей цепочке вызовов выше данный адрес передается в ecx. Делаем execute till return + step over пока не встретим первый статический оффсет при записи в ecx. Находим адрес 007002E3. Получаем формулу [edx + 75888] = [[ebp - 4] + 75888]. В [ebp - 4] лежит ecx для текущей функции. Example
Еще раз делаем execute till return + step over и находим базовый адрес. В итоге формула становится [23612C8 + 75888] = [23D6B50]. От имени объекта по этому адресу и вызывается SelectTarget. Example
Статический анализатор подсказал мне, что данный класс называется CGP_MainGame. Example
Сразу же сработает breakpoint. Мы будем находиться в функции по адресу 004F5DB0. Вот так она выглядит. Я уже дал всем функциям имена. При возврате из функции мы найдем базовый адрес для массива объектов вокруг персонажа - 233b5f0 Example
В данной функции мы видим двойной цикл.
Первый итерируется от 0 до 0xC по массиву объектов, каждый из которых состоит из двух адресов - адрес первого элемента и адрес последнего элемента вложенного массива. То есть это своего рода матрица из объектов, с которыми персонаж может взаимодействовать. В голове можно держать эту структуру так [{firstAddress, lastAddress}, {firstAddress, lastAddress}, ... {firstAddress, lastAddress}].
Второй цикл берет значение по первому адресу 233b5f0 + index + 0xC + 4 и последнему адресу 233b5f0 + index + 0xc + 8 (перед подстановкой в формулу к index также применяется сдвиг влево на 4 бита - shl 4). В каждой итерации к первому значению прибавляется 4 до тех пор, пока адрес не станет равен последнему значению.
В итоге мы имеем базовый адрес для массива объектов 233b5f0. Всего в массиве 12 элементов (0xC). Каждый элемент содержит адрес первого и последнего элемента вложенного массива. Эти адреса достаются по формулам 233b5f0 + index (shl 4) + 0xc + 4 и 233b5f0 + index (shl 4) + 0xc + 8.
Реализация простого таб-таргета
Компилируем DLL и инжектим её через Cheat Engine. После инжекта нажимаем TAB для выбора мобов.
Реализация тривиальная: объекты берутся в таргет в том порядке, в каком они расположены в памяти. Сортировку по удалённости от персонажа, ХП и другим параметрам можете реализовать сами — оффсеты известны. По индексам 0, 1 и 2 находятся персонажи, мобы и НПС соответственно. Остальные массивы у меня были пустыми, но я не выходил за пределы генштаба.
DLL хукается к WndProc, чтобы перехватывать нажатия клавиш и вызывать SelectTarget в главном потоке игры.
#include <Windows.h>
#include <cstdint>
#include <vector>
WNDPROC oWndProc = NULL;
HWND window = NULL;
struct Character {
uint8_t padding1[16]; // Padding to the 'name' field (16 bytes)
char name[64]; // Character's name (64 bytes)
float x; // Character's X coordinate (4 bytes)
float y; // Character's Y coordinate (4 bytes)
float z; // Character's Z coordinate (4 bytes)
uint8_t padding2[536]; // Padding to the 'hp_percent' field (536 bytes)
float hp_percent; // Character's HP percentage (4 bytes)
};
typedef void* (__thiscall* SelectTarget)(void* ecx, Character* target, int zero);
SelectTarget select_target = (SelectTarget)(0x005234E0);
void** select_target_ecx = (void**)0x23D6B50;
DWORD** surroundings_base_ptr = (DWORD**)0x005182C9; // Check the comments to see why this offset is different
size_t surroundings_len = 0xC;
int surroundings_players_index = 0;
int surroundings_mobs_index = 1;
int surroundings_npc_index = 2;
int inner_index = 0;
void handle_tab(int surroundings_index) {
DWORD* surroundings_base = *surroundings_base_ptr;
DWORD characters_ptr = *surroundings_base + 0xC + 4 + (surroundings_index << 4);
auto* characters = reinterpret_cast<std::vector<Character*>*>(characters_ptr);
if (characters && !characters->empty()) {
Character* current_character = (*characters)[inner_index];
select_target(*select_target_ecx, current_character, 0);
inner_index = (inner_index + 1) % characters->size();
}
}
BOOL CALLBACK EnumWindowsCallback(HWND handle, LPARAM lParam)
{
DWORD wndProcId;
GetWindowThreadProcessId(handle, &wndProcId);
if (GetCurrentProcessId() != wndProcId)
return TRUE; // skip to next window
window = handle;
return FALSE; // window found abort search
}
HWND GetProcessWindow()
{
window = NULL;
EnumWindows(EnumWindowsCallback, NULL);
return window;
}
LRESULT __stdcall WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN) {
if (wParam == VK_TAB) {
handle_tab(surroundings_mobs_index);
return true;
}
}
return CallWindowProc(oWndProc, hWnd, uMsg, wParam, lParam);
}
DWORD WINAPI injected_thread() {
do
window = GetProcessWindow();
while (window == NULL);
oWndProc = (WNDPROC)SetWindowLongPtr(window, GWLP_WNDPROC, (LONG_PTR)&WndProc);
return 0;
}
BOOL WINAPI DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
HANDLE ThreadHandle = NULL;
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hModule);
ThreadHandle = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)injected_thread, hModule, 0, nullptr);
if (ThreadHandle == NULL)
return FALSE;
break;
}
if (ThreadHandle != NULL) {
CloseHandle(ThreadHandle);
}
return TRUE;
}
Готовое решение (Update 22.12.2024)
Допинал до рабочего состояния. Теперь умеет сортировать по HP и расстоянию.
При сортировке по ХП мобы сортируются по оставшемуся проценту ХП, если процент одинаковый — по расстоянию. Для сортировки по расстоянию — наоборот.
При сортировке по расстоянию выбирается следующий по удалённости после текущего выбранного (даже если он уже был выбран ранее).
Я не оказываю услуги гаранта!
База данных кидал: blacklist.rf-cheats.ru
Обязательно проверяйте человека через чёрный список прежде чем совершать с ним сделку.
Сразу же сработает breakpoint. Мы будем находиться в функции по адресу 004F5DB0. Вот так она выглядит. Я уже дал всем функциям имена. При возврате из функции мы найдем базовый адрес для массива объектов вокруг персонажа - 233b5f0 Example
В данной функции мы видим двойной цикл.
Первый итерируется от 0 до 0xC по массиву объектов, каждый из которых состоит из двух адресов - адрес первого элемента и адрес последнего элемента вложенного массива. То есть это своего рода матрица из объектов, с которыми персонаж может взаимодействовать. В голове можно держать эту структура так [{firstAddress, lastAddress}, {firstAddress, lastAddress}, ... {firstAddress, lastAddress}].
Второй цикл берет значение по первому адресу 233b5f0 + index + 0xC + 4 и последнему адресу 233b5f0 + index + 0xc + 8 (перед подстановкой в формулу к index также применяется сдвиг влево на 4 бита - shl 4). В каждой итерации к первому значению прибавляется 4 до тех пор, пока адрес не станет равен последнему значению. Example
Данная тема является продолжением предыдущей: Поиск функций в клиенте RF Online.
Самое печальное - что ещё примерно 10 лет назад, выходил в релиз* тут на форуме
"пакетник от Paladin'a "
Если бы у Diantro был к нему доступ, хотя бы в качестве ознакомления
Ему бы намного проще и понятнее было бы заниматься тем, чем он сейчас ковырялся.
Потому что если взять пример из прошлой его темы - где бафали простой баф,брали предмет из сумки etc
В пакетнике у Палыча ты всё это сам видел и даже простенькие макросы мог составлять.
Но это был коммерческий продукт, так сказать - для узких специалистов$
================================================== ============
Кстати, если кому-то интересно - по Tab Target до сих пор существует логический коллапс.
Казалось бы - why?
Ведь официальная версия 2232+ апдейтов уже начиная с 2014 года на всех регионах локализации ( включая Россию) - собственно и содержала встроенную в клиент данную функцию. Делали правда её Корейцы из CCR видимо по гайдам от Diantro) Ибо она действительно брала "цели" из памяти и выделяться могли даже персонажи на которых стояло состояние невидимости или даже полной невидимости ( допинг такой из cash shop)
И далее, Tab Target продолжает переходить по всем официальным версиям - вплоть до закрытия офф серверов по всему миру ( на версии 4.55+ )
Более того - в данный момент, этот функционал так же доступ на единственном открытом и работающим по лицензии оф сервере Тайский-ТайванЬский-Китайский оф -
Туда даже можно без VPN зайти и несколько игроков из России иногда играют
Судя по youtube каналу - с "каким-то" остатками Корейцев от CCR они по прежнему сотрудничают и получают некую техническую помощь и типа-обновления
---------------------------------
Те более 10 лет официальная версия клиента поддерживает Tab
-
Неофициальные версии игры - те пиратки 2232
Где-то ~4-5 лет назад получили такие модули через поставщиков клиентских защит
Odin, DevCorp
Не удивлюсь если у Виктора Cerberus - подобный модуль пылился в чулане ещё с 2010ых. Но раз это не было реализовано на их совместном игровом проекте с бывшим (нет) ддосером Барсиком - то наверное модуля всё-таки не было. Хотя знания и возможности для его разработки - были.
----------------------------
А теперь собственно - суть.
Почему логический коллапс?
Вот у нас есть официальная история* Tab'a в 10 лет работы игровых серверов по всему миру.
У нас есть пиратские сервера которые казалось бы - должны конкурировать между собой за интерес и удобства игроков. И так же - имеют ~5 летнюю историю работы с Tab Target через модули защиты.
Казалось бы - ну что может пойти не так? В чём вообще может быть дело?
Это же совершенно обычная и привычная функция для всех ММО которые выходили в последние лет 15. Оказалось - причина в деньгах(с)
Из-за событий на Украине ещё в далёких 2014-2018 годах - огромное количество администраторов пиратских серверов RF Online покинули этот рынок.
Вслед за ними ушли или практически перестали работать - люди которые поддерживали их по технической части игры.
На рынок начиная с 2016 годов вышли проекты от буквально 2-3 команд/ака людей
Которые ставили своей целью - заработать ВСЁ. Те все деньги, которые можно заработать через площадку ммотопа и его раздел RF Online.
Под эти цели постепенно поменяли сам формат запуска и работы - неофициальных RF игровых серверов.
Минимальный набор модулей для реализации собственно Корейской игры
Максимальный набору модулей - для рекламы или завлечения аудитории
Если совсем прям на пальцах объяснять:
- игроки этих проектов, не должны играть в удовольствие
- они должны там работать
- а люди с деньгами, должны приходить туда тратить свои деньги
Так что Tab Target на топ3 коммерческих проектов - перешёл в какую-то нелегальную область.
Вы не можете сами выделять мобов через Tab
Вы не можете поставить макрос на игровую мышь и отойти пить чай
Это очень серьёзные нарушения правил пользования проекта
Но вы можете на официальном форуме/ аукционе/ чате/ дискорде/ ВК группе подобного проекта пиратского сервера RF Online - потратить свои РУБЛИ
И получить игровые ценности > которые вы могли БЫ получить, если бы сами играли в игру.
Те удобно бить мобов вам НИЗЯ
А удобно покупать игровые преимущества за реальные деньги при посредничестве администрации проектов - ДА, очень даже можно и нужно.
PPS:
Diantro - то что ты этим занялся, это конечно молодец
Но на рынке в данный момент есть как минимум 2 вида коммерческого$ Бота
Которые научились и сортировать мобов по радиусу и игроков, и по никам
И по цвету штанов....да как угодно
Причём настолько натурально - что со стороны, весь этот процесс не отличается от игровых действий живого пользователя.
Само собой - как только начинается "охота на ведьм"
Факт использования лишь 1 функции Tab Target или же расширенных опций бота = замечательно подтверждается. Доказательства увы - весьма легко может собрать даже обычный пользователь, не только администратор проекта.
================
ЕСЛИ
если ты продолжишь и доведёшь до ума и буквально 1ого исполняемого файла
вот наш Tab Target дорогой
ВОЗМОЖНО - это пробьёт стену жадности топовых администраторов
ну потому что это у всех будет и надо уже будет возглавить, а не бороться с мельницами.
И наши коммерческие администраторы - найду коммерческих разработчиков Ботов
И встроят в ПИРАТСКИЙ клиент - нормального внутриигрового Бота
И всё это примет адекватный вид аля La2 Essence
Последний раз редактировалось A.F.I; 12.11.2024 в 21:45.
Причина: Свернул в спойлер
В стародавние времена был план несколько проще. В игре есть опция бинда целей на кнопки 1-9, выбираем в игре что-то, биндим и потом одной кнопкой вызываем в таргет. Пока таргет не убит будет вызываться в цель.
Вот, можно было там в памяти записать ИДишник вообще всего что хочешь взять в бинд найдя его в в памяти клиента, в списке того, что вообще есть вокруг перса. Например мину инвизера или какого-то определенного монстра. Можно было особо гадких игроков при запуске игры себе туда вписать, чтобы их предварительно не таргетить в зарубе.
Для автофарма, например Лазувардинов в шахте в АФК, программным, каким-нибудь костылём, что в память писать умеет, в бинд записывался ID ближайшего Лазувардина и всё, только вместо "Таб" жмёшь в скрипте "1".
lolz i dont remember i ever said pidaras in normal chat
Brat, это возвращает нас всё к тому же о чём я тут написал - СНГ люди занятые на рынке в данный момент = хотят ТОЛЬКО деньги и ничего более.
-
До ботов и модулей Tab - была "кукла" и RF Login от Nightshade
Опять же, если бы у автора этой темы была возможность ознакомления с тобой работой что проделал в своё время Найт - всё было бы в разы проще и понятнее.
Все эти разработки или разовые ковыряния нутра RF Online
Их было просто МНОЖЕСТВО и всё это со временем ушло в никуда
Либо никому не продали и оставили дома пылиться, либо человек просто уходил и переставал заниматься/интересоваться этими вещами.
Флем-кукла которая там была, не буду сильно фантазировать - но она какая-то интересная была.
Например - простое уменьшение радиуса обзора в клиенте, отражалось и на целях по которым будет проходить атака игрока
Те некая сортировка окружения - видимо там производилась
Фильтр мобов - вроде тоже присутствовал
Но цель насколько я помню игрок через эту куклу бил до победного
Примерно как коммерческие боты сегодня - только за 10 лет до их появления)))
PS:
Вообще это смешно и грустно одновременно
Как спустя 10 лет - по новой открывают функцию Tab Target
И снова кто-то идёт по этому пути, без помощи и без благодарностей...
Последний раз редактировалось A.F.I; 12.11.2024 в 21:56.
"Кукла Флема" была нужна чтобы долбить по ней АОЕ скилами которые не привязаны к цели, чтобы на шару качаться стаскивая мобов к какому-то препятствию, сидя за ним на волхаке.
lolz i dont remember i ever said pidaras in normal chat
чтобы на шару качаться стаскивая мобов к какому-то препятствию, сидя за ним на волхаке.
Ну - сковородкой тоже можно убить.
Но обычно на ней готовят еду...
-------------
Просто все эти разговоры "для бедных" - про неигровые нарушения в RF Online
Они обычно сводятся к всё тому же - логическому тупику
Ты человека спрашиваешь:
- мы говорим про честную конкуренцию между игроками?
- мы говорим про здоровую атмосферу игрового мира в игре выпуска 2004 года ( по основным механикам)
Обычно следует ответ - да да! конечно, как же иначе?
- А где баны за RMT?
- где баны за покупку и продажу аккаунтов
- где баны за передачу игровых ценностей за реальную валюту
- почему в игре где должен быть отдельный путь для каждой из рас и RvRvR
подключают модули АУКционов
- почему сейчас при каждом старте пиратки - рисуют$ cash shop кланам за приход на сервер?
Причём "приход" - это не привод 100 человек состава и даже не 50ти
это просто договорённость, что 1 Вася - более активно начнёт упрашивать зайти на сервер свою окружение, которое и так туда +- собиралось пойти.
Ну это - другое(с)
-----------------------------------------------
Действительно - совсем другое.
Выделять цели как это было можно в ОФИЦИАЛЬНЫХ апдейтах 10 лет назад - нельзя
Наносить урон по игрокам - с учётом работающих заточек оружия-брони как это было у официалов = тоже нельзя
Первый модуль давно разработан и просто выключен
Второй модуль - 1 раз сделали в 2010+ году и далее лишь ковыряли , так и не приведя к нормальному бою у всех поставщиков защит.
Так что товарищи игроки - покупаем игровые предметы у барыг
Покупаем промежуточный ресурс или посредничество на сделку - у администрации
А во что вы там играете
Кто сколько по кому бьёт
Как выделять цели если бежит 50-100 игроков в каше
Это все вопросы в Корею....
Последний раз редактировалось A.F.I; 12.11.2024 в 21:56.
Автотаргет штука полезная, когда на Сруофе его не было, я его себе из костылей делал, 100500 руды нафармил.
Псевдо Флема не делал, сложно было, сделал оконного танка, он как Флем но танк и не зобанют.
lolz i dont remember i ever said pidaras in normal chat