[ Goran Arandjelovic @ 25.12.2005. 12:14 ] @
Jedan banalan primer:

Code:

#include <iostream>
using namespace std;

int main()
{
  int *x = new int;
  *x = 4;
  while(1){
    cout << x << " " << *x << endl;
  }
}


Dakle, znajući adresu promenljive, kako promeniti njenu vrednost iz drugog programa? Probao sam tako što sam adresu ručno dodelio int pokazivaču u drugom programu, a zatim probao da upišem vrednost (ili da pročitam) i nije mi uspelo.
O čemu se zapravo radi?
[ X Files @ 25.12.2005. 13:02 ] @
Što se tiče zajedničkog pristupa *istom* parčetu memorije, Windows obezbeđuje:

CreateFileMapping() / CloseHandle()
MapViewOfFile() / UnmapViewOfFile()

I koliko mi je poznato, to je jedini ispravan način za baratanje takvim stvarima, a
drugi mi nisu poznati, a mozda su i nemogici, jer kad bi bili, svaki los program, koji
ima buffer overrun, bi unistio ceo OS.

Npr, u recniku koji sam radio, kao zajednicki deo memorije drzim HWND na glavni
prozor da bih mogao kasnije da mu saljem SendMessage() poruke. Tacno je da to
moze i sa FindWindow(), ali taj nacin ima i nekih nedostataka.
[ Dragi Tata @ 25.12.2005. 15:34 ] @
Citat:
Goran Arandjelovic
Dakle, znajući adresu promenljive, kako promeniti njenu vrednost iz drugog programa? Probao sam tako što sam adresu ručno dodelio int pokazivaču u drugom programu, a zatim probao da upišem vrednost (ili da pročitam) i nije mi uspelo.
O čemu se zapravo radi?


Ne mere to tako ;) Kod većine modernih OS-ova, adresni prostor je ograničen na proces. Pročitaj malo o virtuelnoj memoriji. Ukratko, moraćeš da koristiš neki vid IPC-a da komuniciraš među procesima.
[ Goran Arandjelovic @ 25.12.2005. 16:41 ] @
Aha... pretpostavljam da sam dobro shvatio.. Zapravo, ova adresa koju dobijam i nije prava adresa te promenljive u fizičkoj memoriji već u virtualnoj memoriji tog procesa? Što će reći da pristupajući iz drugog programa ja zapravo pristupam ne toj, nego nekoj sasvim drugoj lokaciji... ispravite me ako grešim.
[ X Files @ 25.12.2005. 17:07 ] @
Da, u pravu si. Ta adresa nije PRAVA za ceo adresni prostor, vec za proces...

To sa apsolutnim adresama je proslo vreme, koje je funkcionisalo koliko se secam
kod Commodore Amige...

Mala digresija:

Bilo je to srecno vreme hakerisanja.

U secanju su mi jos BOOT BLOCK LOADERI na Flopy diskovima za Amigi, koji su prvo
izvrsavali program za RASPAKIVANJE podataka sa flopija (lako je bilo pronaci ODAKLE
U MEMORIJI SE VRSI RASPAKIVANJE i u KOJOJ DUZINI), i na kraju, ti loaderi su imali
jedan obican JMP (jump) na apsolutnu adresu tih raspakovanih podataka...

Pa onda, stavimo BRAKEPOINT na taj JMP, i pocnemo da trazimo gde je TEXT introa,
itd...
[ dejandj @ 25.12.2005. 18:12 ] @
Jedini pravi nacin da to "izvedes" je da vrednost promenljive upises u file i iz drugog je iscitas i posle izmene ili obrade upises ponovo u taj isti!

Mogu se pojaviti problemi sa sinhronizacijo na zalost ali se daju prevazici...
[ Dragi Tata @ 25.12.2005. 18:35 ] @
Citat:
dejandj: Jedini pravi nacin da to "izvedes" je da vrednost promenljive upises u file i iz drugog je iscitas i posle izmene ili obrade upises ponovo u taj isti!


Može i tako, ali postoje mnogo bolji vidovi komunikacije između procesa. Vidi recimo ovde poglavlja koja počinju sa IPC:

http://www.cs.cf.ac.uk/Dave/C/CE.html

[ X Files @ 25.12.2005. 20:13 ] @
Citat:

Jedini pravi nacin da to "izvedes" je da vrednost promenljive upises u file i iz drugog
je iscitas i posle izmene ili obrade upises ponovo u taj isti!


Ne bih se slozio da je PRAVI nacin (mozda NAJLAKSI)... Po meni PRAVI nacin je sa:

CreateFileMapping()
MapViewOfFile()

a, ko je korisnik Microsoftovog C++ kompajlera, mislim da je postojala i neka
olaksana mogucnost preko makroa:

--- NETESTIRANO, A MISLIM DA JE NEKADA MOGLO U C++ BUILDERU ---
(sigurno nesto slicno ima za M$ C++)


#pragma data_seg(".NAZIV")
int neki_shared_broj;
#pragma data_seg()


pa u *.DEF:

SECTIONS
.NAZIV READ WRITE SHARED

ili u linkeru (ako nema DEF):

-SECTION:.NAZIV,rws

[Ovu poruku je menjao X Files dana 25.12.2005. u 21:14 GMT+1]
[ Goran Arandjelovic @ 25.12.2005. 23:32 ] @
Citat:
Dragi Tata: Može i tako, ali postoje mnogo bolji vidovi komunikacije između procesa. Vidi recimo ovde poglavlja koja počinju sa IPC:

http://www.cs.cf.ac.uk/Dave/C/CE.html


Joj, hvala na ovom linku. Naime, imam nešto o IPC-u na srpskom, ali je očajno objašnjeno, a ovde je dosta toga o sistemskom programiranju što sam nisam uspeo da nađem. Hvala.
[ Buffy @ 26.12.2005. 11:53 ] @
bolje je koristiti sokete nego datoteke za taj posao.
[ yooyo @ 28.12.2005. 01:12 ] @
Procitaj info u MSDN-u o funkcijama:
ReadProcessMemory
WriteProcessMemory

Ove dubugging funkcije koriste npr. razni run-time patcheri (ili crackovi). Startujes svoj loader program koji pokrene zeljenu aplikaciju, zatim je pauzira, izvrsi izmenu u memoriji procesa i pusti je dalje da radi.

yooyo