Nie mogę uzyskać dostępu do procesu i jego pamięci

0

Witam. Piszę temat, gdyż ja niestety chyba nic nie wymyślę. Zarywam noc kombinując - dlaczego w przypadku tej jednej aplikacji nie mogę uzyskać dostępu do pamięci. Nie jest to aplikacja chroniona w żaden sposób i powiniem być wstanie bez problemu ją modyfikować. Niestety, ale wyświetla się "odmowa dostępu". Rzecz w tym, gdy chcę uzyskać dostęp do jakiejkolwiek innej aplikacji zmieniając w kodzie tylko identyfikator PID to wszystko działa.
To jest kod:

function MemReadInteger(Address: Cardinal): Integer;
var
value:integer;
ProcId: Cardinal;
tProc: THandle;
begin

    tProc:= OpenProcess(PROCESS_ALL_ACCESS, False, 20812);       //dziala 24472  , &5F98
    ShowMessage(SysErrorMessage(GetLastError));
    ReadProcessMemory(tProc, Ptr(Address), @value, 4, NBR);
    CloseHandle(tProc);
    Result:=value;

end;

Robiłem to również z GetWindowThreadProcessId i nazwą okna, ale też nie działało dlatego kombinując zacząłem samemu wklikiwać PID.

Ktoś ma pomysł dlaczego to się dzieje tylko i wyłącznie z tą jedną aplikacją, która warzy dosłownie 50 mb?

Dzięki.

0

Przed odczytem użyj jednej z funkcji VirtualProtect lub VirtualProtectEx.

0

Chyba nie bardzo wiem jak to zastosować. Nie bardzo mogę znaleźć co kolwiek o tym na internecie.

function MemReadInteger(Address: Cardinal): Integer;
var
value:integer;
ProcId: Cardinal;
tProc: THandle;
newValue, tempVal: string;
original:dword;

OldProtect: DWORD;
begin


    VirtualProtectEx(8400,  pointer(Address),SizeOf(newValue),PAGE_EXECUTE_READWRITE,original);

    tProc:= OpenProcess(PROCESS_ALL_ACCESS, False, 8400);       //dziala 24472  i &5F98




    ShowMessage(SysErrorMessage(GetLastError));
    ReadProcessMemory(tProc, Ptr(Address), @value, 4, NBR);


    CloseHandle(tProc);
    Result:=value;

end;

Nie ma to jakiegos sensu xd

0

Mało informacji, może po prostu próbowałeś odczytać adres, który nie istnieje.

Musisz sprawdzić memory mapping procesu, tam będziesz miał wszystkie strony pamięci dostępne i uprawnienia jakie mają.
Możesz też użyć cheat engine, bo on wewnątrz też posługuje się systemowym winapi OpenProcess i ReadProcessMemory w niektórych operacjach, więc mimo braku tych syscalli część operacji i tak będzie dostępna.

0
lizme napisał(a):

Mało informacji, może po prostu próbowałeś odczytać adres, który nie istnieje.

Musisz sprawdzić memory mapping procesu, tam będziesz miał wszystkie strony pamięci dostępne i uprawnienia jakie mają.
Możesz też użyć cheat engine, bo on wewnątrz też posługuje się systemowym winapi OpenProcess i ReadProcessMemory w niektórych operacjach, więc mimo braku tych syscalli część operacji i tak będzie dostępna.

Własnie informacje z adresu tej pamięci pozyskałem z cheat engine, gdzie są one dostępne bez żadnego problemu. Nie mogę ich tylko odczytać (wyświetlać) w mojej aplikacji.

1

Ale ty nawet błędów nie sprawdzasz czy OpenProcess się udał, może nulla zwrócić, powinieneś wszystkie błędy posprawdzać i wypisywać, bo skąd wiesz jaki błąd jest jak ty nic nie sprawdzasz tam.

A w ogóle zamknąłeś cheat engine przed tym? Możliwe że to też blokuje w jakiś sposób.

0
lizme napisał(a):

Ale ty nawet błędów nie sprawdzasz czy OpenProcess się udał, może nulla zwrócić, powinieneś wszystkie błędy posprawdzać i wypisywać, bo skąd wiesz jaki błąd jest jak ty nic nie sprawdzasz tam.

A w ogóle zamknąłeś cheat engine przed tym? Możliwe że to też blokuje w jakiś sposób.

Tak zamknąłem cheat engine. Nie rozumiem tylko czemu to działa z każdą aplikacją, a z tą jedną akurat nie.

