Odczyt/Zapis z/do pamięci procesu w Linuxie

0

Witam, otóż od paru godzin szukam po googlach i rozmyślam.. Jak odczytać/zapisać dane z/do procesu mając PID.
Wiem że za pomocą ptrace oraz roota ale nie ogarniam tego.

Bardzo będę wdzięczny za pomoc.
Pozdrawiam, Aifam :)

0

popen()

0

Po co mi popen() ?? Ja chce zapisać i odczytać z pamięci danego procesu a nie np: pobrać jego pid.
PID procesu umiem pobrać.

1

Hej czy chodzi o Linux?? To może ptrace() ? albo czytaj /proc xD

0

No to napisz coś więcej, co właściwie chcesz osiągnąć.
popen() pozwala ci pisać / czytać na stdin / stdout procesu który tworzysz więc poniekąd jest odpowiedzią na twoje nieprecyzyjne pytanie.
ptrace pozwala ci monitorować ale tylko proces potomny, nie dowolny proces.

1
Shalom napisał(a):

ptrace pozwala ci monitorować ale tylko proces potomny, nie dowolny proces.

To nie prawda! ptrace może się przyczepić do procesu tak jak debugger:)

1

Przy pomocy ptrace() można odczytać i zapisać dane z/do procesu, każdego procesu, mając jego PID.. Program napisany używający ptrace musi być uruchomiony z roota-a ale proces na którym wykonujemy te operacje też musi być z roota uruchomiony.

@Shalom A jak niby napisałem?? Napisałem co chce osiągnąć..

aifam96 napisał(a):

Jak odczytać/zapisać dane z/do procesu mając PID.

Podłączenie do procesu:

if(ptrace(PT_ATTACH, m_PID, 0, 0)!=0)
        {
            perror("PT_ATTACH");
            throw std::runtime_error("Memory::Memory(int pid) : ptrace(PT_ATTACH, m_PID, 0, 0)!=0 : failed");
        }

Odłączenie od procesu:

if(ptrace(PT_DETACH, m_PID, 0, 0)!=0)
        {
            perror("PT_DETACH");
            throw std::runtime_error("Memory::~Memory() : ptrace(PT_DETACH, m_PID, 0, 0)!=0 : failed");
        }

Odczyt z pamięci procesu (nie działa chyba , nie wiem):

for(unsigned i=0;i<size;i+=sizeof(int)){
            int buff;
            if((buff=ptrace(PT_READ_D, m_PID, addr+i, 0)) == -1)
            {
                perror("PT_READ_D");
                throw std::runtime_error("Memory::Read(unsigned addr, char *data, unsigned size) : (buff=ptrace(PT_READ_D, m_PID, addr+i, 0)) == -1 : failed"); 
            }
            memcpy(data+i, &buff, sizeof(int));
        }

Zapis do pamięci procesu (chyba też nie działa):

for(unsigned i=0;i<size;i+=sizeof(int)){
            int buff;
            memcpy(&buff, data+i, sizeof(int));
            if(ptrace(PT_WRITE_D, m_PID, addr+i, buff) == -1)
            {
                perror("PT_READ_D");
                throw std::runtime_error("Memory::Write(unsigned addr, const char *data, unsigned size) : ptrace(PT_WRITE_D, m_PID, addr+i, buff) == -1 : failed");
            }
        }

Ehh, widze że sam będę musiał pogłówkować, bez Waszej pomocy . Pogrzebie w dokumentacjach, może coś znajdę. Jeśli nie, zajmę się czym innym.

Pozdrawiam, Aifam.

1

Hej,

Ja już nie pamiętam dokładnie, ale zdaje mi się że to nie jest tak że każdy proces może sobie czytać / pisać pamięć dowolnego innego procesu. Inaczej diabli wzięli całe bezpieczeństwa systemu i inne takie bzdury :]

Z tego co widzę to piszesz to dla jakiegoś tam BSD :] Nie wiem jak to tam działa ale kiedyś chyba na Linuxie z uprwanieniami roota można było czytać pamięć dowolnego procesu bez użycia ptrace, ale to już chyba nie jest możliwe... Poza tym musisz wiedzieć że jądro może możliwość czytania / pisania ograniczać albo wręcz w ogóle uniemożliwiać, więc czy to zadziała to zależy od konkretnego systemu na którym będzie uruchomione.

Ale ja nie o tym miałam.. :P Załóżmy że Twój system umożliwia czytanie / pisanie do pamięci innych procesów.
Po pierwsze: proces, którego pamięć chcesz czytać musi być zatrzymany. Użyłeś kiedyś gdb żeby sobie w locie podglądać zmieniające się rejestry programu np. czy jednak zawsze się zatrzymywał program na jakimś tam "brakepoincie"? ;) Normalnie użycie ptrace wysyła sygnał stopu do procesu ale jak pewnie wiesz nie jesteś w stanie stwierdzić czy w momencie wykonania funkcji odczytu / zapisu ten sygnał do owego procesu już dotarł, czy też hasa on sobie dalej w najlepsze :P Dlatego właśnie należy na zatrzymanie procesu poczekać, co zresztą jest wspomniane w manualu do ptrace. U Ciebie tego kodu nie widzę :P

Po drugie, również w manualu wspomniane jest, że -1 jest czasami poprawną wartością zwracaną z ptrace i dlatego należy sprawdzać errno - tego też w tym kodzie nie widzę :P

Po trzecie, mógłbyś uściślić niezwykle precyzyjne określenia "Nie działa chyba, nie wiem" i "chyba też nie działa"? :D Upewnij się że nie działa i przedstaw jakieś szczegóły, bo może szukamy błędu w kodzie który "chyba jednak działa" :D

Więc może następnym razem poczytaj nim do nas westchniesz z lekkim wyrzutem, że będziesz się musiał obejść bez naszej pomocy i przeczytać dokumentację :D

No offense :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1