Kilka pytań dotyczących pamięci procesów

Kilka pytań dotyczących pamięci procesów
CO
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:73
0

Cześć, mam pytanie niekoniecznie związane z cpp, ale nie wiedziałem w jakim dziale to napisać, wiec jak cos to prosze moderatora o przeniesienie, napisałem tutaj ponieważ stwierdziłem, że osoby programujące w cpp taką wiedze zapewnie posiadają :D

Chodzi o pamięć operacyjną. Gdy odpalana jest aplikacja to dostaje swoją przestrzeń adresową? Jeżeli tak to czy adres bazowy aplikacji jest staly czy po kolejnym uruchomieniu się zmienia. Co gdy wyjde poza przestrzeń adresową procesu, czy to wgl możliwe? Byłbym wdzięczny jakby mi ktos nawet w 2 zdaniach to wyjaśnił w skrócie :)

edytowany 1x, ostatnio: flowCRANE
Pijak
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:87
1

Gdy odpalana jest aplikacja to dostaje swoją przestrzeń adresową?

Tak. Virtual address space.

Jeżeli tak to czy adres bazowy aplikacji jest staly czy po kolejnym uruchomieniu się zmienia.

Do Windows XP (włącznie) był stały, od wprowadzenia ASLR jest zmienny, ale ASLR można wyłączyć albo ominąć.

Co gdy wyjde poza przestrzeń adresową procesu, czy to wgl możliwe?

https://docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/virtual-address-spaces

edytowany 4x, ostatnio: Pijak
RE
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 3 godziny
0

to chyba nakarmi nie co twój głód wiedzy
klik
edit:
na helionie czy gdzieś jest najnowsze wydanie.


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
edytowany 1x, ostatnio: revcorey
Zobacz pozostałe 8 komentarzy
RE
można z tą uwagą że chyba jest tam trochę starsza wersja. Czym się różni nie wiem.
PrezesiQ
Pragnę tylko zauważyć, że tą wiedzę, można zdobyć z innych książek lub też materiałów dostępnych w sieci (w 75% przypadków materiały te są za darmo)
RE
@PrezesiQ: wiedza w tej książce jest już skodyfikowana i spójnie przedstawiona dwa nie wiesz co w książce jest. Ta książka też to podstawowa lektura na studiach(chociaż to mało ważne). Na forum polecamy książki nie dlatego że mamy interes z wydawnictwem a dlatego że jak jakąś czytaliśmy wiemy że jest po prostu dobra. Oczywiście można szukać i trzeba szukać w necie nie neguję. Przedstawiam jedno z możliwych źródeł wiedzy. Negatywnie odnoszę się tylko do twierdzeń "bleh trzeba wydać pieniądze", czasami trzeba.
PrezesiQ
Rozumiem, aczkolwiek autor potrzebował wiedzy na temat kwiatka, a nie całej fauny i flory. Tak, wiedza ta mogłaby się przydać na później, ale.. Jeśli póki co nie jest potrzebna, to po co zgłębiać? Jak będzie, to się kupi i przeczyta, pomyśli.
RE
Autor chce i dopytuje ciągle o kolejne kawałki, czasami także ciężko coś zrozumieć nie znając podstaw coś w stylu "B zależy od A". Z resztą jak ktoś myśli o karierze w embedded to warto znać tego podstawy(a dziś to domena C/C++).
PrezesiQ
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:187
0

Polecam ci playlistę ReverseCraft na kanale GynvaelColdwind. W odcinku 3 (lub 2) omawiał Virtual Address Memory.


"Jesteśmy karłami, którzy wspięli się na ramiona olbrzymów. W ten sposób widzimy więcej i dalej niż oni, ale nie dlatego, ażeby wzrok nasz był bystrzejszy, lub wzrost słuszniejszy, ale dlatego, iż to oni nas dźwigają w górę i podnoszą o całą gigantyczną wysokość" ~ Bernard z Chartes
CO
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:73
0

@Pijak: W takim razie jak moge w innej aplikacji odwołać sie do adresu bazowego jakiegoś procesu skoro jest on zmienny?

AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0
Codin napisał(a):

@Pijak: W takim razie jak moge w innej aplikacji odwołać sie do adresu bazowego jakiegoś procesu skoro jest on zmienny?

A gdyby nawet adres był znany - co z tego wynika w systemie operacyjnym z ochroną?
Co zamierzasz stworzyć?


Bo C to najlepszy język, każdy uczeń ci to powie
CO
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:73
0

@AnyKtokolwiek: chodzi o to, że znając adres bazowy procesu mogę się do niego odwołać w innej aplikacji, ale po resecie adres jest już inny i teraz jak dynamicznie pobierać ten adres żebym nie musiał za każdym razem skanowac pamięć i szukać tego adresu po czym nadpisywac go w innej apce. Można to zrobić programistycznie szukając po nazwie procesu?

Pijak
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:87
0

Najpierw znajdujesz ID procesu, a potem wywołujesz taką funkcję:

Kopiuj
DWORD_PTR dwGetModuleBaseAddress(DWORD dwProcID, TCHAR *szModuleName)
{
	DWORD_PTR dwModuleBaseAddress = 0;
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwProcID);
	if (hSnapshot != INVALID_HANDLE_VALUE)
	{
		MODULEENTRY32 ModuleEntry32;
		ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
		if (Module32First(hSnapshot, &ModuleEntry32))
		{
			do
			{
				if (_tcsicmp(ModuleEntry32.szModule, szModuleName) == 0)
				{
					dwModuleBaseAddress = (DWORD_PTR)ModuleEntry32.modBaseAddr;
					break;
				}
			} while (Module32Next(hSnapshot, &ModuleEntry32));
		}
		CloseHandle(hSnapshot);
	}
	return dwModuleBaseAddress;
}

