Перейти к содержанию

roma912

Пользователи+
  • Постов

    223
  • Зарегистрирован

  • Посещение

  • Победитель дней

    7

Весь контент roma912

  1. Аналогично, что использую регистр, что не использую. Также все засоряется элементами и вылет Ну а сам адрес работает только с моим адресом, проверил
  2. По сути он и должен срабатывать, однако после лимита в 2047 начинается краш вместо очистки
  3. Интересный баг при использовании Rapid Fire script Под скриптом переменная которая получается отвечает за количество fx элементов Ну даже если ее заморозить соответсвенно все равно перегрузится Очень странно что переполняется количество fx элементов и буфер cmd Сам скрипт (врятли что-то даст в данной ситуации) Console log:
  4. Все правильно да. За чистотой кода конечно не следил А так да, спасибо за замечания, постараюсь в следующий раз сделать немного лучше чем в данный // Я больше не буду ставить "В угол" за нарушение пукта правил 1.8. И править пост за Вас тоже. Garik66
  5. Найти указатель на SSystemGlobalEnvironment, есть информация на стороннем форуме В этом указателе, есть еще несколько (необходимый на IRenderer для w2s) Возвращает указатель на SSystemGlobalEnvironment из памяти приложения (в данном случае самой игры, т.к. это injectable dll) Насчет скрина, не понимаю для чего тебе. Указывает только на врагов Тут просто игрок находится в прицеле Да и к чему эти вопросы если ты все и так сам знаешь
  6. Sniper Ghost Warrior 2 (2013) Cryengine 3 Понадобится: Dx9 или Dx11 Hook, игра поддерживает оба Directx (Тут не будет рассмотрен хук Directx) Изначально для рисования местоположения противника надо выйти на EntityList или нечто подобное Начинаем свой поиск через хп игрока, потом смотрим, что читает по адресу, и находим небольшой кусок кода который работает со всеми Entity Выглядит примерно так Работает как с хп локального игрока так и хп врагов / союзников Именно этим мы и воспользуемся, на с++ напишем хук, который будет брать указатель на врага и сохранять в некий список А после этого мы будем читать список и рисовать линию к этим врагам Довольно нестандартный способ решения т.к тут не используется EntityList, по которому можно было бы проследить именно четкое смещение между врагами Далее были найдены координаты игрока. Ну и последнее что необходимо, это ProjectToWorld или же по другому WorldToScreen для перевода 3D координат на 2D плоскость (Окно игры) Собственно реверснутые классы ниже После поисков остается только написать все это на плюсах EntityList будет получаться посредством хука на с++ //SniperGhostWarrior2.exe + 0xDCB8E3 Ровно тут и ставим хук для получения врагов Остается только восстановить инструкции и сделать свой список Entity Тут мы восстанавливаем оригинальные инструкции и перемещаем указатель врага в переменную TemporaryObject Ну а после добавляем ее в наш некий EntityList где хранятся все указатели на врагов Теперь остается только в цикле читать EntityList и проверять валидность, а также отрисовывать (используя dx9 endscene hook) врагов за стенками и прочим Для этого воспользуемся методом ProjectToScreen из реверснутого класса IRenderer Самая основная часть ниже, в которой и происходит все действие Теперь можно протестировать работу Все отлично отрисовывается, линия идет прямо под врагов (Насчет того что нет моделек игроков, такая проблема возникает только на dx9 При включении dx11 такой проблемы не наблюдается) Хук делал под d9, поэтому получилось вот так) Cryengine 3 Classes Reverse Указатель на SSystemGlobalEnvironment можно найти через строку ai_CompatibilityMode Находим в IDA эту строку, переходим по Xref'y, Декомпилируем метод в псевдокод и получаем поинтер на SSystemGlobalEnvironment Теперь у нас есть указатель на SSystemGlobalEnvironment Указатель SSystemGlobalEnvironment 0х385BF490 Теперь необходимо найти смещение до Renderer, для этого мы будем использовать Reclass На этот раз ищем строку Draw2DLine И повторяем манипуляции выше В итоге мы находим смещение от SSystemGlobalEnvironment до IRenderer (0x10) В Reclass мы получаем вот такую картину Указатель на SSGlobal + 0x10 (Renderer) Теперь необходимо найти метод ProjectToScreen который есть в классе IRenderer Ищем в IDA строку ProjectToScreen Xref, pseudocode как и до этого Остается только от указателя на рендер определить адрес метода ProjectToScreen (Renderer + 0x140) В указателе Renderer лежит виртуальная таблица методов и на 0х140 необходимый нам, определяем его в Reclass Берем адрес, в данном случае 0x19AD8608 и прибавляем к нему смещение до ProjectToScreen (0x‭19AD8748‬) Теперь можно сгенерировать все реверснутые классы и использовать метод ProjectToScreen
  7. Собственно нашел некую структуру (SSGlobal) Указатель на pRenderer Вопрос в том, находятся ли методы GetModelViewMatrix и GetProjViewMatrix Под ProjectToScreen или же оно в ином месте class IRenderer { public: virtual void Function0(); // /* Собственно до 79 метода */ virtual void Function79(); // virtual bool ProjectToScreen(float ptx, float pty, float ptz, float *sx, float *sy, float *sz); // char _0x0004[25396]; DWORD m_width; //0x6338 DWORD m_height; //0x633C char _0x6340[8448]; };//Size=0x8440
  8. То, что получает метод с девайса (хукнутый), похоже больше на кашу, или же некую единичную матрицу, но никак не похоже на proj matrix Однако если есть соображения, буду признателен
  9. Изрядно надоело искать эту матрицу, на протяжении недели Скажу что есть на данный момент: - LocalPlayer - Model Position - Health - Entity - Такие же данные как у LocalPlayer Directx 9 hook, WorldToscreen По сути есть все необходимое для создания обычного Esp, проблема только в матрице которую я не могу найти.... Уже пробовал искать путем -1 ... +1 На выходе получаю порядка 800 адресов
  10. Для начала учить с++ или с# Как научишься строить хорошую структуру приложений, начинай с реверсинга простых приложений Думаю тебе рано уходить в написание читов
  11. Итак, начнем с самого начала Когда-то очень давно я начал играть в игру под названием Rocket League Импровизированая игра в футбол, где катаются машинки, со своей физикой и пр. Проиграв около года, все надоело и я решил посмотреть что есть у этой игры: Как оказалось апи для какой-либо статистики открытого нет (Имею ввиду то, которое поддерживается официальными разработчиками) Ну раз нет апи, решил сделать что-то элементарное, например найти структуру игррка (в данном случае машинки) На данный момент у игры нет античита, хотя он тут и не нужен вовсе Вообщем загорелся идеей, начал пытаться найти эту структуру Долгое время ковырялся, ковырялся, ничего не получалось То ли дело во мне, то ли грабли не едут Посмотрел движок игры, оказалось Unreal Engine 3 На UE3 вроде как бесполезно что-то искать руками, т.к поинтер будет с громадным количеством оффсетов и почти наверняка невалидным Посмотрел как реверсят игрушки на UE, и что-то не въехал с первого раза (даже с 5 не понял :DD) А суть была в том, что в Unreal Engine 3 можно хукнуть метод который передает все внутреигровые ф-ии которые использует в режиме реального времени Прочитал много статеек, посмотрел примеры и понял что хукают метод ProcessEvent Делают это с помощью дампа игровых классов, которые можно использовать для написания своего чита Собственно вот и дампер Тык Там уже есть заготовки для некоторые UE3, UE4 игр Нужная нам также имеется, осталось только сдампить Для дампа необходимо знать сигнатурки ProcessEvent GlobalNames GlobalObjects Собственно вот и скомпилированный дампер Сам дампер это длл которая инжектится в игру, ну а сама длл и вытягивает все нужные классы для дальнейшего написания Теперь к написанию... Создаем проект, подключаем к проекту sdk которое сгенерировалось на диске С Подключаем все нужные инклуды и пр. Точка входа для нашей длл BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: AllocConsole(); freopen("output.log", "w", stdout); printf("Dll Initialized\n"); DisableThreadLibraryCalls(hModule); CreateThread(0, 0, MainThread, hModule, 0, 0); // creates our thread break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } В длл создаем поток который будет хукать ProcessEvent и использовать внутреигровые функции DWORD WINAPI MainThread(LPVOID param) // our main thread { StartupApp(); printf("Inited\n"); ProcessEvent = (tProcessEvent)DetourFunction((BYTE*)ProcessEvent, (BYTE*)hkProcessEvent); return false; } StartupApp метод который по сигнатуркам ищет адрес GNames, GObjects bool InitializeObjectsStore() { auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast<const unsigned char*>(Signture), Mask); if (address == -1) { return false; } UObject::GObjects = reinterpret_cast<decltype(UObject::GObjects)>(*reinterpret_cast<uint32_t*>(address + 1)); return UObject::GObjects != nullptr; } bool InitializeNamesStore() { auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast<const unsigned char*>(Signture), Mask); if (address == -1) { return false; } FName::GNames = reinterpret_cast<decltype(FName::GNames)>(*reinterpret_cast<uint32_t*>(address + 2)); return FName::GNames != nullptr; } ProcessEvent это наш хук который мы будем использовать (Как происходит хук гуглим, detours lib в помощь) Теперь к основной части, наш метод hProcessEvent Не забываем указывать Typedef void __fastcall hkProcessEvent(UObject *pObject, void *edx, UFunction *pFunction, void *pParms, void *pResult); typedef void(__thiscall *tProcessEvent)(class UObject *, class UFunction *, void *, void *); tProcessEvent ProcessEvent = (tProcessEvent)FindPE(); void __fastcall hkProcessEvent(UObject *pObject, void *edx, UFunction *pFunction, void *pParms, void *pResult) { if (pFunction) { //Get Player* if (strcmp(pFunction->GetFullName().c_str(), "Function Engine.PlayerController.PlayerTick") == 0) pPlayerController = (APlayerController*)pObject; //Get Ball* if (strcmp(pFunction->GetFullName().c_str(), "Function TAGame.Ball_TA.OnRigidBodyCollision") == 0) pBall = (ABall_TA*)pObject; //Function TAGame.CarComponent_Boost_TA.EventBoostAmountChanged if (strcmp(pFunction->GetFullName().c_str(), "Function TAGame.CarComponent_Boost_TA.EventBoostAmountChanged") == 0) { Boost = ((ACarComponent_Boost_TA_EventBoostAmountChanged_Params*)(pParms))->Boost; } if (strcmp(pFunction->GetFullName().c_str(), "Function Engine.Interaction.PostRender") == 0) { Canvas = ((UInteraction_PostRender_Params*)(pParms))->Canvas; myPostRender(((UInteraction_PostRender_Params*)(pParms))->Canvas, pPlayerController, Boost); } } ProcessEvent(pObject, pFunction, pParms, pResult); } Этот метод срабатывает при каждом вызове игрой какой-нибудь ф-ии, будь то отрисовка, будь то создаение машинки или же простой выход в меню Осталось только найти нужный нам метод и путем сравнения этой ф-ии через pFunction->GetFullName() Перенаправить на наш код В данном случае я получаю Указатели на Игрока, Мяч, UCanvas (Который рисует все что возможно в игре) и эвент EventBoostAmountChanged, который срабатывает когда кто-то использует на карте буст Перейдем к методу myPostRender который при срабатывании рисует в игре количество буста у игрока и также линию от игрока к мячику void myPostRender(UCanvas* Canvas, APlayerController* player, ACarComponent_Boost_TA* boost) { //Проверка на валидность входных данных if (!Canvas || !player || player->bDeleteMe || !boost || Boost->bDeleteMe || boost == NULL) return; try { if (boost) { std::map<std::string, ACarComponent_Boost_TA*>::iterator it; //Есть ли игрок уже в map if (BoostMap.count(boost->Owner->GetFullName()) > 0) { //Обновляем игрока в map it = BoostMap.find(boost->Owner->GetFullName()); BoostMap.erase(it); BoostMap.insert(std::pair<std::string, ACarComponent_Boost_TA*>(boost->Owner->GetFullName(), boost)); } else { BoostMap.insert(std::pair<std::string, ACarComponent_Boost_TA*>(boost->Owner->GetFullName(), boost)); } } std::map<std::string, ACarComponent_Boost_TA*>::iterator i; for (i = BoostMap.begin(); i != BoostMap.end(); ++i) { //Опять проверяем на валидность if (!i->second->Owner || i->second->Owner->bDeleteMe || !i->second || i->second->bDeleteMe || i->second == NULL || i->second->Owner == NULL || !Canvas) { //Удаляем если не валиден BoostMap.erase(i); continue; } //Переводим 3D Координаты игрока через Видовую матрицу Canvas->Project в 2D FVector PlayerLoc = Canvas->Project(i->second->Owner->Location); if (i->second->Owner->GetTeamNum() == 0) //Blue Team { //Проверка на то, видем ли мы на экране точку в который нужно рисовать if (PlayerLoc.Z > 0) DrawTextToScreen(Canvas, string("Boost Amount: ") + std::to_string((int)(i->second->CurrentBoostAmount * 100)), PlayerLoc.X + 10, PlayerLoc.Y - 30, BLUE); } else { //Orange Team if (PlayerLoc.Z > 0) DrawTextToScreen(Canvas, string("Boost Amount: ") + std::to_string((int)(i->second->CurrentBoostAmount * 100)), PlayerLoc.X + 10, PlayerLoc.Y - 30, ORANGE); } } } catch(std::exception& e) { printf("Exception %s", e.what()); } } Итог: Разобраться в этом сразу конечно очень сложно, но методом проб и ошибок у вас должно получиться Ах, да, забыл показать конечный результат Вот... Отрисовку линий я убрал в коде, но там нет ничего сложного Теперь мы видим количество буста у тиммейтов и противников, что вполне неплохо Также можно придумать множество реализаций SDK
  12. roma912

    Задачка

    Выполнил задачку с Keygen'ом (Не открывайте спойлеры если хотите выполнить задачку полностью самостоятельно)
  13. roma912

    TrainMe

    Можно использовать всегда 1 элемент массива, и твой адрес не поменяется. Думаю так и делает тот скрипт
  14. Влезаю в тему конечно, но если бы ты переписал меню с нуля, т.е делал основной алгоритм хука записью в память, или же на ассемблере, то таких вопросов как вверху темы, не было бы :##
  15. Это был лишь элементарный пример как писать скрипт, дальше ты сам должен разобраться и почитать материал
  16. Тебе по сути надо сделать так Взять какой-нибудь пустой регистр pop eax Потом записать туда значение mov eax, (float) 100 Перезаписать значение в указатель movss [rdi+offset], eax Освободить регистр pop eax
  17. Как говорят обычно. Хмм, а зачем в этой схеме ты?
  18. Примеры хука меня особо не интересуют Интересует только фреймворк подобный imgui, чтобы имея хук можно было отрисовать свое меню
  19. Вопрос состоит в том как хукается Directx 8 в отличии от 9. Также что можно навернуть на хук после? У imgui не нашел поддержки 8 версии для использования Поэтому вопрос к кодерам данного форума Желательно с примерами самого хука ну и названиями библиотек
  20. Есть вариант подмены js страничного на свой, если не ошибаюсь. Но опять же надо почить насчет этого
  21. Что тогда мешает использовать точный адрес вызова? Путем подмены обычного call на свой? Из длл через naked метод который как было сказано не комеилирует доп код
  22. Ну если толковый, то тогда лучше уже в паб выложить А так, для единоразовый прибыли без прочих проблем, считаю очень неплохим вариантом
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.