Это несколько сложный и даже сложный вопрос, в том смысле, что вы можете углубиться в это. Но для упрощения немного:
Рассматривая ваш пример « чтения таймера в игре в шахты »:
Первый шаг - найти адрес памяти . Обычно это делается с помощью инструмента, называемого редактором памяти (в некоторых случаях это может быть отладчик), который может использовать различные методы для поиска местоположения переменной в памяти процесса . Обычным способом является поиск определенного значения (например, значения таймера) в области памяти целевого процесса, затем изменение целевого значения (например, увеличение таймера) и поиск совпадений снова. Этот процесс фиксирует кандидатов на каждой итерации, пока не останется только точная переменная. Чтобы получить адрес этой переменной в пространстве памяти процесса, достаточно щелкнуть мышью с помощью редактора памяти.
Второй шаг - изменить данные в этом конкретном адресе . Как это сделать, зависит от операционной системы. В Windows есть вызов WinAPI с именем, WriteProcessMemory
который можно использовать для записи предопределенных данных по заданному адресу в пространстве памяти целевого процесса. В нашем примере вы использовали бы эту функцию, чтобы перезаписать переменную таймера в целевом процессе вашим собственным желаемым значением, эффективно изменив таймер в игре.
На практике вам нужно будет найти идентификатор процесса целевого процесса , а затем присоединить свой мошеннический процесс к целевому процессу, чтобы получить возможность изменять пространство его памяти. Это довольно тривиальная задача, но она не способствует ответу на вопрос, поэтому я оставил ее читателю в качестве упражнения. ;)
Это совершенно другое ОС. Некоторые не позволят вам сделать это вообще, и вам нужно иметь некоторые средства, чтобы знать, где данные, которые вы хотите, находятся в пространстве памяти цели.
Вот как это сделать в Linux: /unix/6301/how-do-i-read-from-proc-pid-mem-under-linux
источник
Приложение получает диапазон памяти от ОС. Как правило, приложение должно запрашивать память, но эта функциональность может быть скрыта для программиста из-за языка.
Такие языки, как C, допускают запросы блоков для определенных размеров, тогда как другие языки, такие как C ++, C # и Java, разрешают запросы с использованием таких ключевых слов, как
new
. У каждого языка есть несколько способов выделить память, так что это всего лишь краткий обзор. Освобождение памяти обратно в ОС может быть сделано явно или через сборщик мусора.Доступ к памяти в приложении зависит от того, как оно было выделено. C и C ++ являются наиболее известными благодаря использованию концепции указателей для указания / отслеживания расположения памяти. В противном случае доступ к памяти обрабатывается с помощью созданного класса или переменной.
В большинстве случаев вам не нужно беспокоиться о доступе к конкретной памяти в вашей программе. Языковые конструкции и ОС эффективно скрывают эту заботу о вас.
Ваш пример таймера в игре является отличным примером того, что вам не нужно беспокоиться о распределении памяти. У вас будет переменная, представляющая таймер, и вы просто прочитаете из переменной.
Мой ответ важен, когда вы пишете приложение, тогда как ответ zxcdw важен для доступа к памяти, которая принадлежит другому приложению. Ваши термины LMGTFY будут «отладка» и «обратный инжиниринг», чтобы углубиться в эту тему.
Некоторое дополнительное чтение:
источник