Czytanie adresu z procesu.

Czytanie adresu z procesu.
0

Witam.

Chciałbym wiedzieć czy jest jakaś możliwość przeczytania adresu od danego procesu.
Chodzi mi o coś takiego: Powiedzmy że mam grę Gothic 2 i koniecznie chcę znać jej adres.

Dziękuję.

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Co rozumiesz poprzez adres procesu?


0

To się chyba nazywa Process Base Address.

maniutek20
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 17 godzin
  • Postów:138
0

quidquid Latine dictum sit, altum videtur
0

Z tym że nie interesują mnie pointery, jakieś ich dodawanie itp.
Chcę prosto i gładko odczytać adres procesu.
Mam na chwilę obecną tak:

Kopiuj
function GetModuleBaseAddress(ProcessID: Cardinal; MName: String): Pointer;
var
Modules : Array of HMODULE;
cbNeeded, i : Cardinal;
ModuleInfo : TModuleInfo;
ModuleName : Array[0..MAX_PATH] of Char;
PHandle : THandle;
begin
Result := nil;
SetLength(Modules, 1024);
PHandle := OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, False, ProcessID);
if (PHandle <> 0) then
begin
EnumProcessModules(PHandle, @Modules[0], 1024 * SizeOf(HMODULE), cbNeeded); //Getting the enumeration of modules
SetLength(Modules, cbNeeded div SizeOf(HMODULE)); //Setting the number of modules
for i := 0 to Length(Modules) - 1 do //Start the bucle
begin
GetModuleBaseName(PHandle, Modules[i], ModuleName, SizeOf(ModuleName)); //Getting the name of module
if AnsiCompareText(MName, ModuleName) = 0 then //If the module name match with the name of module we are looking for...
begin
GetModuleInformation(PHandle, Modules[i], @ModuleInfo, SizeOf(ModuleInfo)); //Get the information of module
Result := ModuleInfo.lpBaseOfDll; //Return the information we want (The image base address)
CloseHandle(PHandle);
Exit;
end;
end;
end;
end;




var
ProcessID : Cardinal;
begin
Label1.Caption := (string(GetModuleBaseAddress(ProcessID, 'Gothic2.exe')));
end;
 

Coś jest nie tak, bo label1 robi się pusty.

KA
A ProcessID jaką ma wartość? Kodu sformatować nie potrafisz a bawisz się w hakiera...
maniutek20
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 17 godzin
  • Postów:138
0

Sorry że tak wklejam linki, ale szkoda czasu na tłumaczenia :) http://forum.cheatengine.org/viewtopic.php?t=559714&sid=6c35dfcca6d151fad10a50e15318120e


quidquid Latine dictum sit, altum videtur
flowCRANE
Widać, że gość skleja kod z gotowców znalezionych w sieci, a Ty mu podsyłasz kolejne... :D
maniutek20
ale działające :)
0

A jak to wykorzystać do mojego celu?

