Odczytanie wartości adresu z pamięci.

0

Potrzebuje odczytać pamięć operacyjna z zewnętrznej aplikacji, potrafię znaleźć adres i odczytać co jest pod niego przypisane. Jednakże po zresetowaniu aplikacji adres ten ulega zmienia. Istnieje jakaś metoda ,która pozwoli mi odczytać pożądany adres po restarcie aplikacji?

Odczytu dokonuje w następujący sposób:

 ReadProcessMemory((int)processHandle, Adres, buffer, buffer.Length, ref bytesRead);
0

Jeżeli jest dynamicznie lokowany i zmienia pozycję to nie pozostaje nic innego jak przeszukać blok pamięci po patternie.

0
hzmzp napisał(a):

Jeżeli jest dynamicznie lokowany i zmienia pozycję to nie pozostaje nic innego jak przeszukać blok pamięci po patternie.

Mógłbyś opisać coś więcej w jaki sposób mogę to zrealizować ?

0

Zarządzaniem pamięcią zajmuje się Windows . Pamięć RAM to nie jest twardy dysk. W pamięci RAM wszystko zmienia się jak w kalejdoskopie.
Nie zapytałem czy chodzi ci o aplikację NET czy jakąś inną

0
Zimny Krawiec napisał(a):

Zarządzaniem pamięcią zajmuje się Windows . Pamięć RAM to nie jest twardy dysk. W pamięci RAM wszystko zmienia się jak w kalejdoskopie.
Nie zapytałem czy chodzi ci o aplikację NET czy jakąś inną

Windows Forms, to w jaki sposób mogę "wyciągnąć" jakąś informacje z innej dowolnej uruchomionej aplikacji?

0

Jaką informację ?

Np mam włączony kalkulator, dokonam obliczeń i wyświetla się wynik. Chce teraz ten wynik wyświetlić w swojej aplikacji. W jaki sposób można to zrobić ?

1
michau0709 napisał(a):
hzmzp napisał(a):

Jeżeli jest dynamicznie lokowany i zmienia pozycję to nie pozostaje nic innego jak przeszukać blok pamięci po patternie.

Mógłbyś opisać coś więcej w jaki sposób mogę to zrealizować ?

Podobnie jak to się ręcznie robi na Cheat Engine - można naskrobać skrypt, który np przeszuka pamięć pod kątem pewnych charakterystycznych danych i na tej podstawie coś dalej tam robi.

Musisz dać więcej informacji, najlepiej to apke którą chcesz czytać. Ustalić te zmienne adresy da się na wiele sposobów. W niektórych przypadkach nawet nie jest to potrzebne bo jeżeli ta aplikacja gada po socketach da się podsłuchać dane. Można też dllki podmienić i z nich zrobić pomost między oryginalnymi z dodatkową implementacją. Już nie mówiąc o dekompilacji, kilku poprawkach i ponownej kompilacji takiego targetu.

Co do przykładu kalkulatora to masz kontrolkę bodaj typu label czy edit, która ma swój stały name i za pomocą winapi możesz się dobrać do niej i w miarę dowolnie modyfikować.

1

jak masz dynamicznie alokowany obiekt pod zmiennym adresem to najpewniej znajdziesz do niego statycznie alokowany wskaźnik na heapie.
w skrócie:

  1. odpalasz program, robisz tak żeby wartość którą chcesz odczytać była w miarę mało spotykana, np ustalasz wynik w kalkulatorze na 123456789
  2. skanujesz całą pamięć programu i szukasz wystąpień tej liczby
  3. jeśli znajdziesz więcej niż jeden adres to zmieniasz wartość i sprawdzasz który z adresów zawiera nowe dane
  4. ponawiasz kroki 2-3, tym razem szukając tego adresu
  5. po restarcie programu odczytujesz wartość z adresu z kroku 4 żeby dowiedzieć się adresu z kroku 3, jeśli się nie udało to rekurencyjnie ponawiasz krok 4 szukając wskaźnika na wskaźnik. jeżeli nie znalazłeś żadnego miejsca z danym adresem to najpewniej wskaźnik jest na początek struktury która zaczyna się w pamięci trochę wcześniej i musisz pokombinować przy szukaniu z offsetami

albo po prostu jak zaproponowano wyżej szukasz konkretnego schematu - np wiesz że Twoja wartość zawsze jest obok dwóch innych wartości i skanujesz całą pamięć. minus taki że może to potrwać trochę przy każdym uruchomieniu programu

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