1

To wrzuć tę aplikację i ogólnie sprawdzaj czy OpenProcess się udało, zwróciło handle, a nie nulla, czy ReadProcess się udał, a jak nie to jaki błąd zwróciło itp.
Bez sprawdzania błędów nie słyszysz co chce ci powiedzieć system.

Podstawowe błędy są w zwracanej przez funkcję wartości i GetLastError() funkcja zwraca ostatni błąd w szczegółach.

Z czego ReadProcessMemory zwraca 0 jak się udało.
A OpenProcess 0 jak się nie udało.
Resztę możesz doczytać na microsoftu stronie.

0
lizme napisał(a):

To wrzuć tę aplikację i ogólnie sprawdzaj czy OpenProcess się udało, zwróciło handle, a nie nulla, czy ReadProcess się udał, a jak nie to jaki błąd zwróciło itp.
Bez sprawdzania błędów nie słyszysz co chce ci powiedzieć system.

Podstawowe błędy są w zwracanej przez funkcję wartości i GetLastError() funkcja zwraca ostatni błąd w szczegółach.

Z czego ReadProcessMemory zwraca 0 jak się udało.
A OpenProcess 0 jak się nie udało.
Resztę możesz doczytać na microsoftu stronie.

No własnie już przy openprocess pojawia się błąd.

"Wypisz na ekran GetLastError() ta funkcja zawiera błąd czemu nie udało się. — lizme 5 minut temu" Wypisz na ekran? Sorka nie rozumiem. Wyświetla mi odmowę dostępu.

"Schemat atrybutu ma złą składnię" przy ProcID.

0

Ja pierniczę brak słów VirtualProtectEx na losowych parametrach? Przecież w dokumentacji jak byk masz pierwszy parametr uchwyt procesu to chyba przed tym wypadałoby wywołać OpenProcess ta funkcja zwraca ten uchwyt a swoją drogą nie odróżniasz ID od uchwytu bo tu i to użyłeś 8400? TO NIE JEST TO SAMO już pomoijam to że to ID masz jakoś dziwnie stałe.

Tak z pamięci bez kompilatora używając twoich zmiennych mniej więcej tak to powinno wyglądać oczywiście zakładam że chcesz tylko odczytać wartość z pamieci:

    tProc:= OpenProcess(PROCESS_VM_READ, False, 8400);
    VirtualProtectEx(tProc, Pointer(Address), SizeOf(value), PAGE_READONLY, original);
    ReadProcessMemory(tProc, Ptr(Address), @value, SizeOf(value), NBR);
    VirtualProtectEx(tProc, Pointer(Address), SizeOf(value), original, original);
    CloseHandle(tProc);
0
kAzek napisał(a):

Ja pierniczę brak słów VirtualProtectEx na losowych parametrach? Przecież w dokumentacji jak byk masz pierwszy parametr uchwyt procesu to chyba przed tym wypadałoby wywołać OpenProcess ta funkcja zwraca ten uchwyt a swoją drogą nie odróżniasz ID od uchwytu bo tu i to użyłeś 8400? TO NIE JEST TO SAMO już pomoijam to że to ID masz jakoś dziwnie stałe.

Tak z pamięci bez kompilatora używając twoich zmiennych mniej więcej tak to powinno wyglądać oczywiście zakładam że chcesz tylko odczytać wartość z pamieci:

    tProc:= OpenProcess(PROCESS_VM_READ, False, 8400);
    VirtualProtectEx(tProc, Pointer(Address), SizeOf(value), PAGE_READONLY, original);
    ReadProcessMemory(tProc, Ptr(Address), @value, SizeOf(value), NBR);
    VirtualProtectEx(tProc, Pointer(Address), SizeOf(value), original, original);
    CloseHandle(tProc);

Tak, chcę tylko odczytywać wartości z pamięci. Adres znaleziony w cheat enginee pokazuje zupełnie inny numer niż tutaj. Niestety pokazuje mi jakieś dziwne wartości typu 2006238054.

function MemReadInt(Address: Cardinal): Cardinal;
var
Value:Integer;
ProcId: Cardinal;
tProc: THandle;
Original:DWORD;
OldProtect: DWORD;
Handle:HWND;


