Przypisanie adresu komórki do wskaźnika/zmiennej

0

Witam. Mam program który pokazuje mi adresy komórek pamięci do zmiennych w innych programach. Chciałbym tego użyć w c++. Za pomocą kodu:

#include <iostream.h> 
#include <conio.h> 
#pragma hdrstop 
#pragma argsused 

int main(int argc, char* argv[]) 
{ 
int a=1; 
int *w; 
w = &a;  
cout << "Wartosc: " <<  *w << endl << "Adres: " << w; 

getch(); 
       return 0; 
}

sprawdziłem, że adres do komórki przechowywany jest w postaci dziesietnej. Program z którego odczytuje adresy pokazuje je w postaci szesnastkowej. Przykładowo mam adres:02AEC488 wiec po zamianie na dziesietny mam:45008008. Tylko mam problem jak przypisać ten adres do wskaźnika a wskaźnik do jakiejs zmiennej zeby zwracała mi wartość przechowywaną w podanej komórce pamięci.

Help me.

0

wskaźnik to w sumie int, więc robisz tak:

typ_danych *wsk;
wsk=(int*)adres; //czyli np. wsk = (int*)45008008;
cout << *wsk;

Przy czym odpalenie tego rzuci Ci segfaulta, bo nie wolno programowi odnosić się do nieswojej pamięci:)

0

Hmm, a mozna jakos odnieść sie do pamięci innego programu? Czy to juz podchodzi pod WinApi ?

0

Nie wiem, jak to wygląda w windowsie (w linuksie leci segfault), ale sam chwilę pomyśl, co by było, gdyby programy mogły sobie hasac po pamięci do woli? Żadne hasła itd nie byłyby bezpieczne, bo możnaby je zczytać bezpośrednio z ramu, dowolny program mógłby modyfikować pamięć programów uruchomionych z roota, wszelkie synchronizacje w systemie przestałyby mieć sens. Dlatego pamięć się chroni.

Idąc dalej: nawet dwa procesy tak bliskie jak proces rodzicielski i proces potomny muszą używać sztuczek do komunikacji międzyprocesorowej, nie mogą się "tak sobie o" dostać do pamięci drugiego procesu.

Koniec końców: ja nie znam sposobu dobrania się do pamięci innego, działającego programu i na każdym w miarę niedziurawym systemie tego się zrobić nie da:)

0

@Kaszanka: Jeśli już idziemy do WinApi to poczytaj o Alokacji pamięci w innych procesach/pisaniu do pamięci innych procesów/zdalnych wątkach - na pewno znajdziesz coś przydatnego :)

0

Udało mi sie wczytać wartość z komórki pamięci, ale napotkałem na inny problem.

Z każdym ponownym uruchomieniem aplikacji z której czytam wartość adres do niej zmienia sie.

Ktoś ma jakiś pomysł?

0

zmien system na starszy:)
a tak na serio, poczytaj o "Address space layout randomization" http://msdn.microsoft.com/en-us/library/bb430720.aspx i dowiedz sie jak to wylaczyc, albo zmien swoje zamiary, albo sie dostosuj, albo przynajmniej przestan dziwic ze ktos smie Twoje adresy zmieniac..

0

Juz to ominąłem ;)

program "oblicza" mi aktualny adres ort! komórki pamięci ale mam go w postaci dziesietnej. teraz musze napisac tylko skrypt zeby przeliczał mi z postaci dziesietnej na heksadecymalna i wrzuce to do ReadProcessMemory

tylko tutaj nasuwa sie kolejne pytanie, co zrobic zeby c++ przechowywal mi zmienna w postaci heksadecymalnej zebym mógł podać zmienna w ReadProcessMemory

0

Od kiedy liczby są w postaci dziesiętnej albo heksadecymalnej trzymane? Polecam powtórkę z podstaw przed zabawami w abusowanie cudzego oprogramowania.

0

aua..

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