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

MasterGH

Ветераны
  • Постов

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

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

    129

Сообщения, опубликованные MasterGH

  1. Спойлер

    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:

     

    • Added support for il2cpp (mono)
    • Added support for .NET dll plugins
    • Change register on breakpoint now also affects FP and XMM registers
    • Added CEShare, a way to share your tables with other people
    • Improved disassembling
    • copy bytes+addresses now only does bytes+addresses
    • call filter can now use the unwind data for functions to get a decent list of instructions
    • structure dissect shows the pointerpath at the bottom
    • Follow register while stepping (rightclick the register to show the option)
    • registersymbol and label now support multiple definitions in one line
    • improved the speed of the structure list when getting data from a pdb
    • hexview: doubleclicking a non-byte value now shows in the type you set
    • added sorting to the found code dialog
    • added filtering to the changed addresses window
    • the debugger settings won't lock from changing anymore, still needs you to reopen a process to have an affect
    • added always hide children groupoption
    • group headers can act as address now
    • AA command createthreadandwait now has a timeout parameter
    • Assembler scanning improvement
    • Added an AVX2 version of CE, which will speed up all those floating point operations CE does so much...
    • Improved structure lookup for PDB files
    • Symbolhandler can now have the following types in front of pointers : (BYTE), (WORD), (DWORD), (QWORD), (CHAR), (SHORT), (INT), (INT64) to typecast the pointer to a value of that type
    • Structure dissect can detect vc++ and object pascal classnames now
    • Dissect code now also detects references to strings
    • Sorting the addresslist now sorts faster and more properly with regards to groups (depends on the level your current selection is)
    • Rightclick the addresslist header to bring up a menu which allows you to disable sorting
    • Improved the processlist responsiveness
    • The chosen floating point rounding type is now saved in the registry
    • You can now use (addresslist description) as an address
    • Improved autocomplete
    • Hexview: Fixed changing the address when doubleclicking and then canceling
    • alloc with a prefered base is now more aggressive in getting the range you want
    • fixed mono symbol lookup while dlls are still being loaded
    • fixed the structure compare not giving a proper errormessage
    • fixed improper error messages in structure dissect
    • fixed opening process in XP
    • fixed potential deadlock with the symbolhander
    • fixed issue with using the process var as symbol
    • fixed default form size for some windows when using high DPI
    • fixed DBVM on systems that have the default MTRR set as 6 (e.g Asus systems)
    • fixed DBVM find what accesses with large datasets
    • Lua
      New functions:
    • function onTableLoad(before)
    • sendMessageTimeout
    • createTimer(delay,function())
    • createStructureFromName()
    • createSynEdit()
    • changes:
    • fixed executeCodeLocalEx with certain parameter definitions
    • fixed openFileAsProcess
    • checkSynchronize has a timeout now
    • OnGetDisplayValue now also works on AA records(<script>)
    • Please report bugs and give suggestions for an even better version next time

      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
    • Changes:
    • DBVM doesn't activate the TSC hook by default. You can still activate it by using dbvm_enableTSCHook()
    • Fixes:
    • Fixed memoryleak when opening a file for hexediting again
    • Fixed utf8 display of the dissect windows window
    • Clear the taskbar progress when using a custom scan
    • Hexview: Fixed changing the address when pressing a non char key

     

    • Похоже игра на 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

    • 4 часа назад, LIRW сказал:

      И код интересный, напомнил мне шифровку патрон в сталкере, через imul :) вот прям очень похож.

       

      :) Это число 0x66666667 "магическое". Если вкратце оно для того чтобы не использовать "дорогие" инструкции деления. Кое что о нем есть здесь. И сюда.

    • 16 часов назад, LIRW сказал:

      Нашел 3 функции дублирующие значение значение гаджетов. Первый судя по коду рисует саму циферку и изменение его не чего не даст - ну кроме как визуального эффекта. А остальные 2 - одна функция, пашет с сотней-другой адресов, а последняя из трех, нечего существенного не даёт. Надо будет завтра от той циферки пойти попробовать еще. 

       

      Если я правильно скриншот нашел

      Спойлер

      image.png

       

      Гаджеты эти в инвентаре могут быть списками поведений. У списка, обычно, есть счетчик и он может выводится на экран.

      Тут можно пробовать искать функцию, которая добавляет список поведения в инвентарь. Вызывать её, если поведений в списке меньше максимального значения или некоторого.

    • 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 отладчик в помощь

      Спойлер

      Lua IO.png

       

      Спойлер
      
      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) есть классы для работы с файлами на чтение и запись.

    • Как вариант поискать и смотреть техническую документацию по компилятору или изучать выполнение декомпилятора под дизассемблером. Там должно быть условие, которое выводит ошибку при парсинге строк кода.


      Если предположить, то сделали так специально, чтобы не было

      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

      Спойлер

      image.png

       

      • Понравилось 1
      • Плюс 1
    • 9 часов назад, partoftheworlD сказал:

      рисовать интерфейс на UE4 с помощью конструктора пользовательского интерфейса,

      Весь интерфейс в теории можно сверстать в самом игровом движке. Потом создать специальный модуль (asset) и изнутри игры его загружать в неё саму. Я делал это в Unity играх несколько раз и это было интересно. Фактически всю игру, механику и интерфейс можно контролировать и быстро поменять, но с условием, что в рантайме увидешь быстро игровые обьекты и их свойства. Например можно сделать ассет летающей обзорной камеры. И вроде такие ассеты можно создавать и изнутри игры и их грузить в другие игры

    • 12 минут назад, partoftheworlD сказал:

      хм, видимо short/far надо обязательно указывать.

       

      Я проверил. Это без разницы. Вообще я думал кода будет больше, когда я давно писал SEH я еще инструкции добавлял.

      Я беру убираю эти директивы и получается точно такой же код, однако вылет)) Похоже CE прячет байты и инструкции того самого SEH

    ×
    ×
    • Создать...

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

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