W jaki sposób odczytać adres z pointera a następnie dodać do niego offset?
pointer := pointer + 10;
[Error] Unit1.pas(85): Operator not applicable to this operand type
Jeszcze napisze ze:
PtrBase :pointer;
PtrBase := pointer($0045A4DC);
a offset to 184
var
PtrBase: Pointer;
begin
PtrBase := Ptr($0045a4dc);
PtrBase := Ptr(Integer(PtrBase) + 184);
ShowMessage(IntToStr(Integer(PtrBase)));
end;
Chciałem się jeszcze zapytać jak porać z tego pointera adres?Próbuje, ale coś mi nie wychodzi.Niby coś pobiera ale nie jest to taki adres jak powinien.
Integer(PtrBase)
Integer(PtrBase)
na 64-bitowym kompilatorze program poleci ci w kosmos ;-)
delphi nie posiada póki co 64-bit kompilatora :] :p
BTW można założyć, że na 64-bit kompilatorze integer też będzie 64-bit
BTW można założyć, że na 64-bit kompilatorze integer też będzie 64-bit
nie będzie.
a te informacje masz z ...
Misiekd napisał(a)
a te informacje masz z ...
<img=http://wswiktor.fm.interia.pl/ball-crystal-fused3.jpg>
A serio, to wszystkie istniejące 64-bitowe kompilatory (np. C++) dla architektury AMD64 mają 64-bitowe pointery, ale 32-bitowego podstawowego integera. Byłoby dziwne, gdyby Delphi się nagle z tego wyłamało.
Nie wiem czy dobrze robie:
const
POINTER1= $0046A4DD;
offset1= $140;
function ReadMemInteger(Address: Cardinal): Cardinal;
var
ProcId: Cardinal;
tProc: THandle;
NBR: Cardinal;
value:integer;
proc_ID : Cardinal ;
begin
GetWindowThreadProcessID(FindWindow(Nil, 'aplikacja'), @proc_ID);
tProc:= OpenProcess(PROCESS_ALL_ACCESS, False, proc_ID);
ReadProcessMemory(tProc, Ptr(Address), @value, 4, NBR);
CloseHandle(tProc);
Result:=value;
Edit2.Text := '$'+inttohex(ReadMemInteger(POINTER1)+(offset1),8);
end;
I wczytuje mi całkiem inny adres niż ten który jest wyświetlany przez cheat engine
Pointer w cheat engine ma budowe taka: nazwaaplikacji.exe + adres
Co takiego robie źle ze mi źle pobiera adres.Proszę o pomoc.
ReadMemInteger(POINTER1)+(offset1)
zgadnij co zostanie przekazane jako adres do funkcji
Pomyliłem się i przez nieuwagę napisałem na forum z offsetem
powinno byc:
Edit1.Text := '$'+inttohex(ReadMemInteger(POINTER1),8);
jednak i tak nie działa i dalje pokazue mi nieprawidłowy adres
Szukając odpowiedzi na moje pytanie natrafiłem na necie tutorial jak zrobić bota i była tam taka wzmianka:
The address is Tibia.exe+4034FC which equals 8034FC because Tibia.exe's base address is 400000 and 400000 + 4034FC = 8034FC.
Czy to oznacza że ja też muszę dowiedzieć się jaki jest adres bazowy programu i następnie do niego dodać pointer?
Jeżeli tak to zrobić?
znajdź sobie jakiś adres w CE później podstaw identycznie do POINTER1 i odczytasz te same dane oczywiście
Edit2.Text := '$'+inttohex(ReadMemInteger(POINTER1),8);
musi być poza funkcją nie tak jak napisałeś wyżej bo zawiesisz program
Może to pomoże wam zrozumieć o co mi chodzi.
Jeżeli w normalny sposób w CE znajdę sobie pointer
to wygląda to tak jak na tym obrazu niżej.(Czyli pisze nazwa aplikacji.exe+adres)
http://img59.imageshack.us/i/asdadwb.png/
Jeżeli usunę z tego część z nazwą aplikacji pozostawiając jedynie adres to wtedy pokazuje mi się dokładnie taki sam jak w moim programie
,jednak jest to nieprawidłowy adres.
http://img827.imageshack.us/i/asdad2.png/
Moje pytanie brzmi jak zrobić aby w moim programie wyświetlał się prawidłowy adres,taki jak na pierwszym obrazku.