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

Kilka pytań dotyczących pamięci procesów
CO
  • Rejestracja: dni
  • Ostatnio: dni
  • 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 :)

Pijak
  • Rejestracja: dni
  • Ostatnio: dni
  • 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

RE
  • Rejestracja: dni
  • Ostatnio: dni
0

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

PrezesiQ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 187
0

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

CO
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • 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ć?

CO
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • 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.

CO
  • Rejestracja: dni
  • Ostatnio: dni
  • 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?

Pijak
  • Rejestracja: dni
  • Ostatnio: dni
  • 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
CO
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • 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.

CO
  • Rejestracja: dni
  • Ostatnio: dni
  • 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

Pijak
  • Rejestracja: dni
  • Ostatnio: dni
  • 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.

CO
  • Rejestracja: dni
  • Ostatnio: dni
  • 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.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
0

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

CO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 73
0

@furious programming:
To po wywołaniu takiej funkcji

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

dostaje taki błąd

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
0

Wiesz w ogóle czym jest wskaźnik?

CO
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • 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.

CO
  • Rejestracja: dni
  • Ostatnio: dni
  • 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 ;)

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.