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 :)
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 :)
popen()
Po co mi popen() ?? Ja chce zapisać i odczytać z pamięci danego procesu a nie np: pobrać jego pid.
PID procesu umiem pobrać.
Hej czy chodzi o Linux?? To może ptrace() ? albo czytaj /proc xD
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.
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:)
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.
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 :)