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

Odpowiedz Nowy wątek
2018-08-27 22:16
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: furious programming, 2018-08-27 22:45
2018-08-28 10:43
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, 2018-08-28 13:08

Pozostało 580 znaków

2018-08-28 11:23
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, 2018-08-28 11:23

Pozostało 580 znaków

2018-08-28 11:44
0

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

dla dynamicznie ładowanych dll ? - Miang 2018-08-28 11:53
@Miang: Napisz aplikację która to sprawdzi :) - Pijak 2018-08-28 12:40

Pozostało 580 znaków

2018-08-28 21:12
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.

edytowany 1x, ostatnio: furious programming, 2018-08-28 21:18

Pozostało 580 znaków

2018-08-28 21:19
0

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


Pozostało 580 znaków

2018-08-28 21:32
0

@furious programming:
To po wywołaniu takiej funkcji

dwGetModuleBaseAddress(pid, "modul.dll");

dostaje taki błąd

  • gg.png (0 MB) - ściągnięć: 47

Pozostało 580 znaków

2018-08-28 21:34
0

Wiesz w ogóle czym jest wskaźnik?


cienka pałeczka lub inny przyrząd służące do wskazywania czegoś na mapie ściennej, tablicy - Pijak 2018-08-28 21:44
Wielce pomocna definicja. - furious programming 2018-08-28 21:45

Pozostało 580 znaków

2018-08-28 21:36
0

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

Pozostało 580 znaków

2018-08-28 21:37
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.

edytowany 2x, ostatnio: Pijak, 2018-08-28 21:50

Pozostało 580 znaków

2018-08-28 21:51
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 ;)

edytowany 1x, ostatnio: furious programming, 2018-08-28 22:19

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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