Kopiuj
Label1.Caption := ReadProcessMemory(PHandle(Pointer(DWORD(GetModuleBaseAddress(PId, ProcessName))), @Name, 8, buffer);

wówczas pisze, że PID jest undeclared.

Kopiuj
Label1.Caption := ReadProcessMemory(PHandle(Pointer(DWORD(GetModuleBaseAddress('Gothic2.exe'))), @Name, 8, buffer);  

Incompatible types: 'cardinal' and 'string';

edytowany 2x, ostatnio: flowCRANE
KA
Chłopie przecież Ty w ogóle nie wiesz co robisz... ręce opadają.
maniutek20
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 17 godzin
  • Postów:138
0

Dobra, napisałem długiego posta, potem wytestowałem ten Twój kod, potem poszukałem w necie i mam wnioski:
Z tego Twojego kodu wynika że korzystasz z JCL i generalnie pakietu JEDI. Zapomnij o tym! To niby ułatwia różne rzeczy, a potem będziesz płakać jak zrobić w zwykłym StringGridzie podświetlenie/zaznaczenia linijki.

Druga sprawa: po komunikacie Incompatible types: cardinal and string; można łatwo wywnioskować że mamy niezgodność typów (badum tssss...), czyli trzeba zapoznać się z funkcjami wspomagającymi konwersję typów (tu i tak to nie pomoże, ale uwierz mi i tak się przyda).

Po trzecie: użycie:

Kopiuj
GetModuleInformation(PHandle, Modules[i], @ModuleInfo, SizeOf(ModuleInfo));

To są funkcje windowsowe, więc przy szukaniu rozwiązań proponuję do googla dopisywać MSDN.

I teraz do meritum: zapoznaj się proszę z ReadProcessMemory Skopiuj sobie ten kod, skompiluj, przyjrzyj mu się dokładnie i zobacz co z tego jest ci potrzebne (zaręczam że jest tam odpowiedź na Twoje pytanie). A i to nie jest tak, ze jestem ostatnim Wujem i robię ci na złość nie poprawiając kodu/nie pisząc kodu. Wszyscy tutaj uczyli się kopiując z gotowców i patrząc jak to działa (BTW są trzy fazy programowania: 1. czemu to k.. nie działa, 2. O! k.., działa! i 3. jak to k.. działa).


quidquid Latine dictum sit, altum videtur
edytowany 3x, ostatnio: flowCRANE
flowCRANE
Troszkę poprawiłem, coby było czytelniej.
0
Kopiuj
function GetBasePointerOfModule(ProcessId: dword; Modulename: string): Integer;
var
  FSnapshotHandle: THandle;
  FModulEntry32: MODULEENTRY32;
  s: string;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId);
  try
    if FSnapshotHandle <> INVALID_HANDLE_VALUE then
    begin
      FModulEntry32.dwSize := SizeOf(FModulEntry32);
      if Module32First(FSnapshotHandle, FModulEntry32) then
      begin
        repeat
          s := FModulEntry32.szModule;
          if s = Modulename then
          begin
            Result := Integer(FModulEntry32.modBaseAddr);
            break;
          end;
        until (not Module32Next(FSnapshotHandle, FModulEntry32));
      end;
    end;
  finally
    closeHandle(FSnapshotHandle);
  end;
end;


var
  GameHandle : Cardinal;
  BaseAddress : int64;

  Addr : Int64;

  Window : cardinal;
  PID : cardinal;
begin

  Window := FindWindow(nil,'Gothic2');
  GetWindowThreadProcessId(Window,PID);
  GameHandle := OpenProcess(PROCESS_VM_READ,false,PID);

  if GameHandle > 0 then
  begin
    BaseAddress := GetBasePointerOfModule(PID, 'Gothic2.exe');


    edit2.text := ('$')+inttostr(BaseAddress);


    end
else
showmessage('Open Game');
end; 

Chyba jestem blisko, jednak to wciąż nie to. Dlaczego edit2.text := $3604480, kiedy powinien być $C924F98 ? Co robię źle?

edytowany 1x, ostatnio: flowCRANE
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Gorlice
0

Powinno być:

Kopiuj
edit2.text := Format('0x%0:x', [BaseAddress]);

lub jak wolisz:

Kopiuj
edit2.text := Format('0x%0:.8x', [BaseAddress]);

ale to nie rozwiąże tego problemu(?). Skąd wiesz jaki adres jest prawidłowy, bo podany przez Ciebie nie wygląda mi na taki (jak na exe apki)?


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 2x, ostatnio: kAzek
0

A no chodzi o to, że gdy podłączę cheat engine z jakimkolwiek exe i zrobię pointer, który załóżmy będzie wyglądać tak:
"Gothic2.exe"+0033EC50 wówczas wychodzi -> 08947BB8, więc jestem wstanie sprawdzić jaki addres ma dany proces poprzez odwrotne działanie : 08947BB8-0033EC50 = 8608F68. Właśnie taki adres chciałbym otrzymywać w delphi nie piernicząc się w CE.

KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Gorlice
0

Zrób screena z tego Chat Enginezobaczę co tam faktycznie...


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
0

Ten address, który odczytuję jest dobry, jednak w Delphi nie potrafię go wykorzystać tak jak to jest wykorzystywane w CE.
Proszę:

ce.png

  1. 01150000 (odczytany adres) + 0033EC50 ->0C640008
  2. 0C640008 + 3c0 -> 0C6403C8

Mi pojawia się błąd już w "1" równaniu:
Dlaczego? Bo 01150000 + 0033EC50 nigdy mi nie wyjdzie 0C640008, bo gdy dodam $3c0 nie zwraca mi ten adres żadnej wartości. Jeżeli zaś pominę pierwsze równanie znając Od razu wynik i zrobię w delphi tak: $0C640008 + $3c0, to wynik jest poprawny:

Kopiuj
Spinedit5.value := round(memreaddouble(($0C640008+$3c0)));

Jakimś dziwnym trafem (mój nieogar) w delphi nie poprafię tego równania zaczynając od "1" wykonać poprawnie, a CE robi to bez problemu.

  • ce.png (11 KB) - ściągnięć: 91
edytowany 1x, ostatnio: flowCRANE
flowCRANE
Obrazki wstawiaj do załączników, a kod w znaczniki kolorujące składnię.
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Gorlice
0

Nie znam sie na Chat Engine (nigdy sie nie bawiłem) ale faktycznie tam masz zaznaczony Pointer to może czyta wartość z pod tego adresu (sumy 01150000 + 0033EC50) i gdyby odczytać z tego adresu DWORD może by wyszło właśnie to 0C640008. W końcu zaznaczone Pointer nie jest dla jaj.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
0

Pointera używa się do odczytywania wartości z dynamicznych addressów.
Adres od processu zmienia się za każdym razem gdy uruchomię *exe file na nowo.
Adresem nie zmieniającym się w moim przypadku jest 0033EC50, natomiast 3c0 jest offsetem, który jest potrzebny do odczytania tego, co chcę odczytać.
Dlatego wygląda to tak
(odczytany adres z exeka) 01150000 + 0033EC50 + 3c0.
w cheat engine może to również wyglądać tak:
"Gothic2.exe" + 0033EC50 + 3c0 i wyjdzie na to samo.
Jako że adres z exeka się zmienia musiałem pierw mieć kod, który mi go będzie odczytywać. Niestety nie wiem dlaczego w cheat engine całe działanie działa poprawnie, a u mnie nie. Coś jakby odczytany adres nie był zbyt poprawny do tego typu równania.

W autoit wygląda to tak:

Kopiuj
   Local $Staticoffset = 0x0033EC50
    Local $hOpen, $sRead
    $PID = ProcessExists("Gothic2.exe")
    $hOpen = _MemoryOpen($PID )
    Local $Base = _MemoryModuleGetBaseAddress($PID, 'Gothic2.exe')

    $sRead = _MemoryRead($Base + $Staticoffset, $hOpen, 'dword') + 0x3c0 
edytowany 1x, ostatnio: flowCRANE
flowCRANE
Wstawiaj kod w znaczniki kolorujące składnię.
0

Takie coś zamienia mi na numer

Kopiuj
ShowMessage(inttostr($001C0000 + $0033EC50 + $3c0));

Jak zrobić, by wynik też był hexem? xd

edytowany 1x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Tuchów
  • Postów:12164
0

Jak zrobić, by wynik też był hexem? xd

Przekonwertować za pomocą odpowiedniej funkcji, np. IntToHex.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
0

Tylko jak to ogarnąć w równaniu, bo zaczyna mi się robić takie coś:

Kopiuj
 Edit11.Text := IntToHex(BaseAddress,8) + IntToHex($0033EC50,8)       ->> 013E00000033EC50. Client Base Address wynosi: 013E0000.
edytowany 1x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Tuchów
  • Postów:12164
0

Bo jak głupoty robisz to i głupoty wychodzą...

Kopiuj
Edit11.Text := IntToHex(BaseAddress + $0033EC50, 8);

Zostaw to co robisz i idź uczyć się podstaw programowania.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
0

Pierw wolałbym to ogarnąć.
Tak czy inaczej wychodzi mi jakieś g**no.

Kopiuj
 Edit11.Text := IntToHex($013E0000 + $0033EC50, 8)       ->  0171EC50

title
Wg. CE powinno wyjść 08B260E8.
W czym może być problem? xd

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Tuchów
  • Postów:12164
0

Pierw wolałbym to ogarnąć.

Powodzenia w ogarnianiu czegoś, czego nie ogarniesz bez chociażby podstawowej wiedzy.

Tak czy inaczej wychodzi mi jakieś g**no.

Wychodzi to co ma wychodzić - wynik jest jak najbardziej prawidłowy:

Kopiuj
0x013E0000 + 0x0033EC50 = 0x0171EC50

Jak nie wierzysz to sprawdź w kalkulatorze.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
0

Sprawdzałem na kalkulatorze i widzę, że to samo wychdzi. Dlaczego zatem w CE to wygląda inaczej i to działa?

AN
  • Rejestracja:około 14 lat
  • Ostatnio:4 miesiące
  • Postów:125
0

@kAzek ma racje to jest pointer.
Oczytaj wartość z adresu $013E0000 + $0033EC50 +$3c0 a następnie z tej wartości odczytaj właściwe dane.
Poniżej pseudokod w pascalu.

Kopiuj
var
  addr: dword;
  val: integer;
  i: Longword;
begin
  {...}
  ReadProcessMemory(handleprocesu, Pointer($013E0000 + $0033EC50 +$3c0),@addr,i);
  ReadProcessMemory(handleprocesu, Pointer(addr),@val,i);
  {...}
end;
0

Tak jak inny mówili, i dodatkowo na bank ten offset jest błędny, gdyż zazwyczaj kilka offsetów od bazowego adresu prowadzi do zmiennej, a nie tylko jeden tzw. suma wszystkich :)

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)