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:ponad 5 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:43 minuty
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:ponad 6 lat
  • Ostatnio:5 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ć?


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:ponad 5 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:ponad 5 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:ponad 5 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:ponad 5 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:około 9 godzin
  • Lokalizacja:Tuchów
  • Postów:12165
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:około 9 godzin
  • Lokalizacja:Tuchów
  • Postów:12165
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:ponad 5 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
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)