2013-09-28 3 views
0

У меня есть простая программа:доступа (чтение/запись) в процессе виртуальной памяти из другого приложения

#include <stdio.h> 

int a = 5; 

int 
main(void) 
{ 
    while(1) 
    { 
     int i; 
     sleep(1); 
     printf("%p %i\n", &a, a); 
    } 
    return 0; 
} 

Output (Ubuntu x64):

0x601048 5 
0x601048 5 
0x601048 5 
0x601048 5 

я узнавал о указателей в C и I уже знаете, что вы можете использовать memcpy для записи данных везде (почти) в виртуальной памяти процесса. Но возможно ли изменить значение int a, размещенное по адресу 0x601048, с помощью другого приложения (которое, конечно, использует собственную виртуальную память)? Как это сделать? Меня интересуют решения только для C.

+2

Короткий ответ: нет. Виртуальное адресное пространство каждого процесса полностью не зависит от других. –

+0

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

+3

Немного более длинный ответ, чем «нет»: 'ptrace'. Отладчики, такие как 'gdb', должны быть в состоянии сделать именно это. – us2012

ответ

4

Невозможно (обмен виртуальной памятью между двумя различными процессами в Linux). В первом приближении код, если он был, был невозможным.

И даже если вы действительно разделили такую ​​память, вы попадете в синхронизацию вопросов.

Вы действительно должны читать книги, такие как Advanced Linux Programming. У них есть несколько глав по этому вопросу (что сложно).

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

Вы можете прочитать гораздо больше о

  • pthread -s (например, читать эту pthread tutprial)

  • сегменты разделяемой памяти, установленные с использованием mmap(2)MAP_SHARED

  • средства отладки низкого уровня с использованием ptrace(2), в частности PTRACE_PEEKDATA

  • старый SysV разделяемой памяти с помощью shmat(2)

  • Posix разделяемой памяти (см shm_overview(7) ...) с помощью shm_open(2)

  • /proc/ файловой системы proc(5) например /proc/$PID/mem; Я настоятельно рекомендую сначала посмотреть на file:///proc/self/maps в вашем браузере и прочитать больше, пока вы не поймете, что это показывает. (Вы можете mmap процесс некоторые друга /proc/$PID/mem ....)

  • /dev/mem (физический RAM) см mem(4)

  • загрузки модуля ядра делает безумные трюки.

Я настоятельно советую против играть такие трюки загрязнен ПАМЯТЬ для новичка. Если вы настаиваете, будьте готовы разорвать вашу систему и сделать ее резервным. Не играйте такие трюки во время новичков Linux.

Часто вам нужны root привилегии. См. capabilities(7)

+0

Ваш ответ велик, но что, если я не хочу обмениваться воспоминаниями или запасать их на потом? Я думаю, что CheatEngine - лучший пример того, что я хочу делать. Это приложение, которое загружает другой процесс, а затем вы можете изменять значения его адресов? Так как это возможно? –

+0

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

+0

Не волнуйся. Это просто любопытство. Спасибо :) –

Смежные вопросы