Как можно было бы читать память из процесса? Это отличается от ОС?

11

Как опытный веб-разработчик, но начинающий программист «низкого уровня», эта штука все еще для меня вуду.

Мне любопытно, как можно было бы начать искать блок памяти и затем читать его (например, читать таймер в игре в шахты)? Отличается ли это от версии ОС / ОС?

Ева
источник

Ответы:

14

Это несколько сложный и даже сложный вопрос, в том смысле, что вы можете углубиться в это. Но для упрощения немного:

Рассматривая ваш пример « чтения таймера в игре в шахты »:

Первый шаг - найти адрес памяти . Обычно это делается с помощью инструмента, называемого редактором памяти (в некоторых случаях это может быть отладчик), который может использовать различные методы для поиска местоположения переменной в памяти процесса . Обычным способом является поиск определенного значения (например, значения таймера) в области памяти целевого процесса, затем изменение целевого значения (например, увеличение таймера) и поиск совпадений снова. Этот процесс фиксирует кандидатов на каждой итерации, пока не останется только точная переменная. Чтобы получить адрес этой переменной в пространстве памяти процесса, достаточно щелкнуть мышью с помощью редактора памяти.

Второй шаг - изменить данные в этом конкретном адресе . Как это сделать, зависит от операционной системы. В Windows есть вызов WinAPI с именем, WriteProcessMemoryкоторый можно использовать для записи предопределенных данных по заданному адресу в пространстве памяти целевого процесса. В нашем примере вы использовали бы эту функцию, чтобы перезаписать переменную таймера в целевом процессе вашим собственным желаемым значением, эффективно изменив таймер в игре.

На практике вам нужно будет найти идентификатор процесса целевого процесса , а затем присоединить свой мошеннический процесс к целевому процессу, чтобы получить возможность изменять пространство его памяти. Это довольно тривиальная задача, но она не способствует ответу на вопрос, поэтому я оставил ее читателю в качестве упражнения. ;)

zxcdw
источник
Будет ли расположение переменной одинаковым при каждом запуске процесса?
brunoqc
1
@brunoqc Нет, почти нет.
Дан
2

Это совершенно другое ОС. Некоторые не позволят вам сделать это вообще, и вам нужно иметь некоторые средства, чтобы знать, где данные, которые вы хотите, находятся в пространстве памяти цели.

Вот как это сделать в Linux: /unix/6301/how-do-i-read-from-proc-pid-mem-under-linux

pjc50
источник
какая ОС не позволила бы это? Кажется, что вы можете сделать это под Linux и Windows, по крайней мере
Eva
@Evan Каждая операционная система должна разрешать (ограниченные по соображениям безопасности) средства для модификации памяти удаленного процесса в целях отладки. Однако обратите внимание, что, например, несоответствие привилегий по соображениям безопасности может привести к невозможности чтения / записи памяти процесса более привилегированного процесса. Хорошим примером этого может быть запрет на процесс с правами гостевого пользователя на чтение / запись памяти процесса с правами администратора, поскольку это может поставить под угрозу всю систему и стать прямым способом для гостевого пользователя получить права администратора на система.
zxcdw
1

Приложение получает диапазон памяти от ОС. Как правило, приложение должно запрашивать память, но эта функциональность может быть скрыта для программиста из-за языка.

Такие языки, как C, допускают запросы блоков для определенных размеров, тогда как другие языки, такие как C ++, C # и Java, разрешают запросы с использованием таких ключевых слов, как new. У каждого языка есть несколько способов выделить память, так что это всего лишь краткий обзор. Освобождение памяти обратно в ОС может быть сделано явно или через сборщик мусора.

Доступ к памяти в приложении зависит от того, как оно было выделено. C и C ++ являются наиболее известными благодаря использованию концепции указателей для указания / отслеживания расположения памяти. В противном случае доступ к памяти обрабатывается с помощью созданного класса или переменной.

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

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

Мой ответ важен, когда вы пишете приложение, тогда как ответ zxcdw важен для доступа к памяти, которая принадлежит другому приложению. Ваши термины LMGTFY будут «отладка» и «обратный инжиниринг», чтобы углубиться в эту тему.

Некоторое дополнительное чтение:


источник
отличный ответ, хотя да, в этом случае меня больше интересует чтение памяти из приложения, которое я сам не написал. Я буду голосовать, как только у меня будет 15 представителей;)
Ева
@Evan - обязательно прочитайте статью о виртуальной памяти. Это даст вам лучшее понимание происходящего картирования. Вы должны понимать отображение, чтобы выбрать приложение. Большинство отладчиков позволят вам подключиться к работающему процессу, который позволит вам увидеть инструкции и память приложения.