begin
Handle := Findwindow('Nazwa okna', nil);
GetWindowThreadProcessId(Handle, @ProcId);
tProc:= OpenProcess(PROCESS_VM_READ, False, ProcId);
if Handle < 1 then
begin
ShowMessage('Window not found');
end
else
begin
    VirtualProtectEx(tProc, Pointer(Address), SizeOf(value), PAGE_READONLY, original);
    ReadProcessMemory(tProc, Ptr(Address), @value, SizeOf(value), NBR);
    VirtualProtectEx(tProc, Pointer(Address), SizeOf(value), original, original);
    CloseHandle(tProc);
    Result := Value;

end;
end;

Po czym wywołuję funkcję timerem z SpinEdit3.Value := MemReadInt($adres);

Tak jak pisałem wcześniej problem jest tylko z tą jedną aplikacją. Inne działają dobrze. Myślałem może że ta funkcja ma jakiś problem z odczytem np PID okna, ale to akurat działa świetnie. Wygląda na to, że OpenProcess szwankuje. Cały czas wartość tproc mi zwraca jako 0.

0

Jeżeli już samo wywołanie funkcji OpenProcess się nie udaje to zakładając że PiD jest prawidłowy to nie wiem, może trzeba uruchamiać z prawami admina?

0
kAzek napisał(a):

Jeżeli już samo wywołanie funkcji OpenProcess się nie udaje to zakładając że PiD jest prawidłowy to nie wiem, może trzeba uruchamiać z prawami admina?

Też nie. Gdzieś wyczytałem że komuś pomogło ustawienie const PROCESS_QUERY_LIMITED_INFORMATION = $1000, i je zastosować zamiast Process_vm_read, jednak u mnie to też nic nie dało.

0

Faktycznie zapomniałem o tym spróbuj samo PROCESS_QUERY_INFORMATION albo PROCESS_VM_READ or PROCESS_QUERY_INFORMATION

0

To bardzo dziwne. Jak otworzę delphi (używam 10.2) ppm -> jako administrator to wtedy mi wszystko działa - zczytuje co ma zczytać. Gdy natomiast delphi zamknę i otworze aplikację ppm -> jako administrator to oddaje mi wartości "0". Totalnie nie wiem czemu tak jest. Za każdym razem gdy chcę skorzystać ze swojego programiku to muszę go uruchamiać przez delphi, które musi być odpalone jako administrator.

0

Idzie to jakoś rozkminić dlaczego program uruchamiany jako administrator nie działa, a jak uruchamiam całe delphi jako administrator wczytuje ten projekt to już działa jak należy?

Specjalnie odinstalowałem bitdefender i nadal ten sam problem.

3

Spróbuj nadać swojej aplikacji wyższe uprawnienia przed otwarciem procesu wywołując funkcję ze strony
https://www.swissdelphicenter.ch/en/showcode.php?id=1177
z parametrami jak niżej:

NTSetPrivilege(SE_DEBUG_NAME, True);
0
ArekBrowarek napisał(a):

Specjalnie odinstalowałem bitdefender i nadal ten sam problem.

Co to jest za windows?
Jeśli 7 to masz jeszcze wbudowanego anitmalwara, ale on pewnie tego nie blokuje.
Jeśli to 8,10,11 to masz jeszcze defendera wbudowanego w system.

Co mamy:
Wygląda na to (chociaż nie jestem pewny), że odpalasz to z pozycji aplikacji oznaczonej jako kompilator + debugger, wtedy wszystko działa.
Natomiast z pozycji skompilowanego kodu z zewnątrz, wtedy dzieje się coś dziwnego.
Z drugiej strony na pewnych aplikacjach to działa, a na pewnej nie.

Antywirusy biorą pod uwagę kilka czynników. Dla docelowego procesu to może być przykładowo:

  1. Proces jest na uprawnieniach systemowych
  2. Ładuje bibliotekę dll z sekcją RWX
  3. Ma połączenie z internetem

...

Natomiast dla procesu attachującego:

  1. Charakterystyczne wywołania API
  2. Czas kompilacji
  3. Czy aplikacja jest podpisana czy nie

...

Jakie są różnice pomiędzy procesami (tym dla którego działa i tym dla którego nie działa), z których chcesz odczytać pamięć?

0

Windows 11. Jak odpalam z paramtetrami "NTSetPrivilege(SE_DEBUG_NAME, True);" to wyskakuje error: Nie wszystkie wywołane uprawnienia lub grupy są przypisane komputerowi wywołującemu", natomiast jak uruchomię jako administrator to już śmiga jak trzeba :) Po prostu trzeba to było dodać co napisał @kAzek i uruchamiać program jako administrator.

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