ReadMemory

0

Witam.
Jakiś czas temu zacząłem się uczyć delphi. Jednak po nie długim
czasie postanowiłem przerzucić się na C++.

Otóż mam taki problem:
Gdzieś w internecie znalazłem funkcję do delphi odczytującą dane z uruchomionych
procesów, lecz nie udało mi się znaleźć tej funkcji dla C++. Może ktoś z Was (kto
zna się na tym lepiej niż ja) mógłby w jakiś sposób przerobić tą funkcję aby działała
pod C++. :)

Funkcje:

function ReadMemInteger(Address: Cardinal): Cardinal;       //Read adress:value
var
ProcId: Cardinal;
tProc: THandle;
NBR: Cardinal;
value:integer;
begin
    GetWindowThreadProcessId(FindWindow('Notepad',Nil), @ProcId);
    tProc:= OpenProcess(PROCESS_ALL_ACCESS, False, ProcId);
    ReadProcessMemory(tProc, Ptr(Address), @value, 4, NBR);
    CloseHandle(tProc);
    Result:=value;
end;

function MemReadString(Address: Integer): String;
var
NB : LongWord;
Temp : ARRAY [1..255] OF Byte;
I : Byte;
IDProcess, proc_ID : Cardinal;
begin
GetWindowThreadProcessID(FindWindow('Notepad', nil), @proc_ID);
IDProcess := OpenProcess(PROCESS_ALL_ACCESS, false, proc_ID);
Result := '';
ReadProcessMemory(IDProcess, Ptr(Address), @Temp[1], 255, NB);
for I := 1 to 255 do
begin
if ((Temp[I] = 0) or (Temp[I] = $0F)) then
Break;
Result := Result + Chr(Temp[I]);
end;
end;

Zastosowanie:

label1.Caption := MemReadString($0078E414);

Proszę o pomoc i pozdrawiam,
Sleqqus. :)

0

Blagam, ReadProcessMemory jest to funkcja do DEBUGOWANIA!
http://msdn.microsoft.com/en-us/library/ms679303%28VS.85%29.aspx

Nie mozesz tak po prostu odczytac pamieci.
Najpierw musisz uzyc DebugActiveProcess(), a pozniej DebugBreakProcess().
Tylko na XP i wyzej, przykro mi.

Jak to zrobisz, proces jest wstrzymany, i mozesz sie nim bawic.

A jak kozystasz z delphi to kozystaj z komponentow. Nie ma sensu taki syf robic. Albo delphi, albo winapi.

0

up - mozna spokojnie jej uzywac bez DebugActiveProcess() i DebugBreakProcess()... Wystarczy OpenProcess() z odpowiednimi prawami i potem mozesz czytac/zapisywac bez wiekszych problemow.
Wracajac do tematu - zerknij tutaj: http://www.edgeofnowhere.cc/viewtopic.php?p=4000830

0

O to mi chodziło.
Dzięki. :)

0

ale ReadProcessMemory bez uprzedniego zatrzymania nie ma sensu.
Nie wolno zakladac ze image base jest zawsze taki sam!
Pierw trzeba zlokalizowac adres z ktorego chce sie czytac. A zeby to zrobic, trzeba albo zapytac o niego usera, albo z automatu - przeparsowac execa i dosc do momentu odwolania do zmiennej, i wtedy ja zmienic.
ReadProcessMemory jest tylko pomoca, nie mozna tego uzywac od tak... System musi miec takie funkcje, zeby latwo bylodebugowac - program nie dziala, robimy zrzut pamieci.

prostu kozystanie w twoj sposob jest niezgodne z przeznaczeniem tej funkcji.
Ty chcesz zobaczyc jakis string - do tego celu musisz zmodyfikowac obraz pliku przed zladowaniem tak, by w momencie odwolania do stringu wykanac jakas inna funkcje, np zapis go do pipe, chyba klasyczny przyklad IPC. Mozna tez przekazac adres, i zawiesic watek. Poprawnie napisany program nie zkodyfikuje pamieci dopoki watek sie nie wznowi - a tym samym nie zwolni semaforu (poprawnie napisany zawsze go wezmie jesli sa inne watki, a jesli NIE MA problem zmiany z glowy)). To sie nazywa cracking/patching. ReadProcessMemory to tylko pomoc, musi byc. Jak by nie bylo ludzie by kombinowali z wlasnymi driverami i zrobilby sie syf.

Linux dla przykladu nie zezwala na dowolne odczytywanie procesu. proces musi byc pierw ptrace()'owany.

Nie mozna zakladac ze adres XX zawiera te zmienna. Program moze byc zaladowany pod doslownie dowolny adres, doloz do tego dynamiczna alokacje pamieci, i adres jest rozny przy kazdym uruchomieniu.Jedyne co mozna zrobic, to uruchomic proces od poczatku pod debugerem, albo lepiej - wlasnie zmodyfikowac albo plik, albo pamiec (po zaladowaniu, ale przed uruchomieniem, CreateProcess z flaga suspended). Jest jeszcze opcja hooka, ale to dziala tylko w kernel mode, i watpie czy autor watku jest tym zainteresowany szczegolnie ze nie jest to niezbedne.

0

Słuchaj gfdgdf432 vel yr654 vel h3x, durny [CIACH!] leczący kompleksy próbami chakierki, skończ [CIACH!] bo kiedyś faktycznie ktoś Ci ryja obije. Przeczytałeś arty na MSDN-ie? Fajnie, przeczytaj je jeszcze raz, ze zrozumieniem. Próbowałeś abusować 4p, teraz podbudowujesz swoje ego udzielając 'rad' wprowadzających w błąd? Idź stąd i nie wracaj, inaczej ani jeden Twój post tutaj nie powisi dłużej niż kilka minut, miałeś to obiecane.

0

Jeszcze tylko takie małe pytanie.
Tamte funkcje, które podałem odczytują wartości numeryczne (integer) i tekstowe (string).
A tutaj jest ReadProcessBytes i zamiast tekstu, który chcę, aby wyciągnął pokazuje mi
ciąg cyfr. :(

Co z tym zrobić? :)

Pozdrawiam,
Sleqqus.

@Edit:
Może jeżeli ktoś byłby taki miły (bardzo proszę), może mógłby to wszystko co wkleiłem
na początku podać w c++ jako gotowiec? :)

W tedy sam sobie kolejno dojdę do wszystkiego.

Bardzo proszę i pozdrawiam,
Sleqqus.

0

może wklej najpierw Twoją próbę przepisania i my Ci pomożemy... nikomu się nie chce pisać za Ciebie.

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