-
Постов
2 999 -
Зарегистрирован
-
Победитель дней
129
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные MasterGH
-
-
Похоже игра на Mono и Unity.
Найти метод по некоторому названию (где-то выше по коду) в CE и скомпилировать это метод по названию (перед активацией скрипта АА)
Пример если название функции "TakeDamage" (здесь просто нопинг)
Спойлер{$STRICT} define(bytes,89 47 60) //// //// ------------------------------ ENABLE ------------------------------ [ENABLE] {$lua} if syntaxcheck then return end if LaunchMonoDataCollector() ~= 0 then local mId = mono_findMethod('Assembly-CSharp', 'PlayerStatsManager', 'TakeDamage') --local mId = mono_findMethod('', 'PlayerStatsManager', 'TakeDamage') ---- This also works mono_compile_method(mId) end {$asm} assert(PlayerStatsManager:TakeDamage+8A, bytes) PlayerStatsManager:TakeDamage+8A: nop nop nop //// //// ------------------------------ DISABLE ------------------------------ [DISABLE] PlayerStatsManager:TakeDamage+8A: db bytes // mov [edi+60],eax
Вообще, у @Xipho было видео по Subnautica на канале Gamehacklab[RU]. Там monodessector и там разные подходы.
У меня в блоге тоже можно поискать как ломать игры на Unity. Если движок знаешь, да еще и игра на Моно, да еще и без обфускации, то можно что хочешь с ней делать. Документация Unity функций.
- 1
-
35 минут назад, Pitronic сказал:
unepic.exe+2D455: 8B 15 888C6800 - mov edx,[00688C88]
unepic.exe+2D455: 8B 15 888C6800 - mov edx,[00688C88] // цветами показан обратный порядок следования байт, просто так инструкции следует "перевернутыми"
8B 15 - это бинарный/байтовый код инструкции mov edx
Во многих играх после перекомпиляции кода, инструкции сохраняют последовательность, но меняются смещения и адреса внутри. Можно попробовать в сигнаруте искать по первым начальным байтам последовательность инструкций, но в этом случае нужно умело править код. Т.е. содержимое инструкции, смещения, адреса могут поменяться. Т.е. если mov edx сохранил свое положение в сигнатуре, то вот адрес [00688C88] уже может быть другим, а точнее 90% будет другим и инъекцию кода уже надо делать не зарнее подготовленную, а генерируемую или как-то еще копируя участки кода и т.п. По опыту небольшого исследования, могу сказать есть инструкции, которые очень просто подходит для редактирования с такими "гибкими" сигнатурами: например по смещениям просто, что-то нопить. А есть инструкции, которые не достаточно нопить, а есть типа этой unepic.exe+2D455: 8B 15 888C6800 - mov edx,[00688C88] где нужно танцевать с бубном, т.к. будущая инъекция кода еще не известна, а будет известно на какой-то игре
- 2
-
Титры обычно находятся в отдельных не исполняемых файлах. Пишут редакторы субтитров, которые распаковывают игровые ресурсы, позволяют менять содержимое и запаковывать обратно. Либо искать готовый, либо свой писать.
Чтобы свой написать,то через любой отладчик/дизассемблер искать код распаковки ресурсов и на его основе сделать свой.
Более подробно не подскажу, надо сидеть и заниматься этим, а времени на это нет к сожалению
-
2 часа назад, imaginary сказал:
writeInteger('libopus.haar1', EBX) --Записать адрес игрока в память игры, по метке libopus.haar1
2 часа назад, imaginary сказал:libopus.haar1: //Код в выбранном месте
mov [ebx+000004A4],#500 //Установить 500 здоровья
Это точно верно? Т.к. значение записывается в инструкцию.
P.S.
СпойлерВообще обычно не у всех есть рут. Тогда распаковываем apk, патчим, запаковываем, переподписываем. Дальше выкладываем mod apk. Ставим апк, ни таблиц, ни CE и играешь без ограничений. Статья интересная
- 1
-
15 часов назад, Pitronic сказал:
memrec=getAddressList().getMemoryRecordByID("22")
В CE 6.7 Можно не искать "memrec" по "ID". memrec — это ключевое слово в AA скриптах, которое может возвращать nil.
Просто memrec с проверкой на nil:
Спойлер[ENABLE] {$lua} if memrec ~= nil then print(memrec.Description) memrec.color = 0x0008000 end {$asm} [DISABLE]
-
В 25.02.2020 в 16:17, younyokel сказал:
для того, чтобы можно было дать игрокам волю для собственного перевода игры
Ну, тогда ничего делать не надо. CSV формат табличный с ключевиками и парсить его через Lua. Или же просто на lua скрипте или же любым текстом.
В 25.02.2020 в 16:17, younyokel сказал:Какого формата должны быть такие файлы? Не до конца понимаю, как можно реализовать.
Не должны, а могут быть. https://love2d.org/wiki/love.data
Любые данные: бинарные, сжатые, серилизованые, любой формат, который движок предоставляет.
Вообще интересный движок.
-
Какой игровой движок?
Правильнее делать специальные запакованные файлы-ресурсы и располагать их по некоторому пути.
В этих ресурсах, а они обычно сильно сжимаются, могут быть тексты, модели, текстуры, музыка, анимации и так далее.
Когда ты из игрового меню запускаешь игровой уровень, то эти самые ресурсы распаковываются и загружаются в игру. Игру не нужно перекомпилировать.
Также ресурсы можно подгружать не все сразу, а в определенных местах игры на чек-поинтах или при загрузках сохранений.
Можно подгружать из самописной встроенной игровой консоли по специальным командам в том числе по сетевому пути.
Текстовая информация
Диалоги в txt, ini, json, xml, lua или табличные форматы или в чем-то "читаемом" лучше в открытом виде не держать. Игра должна быть закрытой коробкой. Для пользователя должен быть доступен исполняемый файл, а остальное все должно быть закрыто. В том виде, в каком продали игру - в том виде и лучше и играть. Иначе, имеем шанс на кучу не протестированных модификаций, которые могут приводить к ошибкам и сваливаться на голову техподдержки.
-
8 часов назад, roodey1896 сказал:
он воздействует только на первый адрес, последующие он оставляет без внимания, а мне нужно, чтоб он воздействовал на все найденные адреса.
Только писать отдельную функцию aobscan и её использовать в скриптах АА, естественно с помощью функций Lua или использовать не Cheat Engine, а например, C++/ASM + WinAPI и там сделать поиск множества сигнатур.
-
15 часов назад, Babyls сказал:
всё излазил настройки в СЕ походу через неё не получится
Можно остановиться сразу на Entry Point (первая инструкция) в отладке.
Для этого надо поставить WndowsDebugger в настройках. Потом зайти в список процессов. Выбрать File->CreateProcess. Поставить, если нужны, параметры открытия процесса. После чего сразу будет остановка на Entry Point
-
-
16 часов назад, LIRW сказал:
Нашел 3 функции дублирующие значение значение гаджетов. Первый судя по коду рисует саму циферку и изменение его не чего не даст - ну кроме как визуального эффекта. А остальные 2 - одна функция, пашет с сотней-другой адресов, а последняя из трех, нечего существенного не даёт. Надо будет завтра от той циферки пойти попробовать еще.
Если я правильно скриншот нашел
СпойлерГаджеты эти в инвентаре могут быть списками поведений. У списка, обычно, есть счетчик и он может выводится на экран.
Тут можно пробовать искать функцию, которая добавляет список поведения в инвентарь. Вызывать её, если поведений в списке меньше максимального значения или некоторого.
-
28 минут назад, Xipho сказал:
он как-то публиковал видео по поиску скорости или ускорения для симуляторов гонок.
Да вроде я выкладывал AntonVit-видео на форум
8 часов назад, Sergey1953 сказал:это то, где или как в 3D играх формируется скорость.
Разные варианты есть, зависит от кода
Обычно самый простой если по одной координате
x = x + dx * dt * Time.deltaTime;
Где dx например это 3м, а dt= 1c, Time.deltaTime - разница времени между кадрами отрисовки.
Получается смещение на 3 метра за 1 секунду с учетом синхронизации кадров. Кадр может быть отрисовки или кадр может быть физическим.
Это упрощенная схема.
Для 3д Как обычно используются уже три оси и углы поворота. Если в игре есть физ. движок то там задается velocity по координатам.
В более реалистичных расчетах есть формулы посложнее. Там скорость передвижения задается от колес, как Xipho написал
var fwdSpeed = Vector3.Dot(rigidbody.velocity, transform.forward); (link)
8 часов назад, Sergey1953 сказал:нужно найти тот участок памяти (адрес), в котором записана текущая скорость
Текущая скорость это просто готовая уже рассчитанная величина для показа например в графическом интерфейсе. Толку её искать.
Другое дело искать ускорение и предел скорости, другие параметры... Вот от них уже зависит и скорость и другое.
8 часов назад, Sergey1953 сказал:boost = 0.5;
Судя по коду эту величину и надо менять
8 часов назад, Sergey1953 сказал:Но вопрос, что же такое forward vector?
Вариант 1.
Это нормализованный вектор в глобальной системе координат. Нормализованный, т.е. от 0 до 1 каждая его ось.
Вариант 2
Направление игрового объекта, туда куда он как бы смотрит относительно самого себя. Обычно, тоже сразу нормазилованный.
Если бы я знал точку А и точку Б, то направление было бы Б - А. Это без нормализации.
Если А - точка откуда я смотрю, а Б - точка куда я смотрю. То вектор направления был бы также: Б - А.
Но если я хочу относительно модели всегда знать, куда она направлена, то надо знать Б относительно 3д сетки. Короче forward позволяет узнать вектор направления. Так называемый локальный Forward можно разными способами высчитывать.
-
3 часа назад, Alex2411 сказал:
жаль, что просто условие по счетчику в старт кондишн трассера не указать
Если очень хочется, то можно
Спойлер-- Адрес инструкции local addressInstruction = ('Tutorial-x86_64.exe+2B4C9 - 81 BB 90070000 E8030000 - cmp [rbx+00000790],000003E8 { 1000 }'):match('(%S+)') -- Счетчик прерываний local countBreak = 0 function onBreakpoint() -- Любое другое условие --if RBX == 0x10F2540 then countBreak = countBreak + 1 continueMethod = co_run -- return co_run --end if countBreak >= 3 then debug_removeBreakpoint(addressInstruction) -- Показать окно getMemoryViewForm().Show() -- Получить следующий адрес local nextInstruction = getAddress(addressInstruction..'+'..getInstructionSize(addressInstruction)) getDefaultDisassembler().SelectedAddress = nextInstruction -- Вызывать трейслог getMemoryViewForm().debuggerpopup.Items[13].doClick() end return co_run end debug_setBreakpoint(addressInstruction, onBreakpoint)
-
14 часов назад, Alex2411 сказал:
мне нужно посмотреть трассер когда инструкция сработает не первый, а третий раз. нужно чтобы трассер на данные пропустил два обращения инструкции и на третий раз потом сработал. как это сделать ?
Запустить игру в оконном режиме
Поставить брейкпоинт, задать ему условие прерывания.
Прерваться на брейкпоинте по F9: "раз", "два", "Три". Снять брейкпоинт по F5. Выделить следующую инструкцию, которая еще не выполнилась. Поставить трейссер и отпустить по F9. Все
-
4 часа назад, Razi сказал:
utf8Path
Я перепутал название переменной)
Так все же работает. Пошаговый Lua отладчик в помощь
Спойлерfunction round(x) return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5) end function fsize(fl) fl, err = io.open(fl, "r") if fl then local current = fl:seek() local size = fl:seek("end") fl:seek("set", current) fl:close() size = round(size, 2) stringsize = string.format(size) end return stringsize end function openFile(fs) load_dialog = createOpenDialog(self) load_dialog.InitalDir = os.getenv('%USERPROFILE%') load_dialog.execute() local path = load_dialog.FileName path = utf8ToAnsi(path) fileSize = fsize(path) if fileSize == nil then print('fileSize is nil') return end fileSize = tonumber(fileSize) print(fileSize) if fileSize == fs then openFileAsProcess(path, r) print('openFileAsProcess') end end openFile(100)
Вообще не очень понятно, зачем открывать файл как процесс, подсчитав его размер. Я бы эту строчку закомментировал.
Если надо открывать файл редактором, то можно текстовым или своим на Lua сделанным
-
Вот так заработало (из utf8 в ansi)
Если не будет работать тогда проверить путь.
local pathRU = "C:\\Текстовый фaйл.txt" local utf8Path = utf8ToAnsi(pathRU) local file, error = io.open(utf8Path) print (file, error)
Одинарные символы "\" заменить на "\\". Если и это не поможет, то в текстовым файле (справочнике CE Lua) есть классы для работы с файлами на чтение и запись.
-
А ты пробовал преобразовать путь в UTF8? У CE есть такая функция преобразования
-
Как вариант поискать и смотреть техническую документацию по компилятору или изучать выполнение декомпилятора под дизассемблером. Там должно быть условие, которое выводит ошибку при парсинге строк кода.
Если предположить, то сделали так специально, чтобы не былоcmp eax, value je label1 ; альтернатива "switch/case" ; ... label1: sub esp, 4 ; инициализация типа int a = 5 mov [ebp+4], 5
по "протоколу" возможно никогда не делают прыжки на sub esp после прыжка просто так. Это делается, как я предполагаю, в начале функции или в фигурных скобках обозначающих поостранство имен внутри case, или под switch до первого case, или на последнем case... В общем как захотели компилятор написать так и написали. Либо по каким-то причинам техническим, либо по "своим" правилам. А может чтобы упростить разработку и сроки "не дописали", просто ошибку вывели.
Статья про switch case под дизассемблером на трех компиляторах. Там, конечно, нет вариантов как в этой теме,но их можно самостоятельно под отладкой посмотреть
Спойлерhttps://wasm.in/blogs/identifikacija-switch-case-break.106/
-
В 09.05.2019 в 18:33, Xrom сказал:
Во время создания модификации к игре на движке Unity появилась надобность в вызове метода игрового класса.
Это можно сделать также как и в игровом движке.
1) В Update функции, если компонент не найден еще, то искать X тип компонента (искать например каждые 5 секунд)
2) Если компонент найден, то вызывать у него метод каждые X секунд
Комментарии:
Спойлер1) Если игра собрана с Mono, то проще найти адрес объекта класса наследника от MonoBehavior или Component используя метод: Object.FindObjectsOfType
Вызов этого метода можно сделать внедрением C# кода в запущенную игру. Это можно сделать разными способами, описано в Интернете. Или можно сделать через Cheat Engine используя Mono функции из Lua. Или через декомпиляторы .net с сохранением изменений. Для поиска компонента надо знать название его. Это можно сделать через отладку Cheat Engine добравшись до параметра и метода в Mono. Еще этих компонентов на игровых объектах может быть множество, они также могут разрушаться и создаваться. Поэтому надо все отслеживать через C# код
2) Если игра собрана в IL2CPP, то пробуем собрать dll модуль на той же версии Unity под IL2CPP и делать его внедрение в память процесса с вызовом метода выше. Поскольку тут моно нет, то здесь либо через дизассемблер узнать нужный компонент либо через свой dll модуль вывести название всех игровых объектов с компонентами, либо скомпилировать внедрение просмотра runtime hierarchy.
3) Если другая платформа, там Android или iOS, или другие, то там свои заморочки с патчами сборок.
-
В 02.05.2019 в 15:34, Derk сказал:
Я написал,но пишет "не все инструкции пригодны к инъекции"
Скрипт написан с ошибками. Сгенерируй скрипт из CE и сравни со своим. Тебе добавить только три строчки. label, registesymbol и mov[метка], регистр.
Ну еще и
unregistersymbol
-
Менять лого, конечно, бестолковое дело.
Допустим это нужно для шутки или для себя лично.
Спойлер-- Поиск компонента логотипа function FindComponentLog() for i=0,MainForm.getComponentCount()-1 do if MainForm.getComponent(i).getClassName()=='TImage' then return MainForm.getComponent(i) end end end -- Замена logo по пути или через URL function SwitchLogo(fullpath) local logoImage = FindComponentLog() if logoImage == nil then print("Can't find logo Image class") return end if not fullpath:match('http') then logoImage.loadImageFromFile(fullpath) else local userClient = getInternet('userClient') local stringStream = createStringStream(userClient.getURL(fullpath)) logoImage.Picture.LoadFromStream(stringStream) stringStream.destroy() userClient.destroy() end end
Далее меняем лого через файл, поместив его в директорию CE с названием например NewLogo.png
local fullpath = getCheatEngineDir()..'/'..'NewLogo.png' SwitchLogo(fullpath)
Или меняем через URL (нашел я случайный вариант)
Спойлерlocal url = 'https://lh3.googleusercontent.com/ZfCGN7JCHksDtovph3fpTOOCkdGtobE72yxNFqNyLyYV27LLl8-FwtjpxF--BgFxYw' SwitchLogo(url)
Чтобы вручную Lua функции не вызывать, создаем Lua файл и кладем в папку автозапуска и лого будет меняться при запуске CE
- 1
- 1
-
9 часов назад, partoftheworlD сказал:
рисовать интерфейс на UE4 с помощью конструктора пользовательского интерфейса,
Весь интерфейс в теории можно сверстать в самом игровом движке. Потом создать специальный модуль (asset) и изнутри игры его загружать в неё саму. Я делал это в Unity играх несколько раз и это было интересно. Фактически всю игру, механику и интерфейс можно контролировать и быстро поменять, но с условием, что в рантайме увидешь быстро игровые обьекты и их свойства. Например можно сделать ассет летающей обзорной камеры. И вроде такие ассеты можно создавать и изнутри игры и их грузить в другие игры
-
-
12 минут назад, partoftheworlD сказал:
хм, видимо short/far надо обязательно указывать.
Я проверил. Это без разницы. Вообще я думал кода будет больше, когда я давно писал SEH я еще инструкции добавлял.
Я беру убираю эти директивы и получается точно такой же код, однако вылет)) Похоже CE прячет байты и инструкции того самого SEH
Cheat Engine 7.1 Released for Windows and Mac:
in Cheat Engine
Опубликовано
April 22 2020:Cheat Engine 7.1 Released for Windows and Mac:
After releasing 7.1 to my patrons a few weeks ago here's the public release for everone else
Also, from now on, the Mac version and Windows version will have equal release dates and features(Excluding mac/windows only stuff) as the sourcecode of the both have been merged into one
Additions and changes:
New functions:
Post patch releases (This is the reason why your 7.1 version says there is a newer version):
04/26/2020: Fixed slow loading and deleting huge tables