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

MasterGH

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

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

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

    129

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

  1. 17 часов назад, maxpostal сказал:

    И теперь я просто в прострации не знаю за что взяться

    Как я учился

    1. На готовых примерах: таблицах CE.

    2. Изучая функционал и документацию инструмента, которым пользуешься. Cheat Engine, Ghidra, IDA.

    3. Вывести для себя общие направления. Например, одно из них не возиться с указателями. а менять бинарный код. Примеров множество.

    4. Много-много практики. Туториалы CE, множество игр. Были игры. в которых что-то не получалось. Например, спавн сущностей, но это дело времени и усидчивости.

    5. Изучить исходники игры

    6. Изучить популярный игровой движок и API.

    Поймешь древовидную структуру сущностей чаще похожей на паттерн "Стратегия". На каждой сущности список компонентов, на компоненте поле (адрес). Указатель рассчитывать можно разными способами через вызов API поиска сущности, через поиск компонента или иными способами. Много зависит от движка. Как я писал, указатели не обязательно выводить. Проще изменить код или сделать условие записи "свой-чужой". Примеров множество

    17 часов назад, maxpostal сказал:

    Хочу попробовать себя в программировании на masm64 + реверсинженерия

     Ну, попробуй. Документация + примеры

     

    • Спасибо 1
  2. Спойлер
    В 09.01.2022 в 7:37 PM, spefox сказал:

    Совсем недавно начал смотреть уроки, пока дальше основного плей-листа "...от А до Я"

    data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    Хорошо. Еще бы практику бы надо.  На практике можно просто застрять и потребуется больше времени. Но потом можно вернуться

     

    В 09.01.2022 в 7:37 PM, spefox сказал:

    Вы прям эпически помогаете

    data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    Я, скорее, предложил сделать те или иные действия. Если что получиться, то было бы интересно узнать, что именно.

     

    В 09.01.2022 в 7:37 PM, spefox сказал:

    то инструкция оказывалась вверху самом и выше уже ничего

    data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

     

    В 09.01.2022 в 7:37 PM, spefox сказал:

    Правильно ли я понимаю смысл направления, т.е. если смотреть по тому направлению, которое указано на картинке, мы идем в обратной последовательности в которой выполнялись инструкции?

    data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    Это лог выполнения инструкций после записи давления и он может показать, как поток программы возвращался по ret-ам выходя из call-ов, т.е. вверх поднимался по иерархии вызовов и выходил из этой иерархии. Иерархия вызовов это вложенные вызовы call. У лога нет обратного хода инструкций. Как инструкции выполнялись, так они и зафиксировались, т.е. записались в лог. А по логу уже сами представляете мысленно обратный ход программы. При этом инструкций выше call в логах нет, а если щелкать на инструкции в окне трассировки, то можно перейти в дизассемблер CE у видеть инструкции выше, которые пишут в xmm1 давление.  Должно быть видно в Hydra в декомпилированном виде на C++  тоже как была запись в xmm1. Кстати не нужно делать дампов. Сразу аттач  Гидры к процессу, а перед этим отключить CE отладчик и оставить окно трейслога.

     

    2022-01-09-180935.jpg

    С со стрелками ничего я не понял. Но этот участок я называю просто как "подниматься по ret-aм".

     

    call 1

       call 2

          call 3

     

    И в конце каждого call будет ret. А после ret будет очень вероятно выход из call, в который заходили. Бывали случаи, когда поток на ret мог выйти обратно в "не свой call"

     

    А трейслог он показывает иерархию вызовов так, что наиболее глубокие вызовы начинаются сверху окна, а дальше по ret-ам поднимаются. Чтобы эффективно подниматься, то не нужно в логах заходит в call после записи давления. Надо подняться на несколько уровней. Смотрим эти уровни в дизассемблере или через декопилиятор C++ (Hydta/Ida).

    Еще можно с верхних уровней сделать лог в глубину с заходом в call до записи давления. Сделать второй. И сравнить оба на  красные различия. Эта фича, её вроде показывали на канале от А до Я.

     

    В 09.01.2022 в 7:37 PM, spefox сказал:

    Можете подсказать какой нибудь более менее покрывающий нужды курс по asm? Стараюсь выискивать каждую инструкцию и что она означает, но описание не всегда ясно, по мне, отражает суть инструкции.

    https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf

    https://wiki.cheatengine.org/index.php?title=Assembler:Commands

    https://wiki.cheatengine.org/index.php?title=Assembler

     

    Точно нужно пройти тутоиралы по CE по АА (они может есть и на видео каналах от А до Я и у Гарика:

    https://wiki.cheatengine.org/index.php?title=Tutorials:Cheat_Engine_Tutorial_Guide_x64

    https://wiki.cheatengine.org/index.php?title=Tutorials:Auto_Assembler:Basics

     

    В 09.01.2022 в 7:37 PM, spefox сказал:

    Изначально у меня были ограничения на поиск лишь указателей и до поры до времени этого хватало

    Я давно отказался от поиска указателей автоматическим способом. Не знаю как другие. Потому что, мне запомнился момент, когда я увидел динамический список компонентов(было это давно-давно), в котором могут быть разные смещения из-за разных индексов массива/списка элементов, то искать указатели такими автоматизированными способами я перестал совсем. Потому что смещения  указателей уже зависели от случайного индекса в динамическом списке

     

    В 09.01.2022 в 7:37 PM, spefox сказал:

    Вдумчивое, осмысленное послание на 2022 год, прозвучало много информативнее и полезнее чем одна известная речь по телеканалам в новогоднюю ночь! Еще на пути изучения инструментария отталкивает "информационный мусор" повсеместно, где в заголовках с нуля обучат всему, сколько бы там это все не длилось, но чаще это все кончается обобщенной теорией которая почти на половину состоит из истории появления того да этого, а вторая часть из "практики" где скачать и как установить, вроде как-то и результат, но не помогает, в одном вашем сообщении больше пользы чем в ином 2-х часовом видео на одном стриминговом сервисе, который разумеется не относится так же к циклу полезных информативных видео от форума. Именно нагромождение дублирующийся, малополезной информации на данное время большая проблема, пусть этим займутся нейросети

    Ок, я понял.  

     

    Я надеюсь, что получиться с определенными усилиями сделать чит на давление энергоблока, например, через Гидру.

    А потом, если будет желание, время, сможете записать видео или статью, или пост на форуме, как создавался чит. Я думаю, кому-нибудь будет интересно.

     

     

    • Плюс 1
  3. Спойлер

    2022-01-08-223344.jpg

    Как я понял, это инструкция записи давления. Это то что надо.

    Здесь esi +8 это экранный адрес, а в xmm1 вычисленное давление.

    Осталось узнать, как значение давления попало в xmm1 и выйти на рабочий адрес или адреса.

     

    Для этого, что должны сделать?

    1. выполнить трейс с обходом call и получить дерево вызвов call. То что на сркиншоте —  представленный трейслог с заходами в call, а они по сути лишние. Опции настройки обхода call-ов можно менять в окне галочкой перед трейсом

    Спойлер

    image.png

    Здесь видим что трейс со входами в call

     

    Спойлер

    image.png

    Здесь видим как поднимаемся по ret-am вверх по иерархии вызовов функции через call/ret. Это то, что надо. возможно трех раз подняться будет достаточно. Но здесь мы не можем видеть в логах инструкций выше call из которых поднялись. Это можно сделать уже в дизассемблере или в hydra.

     

    Смотрим адреса которые нужно просмореть в дизассемблере или hydra

     

    Reactor Tech 2.exe+1BB17 - movsd [esi+08],xmm1

    ...

    Reactor Tech 2.exe+338E1 - add esp,04

    ...

    Reactor Tech 2.exe+33109 - mov eax,[ebp-08]

     

    Что там над этими адресами происходило в xmm1?

    Смотрим 10 инструкций вверх над каждым из трех адресов.  Если потребуется смотрим еще выше десяти до начала функции. Начало функции —это адрес, по которому пришли из call.

     

    Нужно научиться узнавать, как код проходил по инструкциям чтобы запись попала в xmm1 внутри иерархии вызовов call.

     

    Чтобы упростить задачу, можно посмотреть через Hydra или IDA.

     

     

     

    За 10 лет информации накопилось довольно много на форуме и могу допустить, что не так просто во всем разобраться. Но тем не менее можно выборочно искать материал, который может дать представление, что делать. Можно поискать на канале Gamehacklab, как работать с трассировкой  и  отдельно может помочь видео по Hydra. Основная цель — это научиться понимать, какой код привел к записи значения. Если это понять, то, скорее всего, больше ничего не потребуется. Дальше детали реализации чита. Еще придется подучить немного  инструкции asm и ключевые слова в С++.

     

    Ну и как написал @Xipho на нашем видео канале есть материал для изучения особенно, по разным фичам: Dessect Data, Ultimap, трейслог, Hydra и т.п. Еще можно посмотреть канал @srg91(по теме) и  Garik.

    Спойлер

    Я надеюсь, что будут еще новые видео на каналах и, может быть, кто-то сумеет обобщить все знания, опыт, приемы, навыки, подходы, фичи, которые использовать как эффективные инструменты в разных ситуациях, чтобы понизить порог вхождения понимания того с чего начать, как и что делать. Сканер памяти - для того-то, тейслог для того-то, hydra/ida для того-то...  Чтобы было понимание, что такой-то подход всегда работает, но он сложный, а такой-то подход долгий и с разной степенью вероятности даст результат. Например, отследить запись значения или искать сканером, как в этом примере. Можно делать одновременно и то, и то, а можно сразу через hydra. Здесь все-таки, какой-то системный подход нужно зафиксировать и донести в первую очередь для тех, кто только начал этим заниматься.  Возможно, кому-то рано с hydra делать и нужно потренироваться на других играх, а то большая и неперевариваемая информация. Например, изучать языки программирования до 2-го курса универа мне всегда казалось скучным, а без C++ в hydra делать нечего.

     

    В общем, есть над чем работать в 2022 году — над желанием пользователей перенимать и передавать  самый лучший опыт, обновлять старые знания лучшими новыми, уменьшить порог вхождения в gamehacking через дорожную карту.  А самое важное стимулировать написание статей и видео по созданию читов на фоурме. Пусть будет 1000 раз повторяться, 1000 раз обсуждаться. Все  эти циклы также естественные, как процессы и циклы  в программировании, так и циклы в живом организме и живых клетках. Понимание циклов обучения в школах, когда одно и то же по 1000 раз преподавателями разжёвывается  и ничего страшного. Так что не надо "жаловаться" (не в обиду написано) на то, что уже 1000 раз обсуждалось. Новые пользователи придут и получат новую информацию и возможно в лучшем видео.  Поэтому имеет смысл делать и новое видео, и новые статьи и повторять ответы на форуме.  Повторение — способ обучения. Новая информация будет по циклу перениматься новыми пользователями и они должны проходить вновь и вновь, то что проходили когда-то мы, но в лучшем виде.  Это так, мои мысли в целом на 2022 год.

     

    • Спасибо 1
  4. Можно убрать зависания, если поменять опции трейслога.

     

    1. different adresses, особенно на циклах
    2. Небольшое кол-во инструкций например 1000-5000
    3. Не включать логирование стека значения при большом кол-в инструкций (10К и более)
    4. Пробовать трейс без захода в call, чтобы поднять на верхние уровни, тогда меньше инструкций потребуется.

     

    Все эти опции должны быть в окне настроек трейса.

    И еще момент, перед стартом свернуть окно трейслога, чтобы оно не перерисовывалось во время работы. К сожалению, таким примитивным способом.

  5. Сначала нужно определиться с алгоритмом. Как прочитать определенную строку среди остальных.

     

    1. Может быть стоит прочитать весь текст из файла сразу в строку, а затем разбить её на массив, а по индексу строку получить.

    2. А может стоит последовательно читать строку до её конца и считать счетчиком, если дошли до счетчика, то вот она строка и дальше читать не нужно.

    3. Могут быть и другие варианты, например, с чтением блоков из файла и подсчет символов конца строки.

     

    Вот уже три примерных алгоритма.

     

    Дальше идем в Lua документацию. Ищем ключевые слова, ищем примеры работы с файлами и пытаемся реализовать алгоритм.

     

    Подсказка

    Спойлер

    Я бы сделал это одним из вариантов, т.к. набор данных небольшой
    1. Превратить строку в таблицу с индексами через регулярное выражение и обращаться по индексу строки
    2. Через регулярное выражение для строки с итератором и счетчиком строки ( gmatch итератор с счетчиком строк)

     

  6. Сдается мне, что там надо смотреть отладочный код. Значение вычисляется и попадает в адрес, а как именно только в пошаговой отладке, трассировке или декомпиляторе сможете узнать. Так же  дизассемблерный код записи в визуальный адрес можно привести здесь.

     

    Есть еще кое-что  под спойлером - это найти связанные значения, но мало вероятно, что поможет. 

    Спойлер

    Судя по представленному описанию  могу предложить, еще варианты поиска и также для  для одного энергоблока.

     

    Брать три состояния давления: минимальное, среднее и максимальное.

    1. тип double, Неизвестное
    2. тип отсеивания неизвестное значение: увеличилось, уменьшилось
    3. в прямой и, если не получилось, то и в обратной пропорциональности. Т.е. если значение увеличилось, то искать уменьшилось и наоборот.
    4. Не выходить из окна игры, а поиск и отсев делать горячими клавишами (в редких случаях игр это может влиять на перемещая данных в памяти). Во время поиска поставить опцию "замораживать процесс" чтобы значения случайно не менялись. Сейчас CE под рукой нет. Галочка вроде, либо в основном окне, либо в настройках.
    2 часа назад, spefox сказал:

    ultimap поиском пока ни разу не пользовался, т.к. только о нем узнал.

    Имеет смысл, если давление меняется x раз, т.е. x раз вызывался call для изменения давления. Да же если эти call-ы найдете, то вряд ли что-то с ними сделаете. Так что можно в качестве ознакомления, но сначала на других примерах, а не на этой игре. Видео, вроде было на основном канале.

     

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

    Например, перемещать энергоблок по карте, чтобы найти его адрес координат. На адресе координат через брейкпоинт выйти на структуру. Сравнивать структуры в Structure Dessect Data (или как он там называется, плохо помню) для поиска характеристик связанных с давлением.

     

    Главное не запутаться во всем, что я написал. Если запутались, то советую разбирать код, который пишет в адрес давления через декомпиляторы и трассировку. Наверняка, оно вычисляемое и всегда является копией. Сколько не меняй, будет всегда копия на основе другого значения из другого адреса. У ползунков своя копия, к примеру.  Это значение давления или связанные с ним другие значения точно должны быть в памяти процесса.

     

    • Понравилось 1
  7. Еще варианты:

    1. Пробовать разные типы данных: float (если не было), double и т.п. 
    2. Пробовать искать: от 0.0 до 1.0
    3. Искать для одного энергоблока и при этом зная, что изменения относятся к нему, а не ко всем сразу (игру не смотрел, не знаю)
    В 07.01.2022 в 1:07 AM, patrickfox сказал:

    визуальное значение ищется, но изменяя его и замораживая, оно меняется на секунду и живет дальше своей жизнью.

    Если способы выше не помогли, то как сложный вариант начать с установки брейкпоинта "на запись" на визуальный адрес и начать определять, каким образом значение попадает в визуальный адрес. Это можно узнать разными способами. Например, через декомпиляцию в IDA/Hydra, и через пошаговую отладку, и через трассировку. Может быть, даже и через ultimap поиск.

  8. Попробуй так

    Спойлер
    
    local processName = "game.exe"
    local address = '[game.exe+546]+8'
    
    local table_keys = {}
    table_keys[0] = 0
    table_keys[1] = 1
    table_keys[2] = 2
    
    local form = createForm()
    local example_box = createComboBox(form)
    
    example_box.items.add("Current")
    example_box.items.add("Bright")
    example_box.items.add("Raining")
    
    example_box.onChange = function(sender) 
    	if getOpenedProcessID() ~= 0 then
    		print('write '..table_keys[sender.ItemIndex]..' to '..address)
    		writeInteger (address, table_keys[sender.ItemIndex])
    	end
    end
    
    openProcess(processName)

     

     

     

  9. Запрос на unity global-metadata.dat вывел  на интересное обсуждение , а также на видео использования Il2CppDumper. Рекомендуют разрабам использовать свою обфускацию или даже использовать Unity  не для кибер-спортивных игр. Хотя и так ААА-студии, т.е. те которые делают ААА-игры выбирают Unreal Engine чем Unity судя по данным некоторых источников. Последняя для инди и мобилок, и шире по функционалу для VR. В принципе il2cpp я еще ни разу не дизассемблировал. Наверняка, так же как и с моно можно грузить ассеты с комилированной dll-кой от cpp, и которая сможет добавить свой класс поведения от того же Monobehavior на объект контроллера персонажа или на его камеру, чтобы сделать, например, чит на прыжок, полет камеры или любой другой...

     

    Кстати еще нашел Il2CppInspector

    • Понравилось 1
  10. 5 часов назад, Senpai сказал:

    Постоянно часто выдаёт ошибку и больше активироваться никак не хочет

     

    Какая игра? Пробовать ставить CE более старую:  7.1,  7.0,  6.8.3 ...

    Я очень давно не использовал "Mono Dissector". Польза от него не сильно-то большая. Можно и обычным способом найти адрес, найти инструкции и исправить код по сигнатуре. 

    Если в билде есть mono, то можно дебажить в VS++ в райнтайме по сокету через локальный порт. Сделать патч сборку на Unity движке, которая может изменить до мелочей весь игровой процесс. Поменять и встроить все-что угодно от логики до контента. Я даже не знаю, кто сейчас на Unity выпускает сборки с Mono, даже с обфускацией, когда давно есть режим сбори il2cpp, превращая код в C++. Там уже никакой Mono Dissector не должен работать.

  11. Не отправляйте doKeyPress(VK_F) лишнее количество раз, т.е. пока по адресу не поменяется значение на новое.

    Проверяйте отключился ли системный процесс.

    Проверяйте существование адреса (если нужно).

    Проверяйте растет ли объем занятой оперативной памяти или насколько быстро. Если да, то делать чистку через сборщик мусора.

     

    Возможно, подойдет и SikuliX для автоматизации действий без обращения к памяти процесса. Распознаются изображения на экране и по ним совещаются действия и в том числе отправка нажатий.

     

     

  12. Примеры на C#:

    Принцип связан с условием движения персонажа, временем, углом в радианах, координатами персонажа и некоторыми тригонометрическими функциями. Получается что-то, вроде, двух одновременных движений вперед и относительное влево-вправо по дуге.

    Ключевые слова для поиска: "camera bob", "walk camera"...

    • Понравилось 1
  13. В 30.07.2020 в 21:54, Alex2411 сказал:

    подскажите есть инструкция  команда  обмена регистрами xmm ? по аналоги  с командой  xchg  или  fxch

     

    Нет альтернативы в виде одной команды. Можешь посмотреть интеловский мануал, раздел инструкций обмена данных. 

    Зато  есть альтернативы с несколькими инструкциями. Например, использовать третий "свободный регистр" xmm с инструкцией mov-подобного перемещения. Если регистр занят, то можно использовать адрес памяти.  Есть интересный вариант с двумя регистрами и тремя инструкциям, когда на CPU поддерживает набор инструкций AVX.

    vpsubd xmm0, xmm1
    vpaddd xmm1, xmm0
    vpsubd xmm0, xmm1, xmm0

    Также можно через xor подобную инструкцию.

  14. 6 часов назад, Pitronic сказал:

    в модуле хекс редактором заменить байты в модуле по смещению в скрипте СЕ,

    Это понятно. Ты попробуй узнать какие байты, в каком модуле и по каким смещениям менять. Чтобы узнать тебе нужен дизассемблер arm, если там на so файлах. Если там java, то ява декомпилятор и компилятор. Если там mono,  то декомпилятор и компилятор .net модулей. Это будет так сложно, что может не быть смысла патчить апк. А вот сейв-вайлы из эмулятора более просто. Так же есть рут хаки на иннапы, для тех кто не сделал защиту против них.

    6 часов назад, Pitronic сказал:

    А где на планшете ip адрес сервера узнать?

    localhost

    На видео пример

    Спойлер

     

     

    • Плюс 1
  15. 21 час назад, alkayde123 сказал:

    Мне хотя бы понять, как можно сделать так, чтобы нажал именно W и персонаж летел вперед.

     

    Чтобы летел вперед нужно найти адрес координат камеры  и адрес кватерниона.
    Этот кватернион умножаем на нормализованный свой эйлеров угол смотрящий по глобальной оси координат "вперед" (например это 0X-ось), который умножаем на скорость движения и дельту времени между кадрами отрисовки. Скорость движения для W положительная, а для S отрицательная.

     

    У игрового объекта есть позиция X,Y,Z и углы кватерниона X,Y,Z,W. К позиции прибавляем нормализованный вектор оси вперед. Возьми например 0,1,0. 

     

    Спойлер
    
    // Vector3.forward = new Vector3(1,0,0);
    // Vector3.back = new Vector3(-1,0,0);
    // float speed = 1f
    // var timePerFrame = Time.deltaTime; разница между кадрами в игре Если 60 fps, то и рассчитать под них
    // transform.position = new Vector3(x,y,z);
    // transform.localRotation = new Quaternion(x,y,z,w) - кватернион в локальных координатах
    
    void Update()
    {
        timePerFrame = Time.deltaTime;
        
        if(Input.GetKey(KeyCode.W))
        {
            Vector3 eulerAngle = Vector3.forward * speed * timePerFrame;
            transform.position = transform.position + ImullQuaternionToPeulerAngle(transform.localRotation, Vector3.forward * speed * timePerFrame);
        }
    
        if(Input.GetKey(KeyCode.S))
        {
            Vector3 eulerAngle = Vector3.back * speed * timePerFrame);
            transform.position = transform.position + ImullQuaternionToEeulerAngle(transform.localRotation, eulerAngle);
        }
    }
    
    public Vector3 ImullQuaternionToEeulerAngle(Quaternion rotation, Vector3 eulerAngle)
    {
        float num = rotation.x * 2f;
        float num2 = rotation.y * 2f;
        float num3 = rotation.z * 2f;
        float num4 = rotation.x * num;
        float num5 = rotation.y * num2;
        float num6 = rotation.z * num3;
        float num7 = rotation.x * num2;
        float num8 = rotation.x * num3;
        float num9 = rotation.y * num3;
        float num10 = rotation.w * num;
        float num11 = rotation.w * num2;
        float num12 = rotation.w * num3;
        Vector3 result;
        result.x = (1f - (num5 + num6)) * eulerAngle.x + (num7 - num12) * eulerAngle.y + (num8 + num11) * eulerAngle.z;
        result.y = (num7 + num12) * eulerAngle.x + (1f - (num4 + num6)) * eulerAngle.y + (num9 - num10) * eulerAngle.z;
        result.z = (num8 - num11) * eulerAngle.x + (num9 + num10) * eulerAngle.y + (1f - (num4 + num5)) * eulerAngle.z;
        return result;
    }

     

     

    Этот код на C# на CE Lua переписать с таймером и горячими клавишами. Посмотреть как работает.

    • Понравилось 1
  16. В 25.07.2020 в 12:45, Pitronic сказал:

    если бы я взломал игру на планшете с помощью виндовс, а потом перепатчил апк, чит мод бы работал бы и там.

     

    Перепатчить апк — это непросто. Если приложение сделано на Unity без il2cpp компиляции и без обфускации, то может еще прокатит. Java (скомпилированный) может еще тоже прокатит через декомпиляцию и компиляцию. А вот жесткие so-шки через IDA можно вечно реверсить. Там нужен подход, который я не знаю. Скорее всего, через эмулятор как-то.

     

    Проще найти готовые апк моды или искать другой путь. Через взлом сейв файлов, которые можно сделать через взлом на CE как по этой статье (в первом посте) или через взлом на эмуляторе и CE. Через рут эти файлы перенести.

  17. Как минимум два способа. Простой и сложный

     

    1) Менять координаты по горячим клавишам. Тут даже скрипты писать не надо, если на CE делать. 3 координаты найти. И каждой по 2 поведения в опция выставить. 6 горячих клавиш. Три пары увеличивают и три пары уменьшают. Ничего программировать не нужно через CE.

     

    2) Программировать.  Аналогично по горячим клавишам писать полет. Язык программирования любой, который лучше всего знаешь и больше подходит. Есть пример на C#, но без записи в память чужого процесса. Можно этот код изучать и поменять Добавить код открытия процесса и добавить чтение и запись координат. MonoBehavior убрать, а update заменить таймером.  Там же пример exe полета в том числе с вариантом движения вперед - по направлению камеры (с координатами углов)

    Спойлер

     

     

    p.s. Чтобы сделать надо искать и читать документацию как писать код. Ничего сверх сложного нет. И полеты лучше отрабатывать на игровом движке или взять любой готовый пример directX на C++ и поведение камеры сделать в dll. И её уже использовать.

  18. Мой пример для integer. Его можно прееделать для float и под твой адрес
    -- ctrl + R - сбросить позицию
    -- ctrl + X - сохранить в слот X, где X от 1 до 10
    -- shift + X - сохранить в слот X, где X от 1 до 10

     

    Спойлер
    
    teleport_address = "03D2C6DC"	-- "[[address+XX]+XX]" или через registersymbol()
    type_data = 'INTEGER'			-- FLOAT, DOUBLE, INTEGER
    
    -- ctrl + R - сбросить позицию
    -- ctrl + X - сохранить в слот X, где X от 1 до 10
    -- shift + X - сохранить в слот X, где X от 1 до 10
    
    --класс
    Vector3 = {}
    function Vector3:new(address, type_data)
    
    	local object = {}
    	object.address = address
    	object.x = 0
    	object.y = 0
    	object.z = 0
    	object.type_data = type_data
    	
    	function object:getAddress()
    		return self.address 
    	end
    	
    	function object:read()
    		if object.type_data == 'FLOAT' then
    			object.x = readFloat(object.address)
    			object.y = readFloat(getAddress(object.address) + 4)
    			object.z = readFloat(getAddress(object.address) + 8)
    		elseif object.type_data == 'DOUBLE' then
    			object.x = readDouble(object.address)
    			object.y = readDouble(getAddress(object.address) + 4)
    			object.z = readDouble(getAddress(object.address) + 8)		
    		elseif object.type_data == 'INTEGER' then
    			object.x = readInteger(object.address)
    			object.y = readInteger(getAddress(object.address) + 4)
    			object.z = readInteger(getAddress(object.address) + 8)		
    		end
    		return object
    	end
    	
    	function object:write()
    		if object.type_data == 'FLOAT' then
    			writeFloat(object.address, object.x)
    			writeFloat(getAddress(object.address) + 4, object.y)
    			writeFloat(getAddress(object.address) + 8, object.z)
    		elseif object.type_data == 'DOUBLE' then
    			writeDouble(object.address, object.x)
    			writeDouble(getAddress(object.address) + 4, object.y)
    			writeDouble(getAddress(object.address) + 8, object.z)		
    		elseif object.type_data == 'INTEGER' then
    			writeInteger(object.address, object.x)
    			writeInteger(getAddress(object.address) + 4, object.y)
    			writeInteger(getAddress(object.address) + 8, object.z)		
    		end	
    	end
    	
    	function object:print_vector()
    		print(string.format("%s, %s, %s", object.x, object.y, object.z))
    	end
    	
    	setmetatable(object, self)
    	self.__index = self; 
    	return object
    end
    
    
    
    --класс
    Teleport = {}
    
    --тело класса Teleport
    function Teleport:new(address, type_data)
    	
    	local object = {}
    	-- Тип данных
    	object.type_data = type_data
    	-- Адрес
    	object.vector3_position = Vector3:new(address, type_data)
    	-- Адреса для слотов
    	object.vector3_positions = {}
    	
    	function object:getAddress()
    		return self.address 
    	end
    	
    	function object:make_hotkey_reset_position()
    	
    		local genericHotkey = createHotkey(
    				function() 
    					object.vector3_position:write()
    				end,
    				{VK_CONTROL, VK_R}
    			)
    		genericHotkey.DelayBetweenActivate = 2000
    	end
    
    	function object:make_hotkey_save_position(numberKey)
    		
    		local genericHotkey = createHotkey(
    				function()
    					speakEnglish("Save position "..numberKey)
    					object.vector3_positions[numberKey]:read()
    				end, 
    				{VK_CONTROL, VK_0 + numberKey}
    			)
    		genericHotkey.DelayBetweenActivate = 2000
    	end
    
    	function object:make_hotkey_load_position(numberKey)
    		
    		local genericHotkey = createHotkey(
    				function() 
    					speakEnglish("Load position "..numberKey)
    					object.vector3_position:read()
    					object.vector3_positions[numberKey]:write()
    				end,
    				{VK_SHIFT, VK_0 + numberKey}
    			)
    		genericHotkey.DelayBetweenActivate = 2000
    	end
    
    	function object:registry_hot_keys()
    
    		object:make_hotkey_reset_position()
    
    		for numberKey = 1, 10 do
    			local addressPosition = Vector3:new(address, type_data)
    			addressPosition:read()
    			table.insert(object.vector3_positions, addressPosition)
    			object:make_hotkey_save_position(numberKey)
    			object:make_hotkey_load_position(numberKey)		
    		end
    	end	
    	
    	object:registry_hot_keys()
    	
    	setmetatable(object, self)
    	self.__index = self; 
    	return object
    end
    
    local teleport = Teleport:new(teleport_address, type_data)

     

     

  19. В Cheat Engine есть программа туториал и там должно быть упражнение по поиску указателей как раз через сканер памяти и установку брейкпоинта.

    На ютубе должны быть наглядные решения этих туториалов. Там ничего сложного нет. Даже можно без сканера пройтись вверх по дизассемблеру и составить указатель.

    Найти видео можно по фразе "cheat engine tutorials"

     

  20. Есть очень много руководств, как искать указатели. Я очень и очень редко ищу целые указатели. Проще править код. Если надо структурки сравнивать, то можно поискать и указатели.

     

    Самый проверенный и самый сложный через отладчик Cheat Engine или через IDA, или гидру, или любой какой угодно.  Смотрим стек, выходим из функций, трейсинг...  Если указатель постоянно рассчитывается при обращении, то быстро найдешь.

     

    Самый простой способ через сканер памяти и отладчик. В этом случае как повезет + надо записывать разные варианты. Перезагружать процесс.

    Еще простой способ и долгий автоматический поиск.

    И еще один способ отказаться от указателей полностью редактируя код или использовать частичные уровни указателей 1,2 уровня (или больше, сколько надо) как для сравнения структур так и для инъекции.

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

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

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