Albo po prostu wyłącz ASLR.

edytowany 1x, ostatnio: Pijak
CO
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:73
0

@Pijak: A ta funkcja jest z jakiegos api czy sam musze ją zdefiniować? I czym jest ten moduł?

@Edit
Nie wiem czy dobrze myśle, ale do konkretnego obszaru np. jakiejś zmiennej dostane sie poprzez dodanie offsetu do bazowego adresu? Czy wgl położenie takich zmiennych względem bazowego adresu jest stałe?

edytowany 1x, ostatnio: Codin
Pijak
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:87
0

A ta funkcja jest z jakiegos api czy sam musze ją zdefiniować?

Musisz ją zdefiniować. I załączyć #include <Windows.h>

I czym jest ten moduł?

Chodzi o TCHAR *szModuleName? To nazwa exeka (lub dllki) którego adresu bazowego szukasz.

Nie wiem czy dobrze myśle, ale do konkretnego obszaru np. jakiejś zmiennej dostane sie poprzez dodanie offsetu do bazowego adresu?

Tak, ale musisz mieć handle tego procesu.

Czy wgl położenie takich zmiennych względem bazowego adresu jest stałe?

Tak, ale jeśli aplikacja ładuje dllki, adres zmiennej może zależeć od adresu bazowego dllki. Najlepiej użyć pointer scannera z Cheat Engine, który pokaże Ci moduł i offsety potrzebne do dostania się do zmiennej. Np.:

Kopiuj
denaturat.dll + 0x89
edytowany 2x, ostatnio: Pijak
CO
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:73
0

Właśnie jak to jest kiedy aplikacja ładuje dllki? Kiedy uruchamia się jakąś aplikacje to ładuje ona wszystkie potrzebne dllki i daje to wynikowy process? Jak tak to nie moge odwołać sie do zmiennej względem bazowego adrsu przestrzeni tej aplikacji? Chyba, że załączane dllki również zmieniają swój adres bazowy wewnątrz przestrzeni procesu

Pijak
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:87
0

Właśnie jak to jest kiedy aplikacja ładuje dllki? Kiedy uruchamia się jakąś aplikacje to ładuje ona wszystkie potrzebne dllki i daje to wynikowy process?

Jak jakaś potrzebna funkcja jest w bibliotece dll, to aplikacja ładuje ją za pomocą funkcji LoadLibrary (linking explicitly) lub linkuje statycznie bibliotekę importów .lib (linking implicitly).

Jak tak to nie moge odwołać sie do zmiennej względem bazowego adrsu przestrzeni tej aplikacji?

To zależy w którym module jest zmienna. DLL też mają ASLR.

edytowany 1x, ostatnio: Pijak
CO
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:73
0

Czyli rozumiem, że przy wyłączonym ASLR moge odwołać sie do kazdej zmiennej względem bazowego adresu aplikacji, a przy ASLR ładowane dllki dostają losowy adres i trzeba odwoływać sie poprzez ich bazowy adres

edytowany 1x, ostatnio: Codin
Pijak
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:87
0

Tak, wtedy adres bazowy danego modułu powinien pozostać taki sam podczas wszystkich uruchomień aplikacji. Ale nie polecam wyłączać ASLR.

Miang
dla dynamicznie ładowanych dll ?
Pijak
@Miang: Napisz aplikację która to sprawdzi :)
CO
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:73
0

@Pijak: A mam jeszcze pytanko do tej funkcji co podałeś

Kopiuj
DWORD_PTR dwGetModuleBaseAddress(DWORD dwProcID, TCHAR *szModuleName)

A dokładnie chodzi o drugi argument, czego dokłanie spodziewa się funkcja? Ja to czytam jako: Wartość zmiennej na którą wskazuje wskaźnik i jest charem.

edytowany 1x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:31 minut
  • Lokalizacja:Tuchów
  • Postów:12171
0

Drugi parametr to zwykły wskaźnik na tablicę znaków.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
CO
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:73
0

@furious programming:
To po wywołaniu takiej funkcji

Kopiuj
dwGetModuleBaseAddress(pid, "modul.dll");

dostaje taki błąd

  • gg.png (1 KB) - ściągnięć: 111
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:31 minut
  • Lokalizacja:Tuchów
  • Postów:12171
0

Wiesz w ogóle czym jest wskaźnik?


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Pijak
cienka pałeczka lub inny przyrząd służące do wskazywania czegoś na mapie ściennej, tablicy
flowCRANE
Wielce pomocna definicja.
CO
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:73
0

Teoretycznie, ale nigdy nie używałem w praktyce. Z tego co wiem to po prostu wskazuje na adres innej zmiennej

Pijak
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:87
0

Wystarczy rzutować na TCHAR*

Kopiuj
dwGetModuleBaseAddress(pid, (TCHAR*)"modul.dll");

a jak nie działa to ustaw Wielobajtowe łańcuchy znaków we właściwościach projektu.

edytowany 2x, ostatnio: Pijak
CO
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:73
1

Skoro to wskaźnik to tak też napisałem

Kopiuj
TCHAR test[] = "modul.dll";

A do parametru funkcji dałem test i działa.

@Pijak
Rzutowanie też działa, dzięki ;)

edytowany 1x, ostatnio: flowCRANE

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.