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

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 :)

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

0

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

0

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

0

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

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ć?

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?

0

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

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.

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?

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.:

denaturat.dll + 0x89
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

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.

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

0

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

0

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

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.

0

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

0

@furious programming:
To po wywołaniu takiej funkcji

dwGetModuleBaseAddress(pid, "modul.dll");

dostaje taki błąd

0

Wiesz w ogóle czym jest wskaźnik?

0

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

0

Wystarczy rzutować na TCHAR*

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

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

1

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

TCHAR test[] = "modul.dll";

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

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

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