Есть ли способ, с помощью которого процесс P2 может получить доступ к локальной переменной другого процесса P1? - PullRequest
1 голос
/ 23 марта 2019

Предположим, в Linux есть два процесса P1, P2 (который является вирусом). Может ли P2 получить доступ к локальному varable (скажем, x) из P1?

При поиске в Интернете я обнаружил, что, поскольку адреса, используемые в процессах, являются логическими адресами, P2 не может получить доступ к локальной переменной 'x' в P1.
Но мне интересно, генерирует ли P2 случайные адреса, и один из которых разрешается на тот же физический адрес, что и «x», тогда не может ли он получить к нему доступ?

Действительно ли возможно, чтобы P2 получил доступ к 'x' из P1?
Если да, то как? (Если к нему можно получить какие-то хитрости, пожалуйста, дайте мне знать)
А если нет, то почему?

P1 код:

int main() {
  int x = 20;
  return 0;
}

p2 код:

int main() {
  /*
  generate random addresses and access them.
  one of them might resolve to physical address of 'x' in P1
  */
  return 0;
}

Ответы [ 3 ]

1 голос
/ 24 марта 2019

Подробная механика зависит от ОС, но с современными архитектурами ЦП, которые используют виртуальную память :

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

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

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

Наконец, в зависимости от привилегий P2, P2 может запрашивать доступ из ОС к адресному пространству P1. В Windows это API-функции ReadProcessMemory() и WriteProcessMemory(), а в Linux это доступ к устройству / dev / mem , соответствующему физической памяти , Но эти привилегии предоставляются только надежным процессам, выполняемым заслуживающими доверия пользователями. В принципе нормальные процессы обычных пользователей не должны иметь этих очень чувствительных привилегий ... Так что ваш P1 должен быть безопасным.

0 голосов
/ 24 марта 2019

Концепция процесса не существует в языке C ++.В C ++ не существует стандартного способа обмена данными между процессами.

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

0 голосов
/ 23 марта 2019

Процессы в Linux работают в защищенном режиме.Это означает, что у процесса есть виртуальный адрес, а не физический адрес.

Ответ на вопрос - да, потому что linux предлагает методы для записи и чтения памяти другого процесса.

Это можно сделатьзаписав и прочитав файл / proc /% ld / mem, где% ld - это идентификатор процесса.

Если вы хотите узнать больше, посетите: https://nullprogram.com/blog/2016/09/03/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...