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

Лидеры


Популярный контент

Показан контент с высокой репутацией за 02/15/19 во всех областях

  1. 4 балла
    Релиз Cheat Engine 6.8.3 февраля 7-го 2019 Fixes: debugging/stepping with hotkeys several high DPI visual glitches VEH debugger reattach works again Pointerscan resume works again Stackview can now show by reference , previously it did nothing disassembling imul speedhack while key down option assembling values with x*2/4/8 the "resume thread" in the threadlist now resumes threads instead of freezing them fixed an error popping up when editing registers with no debugger attached getNameFromAddress will not show userdefined symbols when symbols are disabled Additions and Changes: Waiting till all symbols have been loaded has been removed Launching structure compare from dissect data now only needs 1 address, though it's recommended to have at least 2 each Code completion in lua engine is now more smoother You can now compare traces generated by the tracer Threadlist window now has a copy to clipboard Structure compare now digs deeper into pointers Pointerscan import/export now works with newer types as well Better Lua comment support Added rudimentary sort to the structure compare window (based on levelwidth only) Referenced strings now also shows if it's unicode Formdesigner now has a context menu to add undocumented controls Lua: added enumMemoryRegions added getWriteLog (Let's you get the writelog and activate it) HexadecimalView: added the OnCharacterRender and OnValueRender events Post release patches: 02/11/2019: Don't search addresslist entries in PDB when still loading and give an option to quit slow load 02/17/2019: Fixed speedhack giving an error first time activating and removed a message when using ctrl and scanning Изменения в Lua файле документации Добавились поля Комментарии С CE Lua появилась возможность работать с HexView: выбор значений адресов, изменение типов, перехват рендерера для изменения шрифта или текста. Как я понял, если что-то поменялось в памяти, т.е. в окне HexView и стало красным, то это можно перехватить. Возможность работы с WriteLog записи в памяти. Т.е. этот же окно WriteLog ниже только есть доступ к нему через Lua. Хотя, как я не пытался вызывать getLog() метод не понятно из объекта какого-класса - CE не видит класс WriteLog... Короче ладно, может потом решится
  2. 3 балла
    Вступление В CE выделим участок кода и функцию Sub eax,edx - вычитание и наиболее значимее чем запись и чтение. После декомпиляции Если выделили две инструкции Обращать внимание будем на математику, логику, условия и потом на чтение и запись. В данном случае, нужно найти вычитание из адреса "eax4->f1152 = eax4->f1152 - (eax3 + 1)" Как поставить декомпилятор 1. С форума Cheat Engine качаем архив 2. Распаковываем в папку с Cheat Engine 3. В настройках открываем плагин cesmartdec.dll 4. Идем на инструкцию, выделяем функцию 5. Декомпилируем на первой выделенной инструкции из всех выделенных
  3. 3 балла
    WriteLog работает так 1. Находим адрес 2. Запускаем скрипт логирования writeLog = getWriteLog writeLog.status = true 3. Пишем в адрес пару раз 4. Снимаем логи Далее сравнение stacktrace 1. Делаем один stacktrace и сохраняем в файл 1 2. Делаем второй stacktrace и сохраняем в файл 2 3. Выбираем опцию сравнения в меню "open trace for comparision" 4. Выбираем опцию Realign compare из контекстного меню и выбирая адрес слева или справа сравниваем трейс Трейслог можно снимать как с hex view байтов из окна памяти, так и с кода в дизассемблере. Например, одна ветвь кода будет связана с главным игроком на чтение или запись значения, а другая ветвь будет не с игроком... Можно попробовать сравнить и выйти вверх на начало функции где будут попадать одинаковые или разные аргументы перед call и исследовать их связь с изменением значения или его чтением.
  4. 2 балла
    Сделал на две характеристики и записал видео. Если в таком виде утроит, то дальше сам. Игру пришлось несколько раз переустанавливать и удалять ключи (не только прогой, которую ты порекомендовал). Фильтры для демо-версии. Скрипт "Characteristic": Видео: Asguaard.CT
  5. 2 балла
    Просто открой отладчик когда появится красный экран смерти... он тебе покажет где стопорнулась загрузка, там и будет тебе участок кода проверки целостности... ищи там рядом где то должен быть условный переход, типа BEQ или BNE... если стоит BEQ (HEX - 67), то заменяем его на BNE (HEX - 66) или на оборот...усё.
  6. 2 балла

    Версия Origin date 16.02.2019

    4 раза скачали

    Использование: Запускаем сначала игру, а в главное меню игры (либо в уже начатой игре) запускаем трейнер. Функции: 1. > Бессмертие. 2. > Бесконечная энергия. 3. > Без перезарядки оружия. 4. > Бесконечные стрелы. 5. > Бесконечные гранаты. 6. > Бесконечные С4. 7. > Увеличенный урон оружия в 250 раз. 8. > Точность оружия. 9. > Без отдачи оружия. 10. > Бесконечные sp на прокачку. 11. > Супер прыжок. 12. > Бесконечные время на взлом. 13. > Бесконечные патроны. Ps: Все функции с оружием, реализованы (без вычитания из существующего значения) а то есть замораживает только текущее состояние патрон или боеприпасов.
  7. 2 балла
    Crysis 3 Просмотр файла Использование: Запускаем сначала игру, а в главное меню игры (либо в уже начатой игре) запускаем трейнер. Функции: 1. > Бессмертие. 2. > Бесконечная энергия. 3. > Без перезарядки оружия. 4. > Бесконечные стрелы. 5. > Бесконечные гранаты. 6. > Бесконечные С4. 7. > Увеличенный урон оружия в 250 раз. 8. > Точность оружия. 9. > Без отдачи оружия. 10. > Бесконечные sp на прокачку. 11. > Супер прыжок. 12. > Бесконечные время на взлом. 13. > Бесконечные патроны. Ps: Все функции с оружием, реализованы (без вычитания из существующего значения) а то есть замораживает только текущее состояние патрон или боеприпасов. Добавил LIRW Добавлено 02/16/19 Категория Трейнеры для PC игр  
  8. 1 балл
    Если вы вдруг ищете простые пути, то моя статья всё так же работает Скрипт:
  9. 1 балл
    спасибо , но скрипт не работает . Value всегда 0 . похоже не работает фильтр cmp ebx,4E02 у меня в ebx другие числа, а фильтр шагов уменя 4Е3А когда я делал свою таблицу этот кусок скрипта sub eax,1 mov ebx,2 mov edx,0 div ebx я делал одной командой shr eax,1 мне кажеться так проще
  10. 1 балл
    В случае ТС нужен фильтр , т.е. так: your_code: cmp [ebx],adres // здесь адрес который он нашел перед этим jne code mov [labelw],ebx code: mov ebx,[ebx]
  11. 1 балл
    Итак, начнем с самого начала Когда-то очень давно я начал играть в игру под названием 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
×

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

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