Kłopoty z pamięcią

0

Jak pobrać początek pamięci zajmowanej przez program i jej koniec (wskaźniki na te miejsca)? Chciałbym zapisać pamięć jednego z moich programów w pliku bajt po bajcie xd

Bardzo potrzebuje tego info, z góry dzięki za pomoc.

0

tzn chcesz zapamiętać stan programu? A później go z powrotem wczytać?

może Serializacja obiektów?

0

Stan programu to chyba trochę co innego niż mem dump.
Ale po co komu takie coś? :|

0

Tak chce zapisac stan programu do pliku a później go odczytać, i wbrew pozorom jest mi to bardzo potrzebne ;]
wie ktos jak mozna znalec te miejsca?

0

Ja chce zapisać stan programu do ktorego nie mam kodu źrodłowego
nie wiem jak działa Serializacja ale jesli można nią to wykonać z dowolnym programem to się jej naucze, proszę o opowiedz ^^

0

Znalazlem że można pobrać wielkość pamięci programu poprzez PrivateMemorySize
wiec jakbym mial miejsce gdzie ta pamięć się zaczyna to już chyba by rozwiązywało sprawę

0

Jeśli chcesz zapisać stan programu celem późniejszego wczytania i uruchomienia, to wiedz że to się nie uda (zwłaszcza przy 32 bitach) ze względu na relokacje.

0

Chodzi Ci o to że jak uruchomię na nowo program to jego dane będa zapisane w innym miejscu w pamięci?

No ale to chyba nic nie zmienia bo jak zrobie procedure ktora wykrywa poczatek pamieci zajmowanej przez dany program i podmienie potem te dane moimi z pliku to chyba all ok bedzie.

Nie jestem jakims ekspertem xd wiec jak sie myle to mnie poprawcie ^^

PS: Nawet jeśli się nie da tego wczytać to i tak dobrze jakby ktos napisał jak znalezc ten poczatek pamięci bo to chyba jest wykonalne ;]...

0

Buahha właśnie ten artykuł teraz czytałem zanim tu wszedłem xd

Masz racje pomógł by mi ale funkcje ReadProcessMemory i Write... mam opanowane xd tylko tego głupiego początku pamięci programu nie umiem znaleźć. (Wiesz czy w C# nie ma łatwiejszego dostępu do tych funkcji?)

Dzięki wielkie że starasz się pomóc ja sam przeszukuje neta już od paru godzin i nic... ;/

0

@Azarien, jakie relokacje? Relokacje nie mają tutaj nic do rzeczy. W wypadku konfliktu nowe położenie nie jest losowe - generalnie adresy są stałe póki coś w środowisku się nie zmieni.

Tego zrobić się nie da - co z uchwytami, klamotami współdzielonymi, rzeczami trzymanymi przez jądro na potrzeby procesu? Pamięć to nie wszystko (a i tak do całej dostępu mieć nie będziesz)... Dałbym Ci kod do wyliczania wszystkich używanych stron pamięci procesu ale nic Ci po tym, w tej sytuacji jest bezwartościowy.

0

Znalazłem sposób na pobranie wskaźnika do początku głównego modułu programu,
zapisuje pieknie all, przy wczytywaniu aplikacje wywalaja bledy xd

No i tak jak mówisz sprawdziłem i faktycznie nie wszystko jest w tym miejscu, właściwie to prawie nic na czym mi zależało... No ale czas i tak nie zmarnowany bo się znowu paru rzeczy nauczyłem xd

Teraz chyba sie pobawie troche z dll'kami, mam jeden program ktory mój kolega rozbudował właśnie dzięki plikom dll, choć nie miał kodu źródłowego tego programu. Jak się to robi? może ktoś już ma linki do strony gdzie to opisuje ktoś, bo nie wiem co w google właściwie wpisać xd

0

Znalazłem sposób na pobranie wskaźnika do początku głównego modułu programu,
zapisuje pieknie all, przy wczytywaniu aplikacje wywalaja bledy xd

A zdajesz sobie sprawę, że poza modułem istnieje też coś takiego jak stos, sterta, konteksty wątków itd? Wiesz, że każdy program ma 2GB własnej prywatnej przestrzeni adresowej?

Manov napisał(a)

Teraz chyba sie pobawie troche z dll'kami, mam jeden program ktory mój kolega rozbudował właśnie dzięki plikom dll, choć nie miał kodu źródłowego tego programu. Jak się to robi? może ktoś już ma linki do strony gdzie to opisuje ktoś, bo nie wiem co w google właściwie wpisać xd

To się dowiedz jak to zrobił - albo program udostępniał mechanizm pluginów albo pobawił się spoofingiem, art Gyna na ten temat: http://vexillium.org/?sec-dllsp

0
deus. napisał(a)

@Azarien, jakie relokacje? Relokacje nie mają tutaj nic do rzeczy. W wypadku konfliktu nowe położenie nie jest losowe - generalnie adresy są stałe póki coś w środowisku się nie zmieni.

Jakiego konfliktu? Twórca wątku chce sczytać pamięć programu. Tutaj jesteśmy chyba zgodni, że taki dump się nie nadaje do powtórnego uruchomienia.

0

Tak, jesteśmy zgodni. Co nas różni - z mojego punktu widzenia relokacje znaczenia nie mają.

0

Zapomniałem właśnie dodać że ta aplikacja nie obsługuje pluginow, ani nie importuje żadnych swoich własnych bibliotek (tylko różne standardowe). Te biblioteki które stworzył kolega są w jej głównym katalogu z plikiem wykonywalnym. Niestety nie mam z nim kontaktu na razie więc się go nie zapytam jak to zrobił. Myślę że to działa na zasadzie takiej że pisze odpowiedniki fukcji które są w danym programie, kompiluje do postaci dll... tylko jak zmusic program by zamiast swoich funkcji wykonywał jakieś z dll... jak zrobić żeby w ogóle wczytał dll... (nie mam źródła tego programu)

@deus. Dzieki wielkie za tego arta, jak wróce ze szkoły to go dokładnie poczytam i spróbuje zrobić jakaś bibliotekę.
Tylko tak na szybko poczytałem teraz i to i tak chyba nie pomoże w tym co napisałem bo ta aplikacja ma wszystkie funkcje wkompilowane w siebie nie w jakiejś osobnej dll która by można podmienić.

0

Najprostszy sposób to subclassing i hooki - używając tego napisałem kiedyś program, który do systemowego kalkulatora w Windows dodaje funkcjonalność odtwarzacza mp3 :)

0

Najprostszy to jest spoofing - da się to zrobić praktycznie z automatu. Chociaż w sumie zależy co się robi - czy dodaje nowe kontrolki/okna czy modyfikuje istniejące, czy ma to działać statycznie czy dynamicznie...

W każdym razie C# tutaj i tak się nie przyda za bardzo.

0

@deus. dzieki wielkie ten spoofing jest bardzo ciekawy, juz sie nim niezle pobawilem i nauczylem^^
masz może wiecej ciekawych artykułów na podobne tematy?

@othello zaraz biore sie za subclassing mam nadzieje że to bedzie coś równie interesującego

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