Odczytywanie wartości z pamięci znając jej adres

0

Witam,
mój problem wydaje się być prosty, jednak jak szukałem w serwisie (nota bene wyszukiwarka wg mnie słabo się spisuje, ale to inna bajka) to nic odpowiedniego nie znalazłem... problem jest następujący:
Mam wartość w pamięci, która nie należy do pamięci mojej aplikacji i chcę tą wartość odczytać w delphi. Of course znam jej adres. Nie jestem pewien czy da rade to zrobić w gołym delphi, może trzeba użyć asm?

Za pomoc z góry dzięki

0

Służy do tego funkcja ReadProcessMemory. Musisz podać uchwyt do procesu, który otrzymujesz funkcją OpenProcess. Aby otrzymać identyfikator procesu używasz funkcji CreateToolhelp32Snapshot, Process32First, Process32Next. Dla Windows NT/2000/XP musisz użyć funkcji EnumProcesses z biblioteki psapi.dll

0
mad.luk napisał(a)

Dla Windows NT/2000/XP musisz użyć funkcji EnumProcesses z biblioteki psapi.dll

Dalczego musisz? Chyba raczej mozesz.

0

ToolHelp32 chyba nie ma w systemach z rodziny NT, dlatego trzeba używać PSAPI.

0
brodny napisał(a)

ToolHelp32 chyba nie ma w systemach z rodziny NT, dlatego trzeba używać PSAPI.

Jest ale nie odczytuje wszystkich parametrów prawidłowo (PROCESSENTRY32::szExeFile nie zawiera pełnej ścieżki do pliku exe)

0

Hm...
niby wszystko pięknie ładnie, wykodziłem coś takiego:

var
temp,pid,uchwyt: Cardinal;
adres_hp: Integer;
adres_hp_point: ^Integer;


[...]

uchwyt:=FindWindow(nil,'program');
pid:=0;
GetWindowThreadProcessId(uchwyt,pid);
uchwyt:=OpenProcess(PROCESS_ALL_ACCESS,true,pid);
adres_hp:=$49F030;
adres_hp_point:=pointer(adres_hp);
ReadProcessMemory(uchwyt, adres_hp_point, @hp, 4, temp);
Label8.Caption:=FloatToStr(hp);

i zawsze label8 ma captiona "0" mimo ze wartosc w pamieci wynosi 200.
Co źle robię?
Będę bardzo wdzięczny za pomoc.

Z góry dzięki

0
Mac napisał(a)

Hm...
niby wszystko pięknie ładnie, wykodziłem coś takiego:

var
temp,pid,uchwyt: Cardinal;
adres_hp: Integer;
adres_hp_point: ^Integer;


[...]

uchwyt:=FindWindow(nil,'program');
pid:=0;
GetWindowThreadProcessId(uchwyt,pid);
uchwyt:=OpenProcess(PROCESS_ALL_ACCESS,true,pid);
adres_hp:=$49F030;
adres_hp_point:=pointer(adres_hp);
ReadProcessMemory(uchwyt, adres_hp_point, @hp, 4, temp);
Label8.Caption:=FloatToStr(hp);

i zawsze label8 ma captiona "0" mimo ze wartosc w pamieci wynosi 200.
Co źle robię?

Jakiego typu jest hp? Powinno być Cardinal, (albo Dword) zreszą to też:

adres_hp: Cardinal;
adres_hp_point: ^Cardinal;

a to:

Label8.Caption:=FloatToStr(hp);

zmień na

Label8.Caption:= IntToHex(hp, 4);

I sprawdź co ci pokaże.

0
kAzek napisał(a)

Jakiego typu jest hp? Powinno być Cardinal, (albo Dword) zreszą to też:

adres_hp: Cardinal;
adres_hp_point: ^Cardinal;

a to:

Label8.Caption:=FloatToStr(hp);

zmień na

Label8.Caption:= IntToHex(hp, 4);

I sprawdź co ci pokaże.

Pokazuje 0000.
Adres w pamieci jest na pewno dobry, bo sprawdzalem to TSearch`em...

0
  1. Sprawdź czy w ogóle udało ci się coś odczytać:
if ReadProcessMemory(uchwyt, adres_hp_point, @hp, 4, temp) = 0 then
ShowMessage('Błąd funkcji ReadProcessMemory')
else
ShowMessage('Przeczytano: ' + IntToStr(temp) + ' bajtów' );
  1. A co do adresu w pamięci co jest pod tym adresem? Jeżeli jakieś dane to może się one zmieniają w trakcie działania programu.
    EDIT//
    i jeszcze sprawdź:
if uchwyt = 0 then
ShowMessage('Błąd funkcji OpenProcess');

Pod jakim systemem to robisz?

0
kAzek napisał(a)
  1. Sprawdź czy w ogóle udało ci się coś odczytać:
if ReadProcessMemory(uchwyt, adres_hp_point, @hp, 4, temp) = 0 then
ShowMessage('Błąd funkcji ReadProcessMemory')
else
ShowMessage('Przeczytano: ' + IntToStr(temp) + ' bajtów' );
  1. A co do adresu w pamięci co jest pod tym adresem? Jeżeli jakieś dane to może się one zmieniają w trakcie działania programu.
    EDIT//
    i jeszcze sprawdź:
if uchwyt = 0 then
ShowMessage('Błąd funkcji OpenProcess');

Pod jakim systemem to robisz?

Wszystko sprawdzałem i ładnie działa, pod tym adresem jest rzeczywiście wartość, która podczas działania programu się zmienia, ale nie przyjmuje nigdy wartości 0, która jest wyświetlana przez tą funkcje. Robie to pod WinXP.

0
Mac napisał(a)

Wszystko sprawdzałem i ładnie działa, pod tym adresem jest rzeczywiście wartość, która podczas działania programu się zmienia, ale nie przyjmuje nigdy wartości 0, która jest wyświetlana przez tą funkcje. Robie to pod WinXP.

W takim razie chyba jednak podajesz błędny adres. Bo jak sam piszesz udało się odczytać 4 bajty z pamięci.

0
kAzek napisał(a)
Mac napisał(a)

Wszystko sprawdzałem i ładnie działa, pod tym adresem jest rzeczywiście wartość, która podczas działania programu się zmienia, ale nie przyjmuje nigdy wartości 0, która jest wyświetlana przez tą funkcje. Robie to pod WinXP.

W takim razie chyba jednak podajesz błędny adres. Bo jak sam piszesz udało się odczytać 4 bajty z pamięci.

Ten adres to:
49F030
podany wg TSearch i w TSearchu podana jest poprawna wartość :/
EDIT: eee czegoś tu nie rozumiem zupełnie... pare dni temu sprawdzałem wszystko i uchwyty były pięknie, ładnie... a przed chwilą sprawdziłem drugi raz - a nóż / widelec coś mi wyjdzie nie tak... i rzeczywiście uchwyty i temp mają wartość 0... nie rozumiem czemu FindWindow nie znajduje programu... chodzi konkretnie o gre "Tibia", a więc uchwyt:=FindWindow(nil,'Tibia'); zwraca 0, mimo że Tibia jest włączona! Przynajmniej już wiadomo co jest nie tak... ale WHY?!

0
Mac napisał(a)

i rzeczywiście uchwyty i temp mają wartość 0... nie rozumiem czemu FindWindow nie znajduje programu... chodzi konkretnie o gre "Tibia", a więc uchwyt:=FindWindow(nil,'Tibia'); zwraca 0, mimo że Tibia jest włączona! Przynajmniej już wiadomo co jest nie tak... ale WHY?!

No to musisz się upewnić czy tekst okna gry to rzeczywisćie "Tibia" może tam być jeszcze np. numer wersji lub cokolwiek innego.
Najlepiej sprawdź jakimś programem nazwę klasy i tekst okna gry.

0
kAzek napisał(a)
Mac napisał(a)

i rzeczywiście uchwyty i temp mają wartość 0... nie rozumiem czemu FindWindow nie znajduje programu... chodzi konkretnie o gre "Tibia", a więc uchwyt:=FindWindow(nil,'Tibia'); zwraca 0, mimo że Tibia jest włączona! Przynajmniej już wiadomo co jest nie tak... ale WHY?!

No to musisz się upewnić czy tekst okna gry to rzeczywisćie "Tibia" może tam być jeszcze np. numer wersji lub cokolwiek innego.
Najlepiej sprawdź jakimś programem nazwę klasy i tekst okna gry.

Hm... jest ikona i "Tibia", nic więcej:/
Jest może inna metoda, żeby pobrać uchwyt tej gry?
Szukałem w helpie EnumProcesses, nie ma:/ O ile przez FindWindow, może da się to zrobić, ale widzę, że z tym to różnie bywa, więc wolałbym rozwiązanie na przyszłość lepsze... np. pobrać uchwyt odpalonego procesu po ścieżce, z której został odpalony itd.

0

Tak się domyślałem, że następny haxor do Tibii się dorwał. Jakiś czas temu odpowiadałęm na podobne pytanie (gość chciał pobierać min. login i pass z Tibii i też grzebał w pamięci) dając działający kod. Jeśli nikt tego nie wywalił to poszukaj na forum

0
Misiekd napisał(a)

Tak się domyślałem, że następny haxor do Tibii się dorwał. Jakiś czas temu odpowiadałęm na podobne pytanie (gość chciał pobierać min. login i pass z Tibii i też grzebał w pamięci) dając działający kod. Jeśli nikt tego nie wywalił to poszukaj na forum

Mi nie chodzi o "hackowanie" (kradzieże) accountów... chce napisać makro na uhanie dla kumpla, które mnie o nie prosił... zresztą sprawdź sobię, że ten adres to HP (ilość życia)...

0

OK, napisałęm tylko, że już był ktoś, kto pytał o kod do odczytu pamięci Tibii i że go dostał

0
Misiekd napisał(a)

OK, napisałęm tylko, że już był ktoś, kto pytał o kod do odczytu pamięci Tibii i że go dostał

Szukałem na forum i nie znalazłem :/

  var
  WindowName, ProcessId, ThreadId, HandleWindow: Integer;
  buf: PChar;
  Read: Cardinal;

  const
  WindowTitle = 'Tibia';
  Address = $49F030;
  NumberOfBytes = 4;
...
WindowName := FindWindow(nil, WindowTitle);
if WindowName = 0 then
begin
Memo1.Lines.Add('WARNING! Tibia is not running');
end;
ShowMessage('WindowName: '+FloatToStr(WindowName));
ThreadId := GetWindowThreadProcessId(WindowName, @ProcessId);
ShowMessage('TID: '+FloatToStr(ThreadID));
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
ShowMessage('HandleWindow: '+FloatToStr(HandleWindow));
ReadProcessMemory(HandleWindow, ptr(Address), buf, NumberOfBytes, Read);
ShowMessage('Przeczytano: ' + IntToStr(read) + ' bajtów' );

WindowName nie wynosi 0, ThreadID również, HandleWindow także, jedyny problem to to, że wyświetla: "przeczytano 0 bajtów", więc w porównaniu do poprzedniej "wersji" już handle jest poprawne i TID. W czym problem, dlaczego nie czyta?? Kod wykorzystany w większości z Torry`s Delphi

0

a co Ci zwraca ReadProcessMemory If the function fails, the return value is 0 (zero). To get extended error information, call GetLastError.

0
Misiekd napisał(a)

a co Ci zwraca ReadProcessMemory If the function fails, the return value is 0 (zero). To get extended error information, call GetLastError.

Zwraca 0 :/

0
function FindWindowByTitle(WindowTitle: string): Hwnd;
var
  NextHandle: Hwnd;
  NextTitle: array[0..260] of char;
begin
  // Get the first window
  NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
  while NextHandle > 0 do
  begin
    // retrieve its text
    GetWindowText(NextHandle, NextTitle, 255);
    if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then
    begin
      Result := NextHandle;
      Exit;
    end
    else
      // Get the next window
      NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
  end;
  Result := 0;
end;

Użyj tej fukcji do pobrania uchwytu Tibii
Mi zadziałało z resztą twojego kodu :] </delphi>

Też mam zamiar zrobić bota do Tibii dla <ort>włąsnego </ort>użytku i mam pytanie jak <ort>chesz </ort>rozwiązać <ort>kwesjie </ort><ort>autmatycznego </ort>ort!?

0
naryb napisał(a)
function FindWindowByTitle(WindowTitle: string): Hwnd;
var
  NextHandle: Hwnd;
  NextTitle: array[0..260] of char;
begin
  // Get the first window
  NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
  while NextHandle > 0 do
  begin
    // retrieve its text
    GetWindowText(NextHandle, NextTitle, 255);
    if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then
    begin
      Result := NextHandle;
      Exit;
    end
    else
      // Get the next window
      NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
  end;
  Result := 0;
end;

Użyj tej fukcji do pobrania uchwytu Tibii
Mi zadziałało z resztą twojego kodu :] </delphi>

Pokazywało Ci HP?! Mi niestety wywala wciąż błąd funkcji ReadProcessMemory... (zwraca wartość 0 i czyta 0 bajtów danych:/)

naryb napisał(a)

Też mam zamiar zrobić bota do Tibii dla włąsnego użytku i mam pytanie jak chesz rozwiązać kwesjie autmatycznego lecznia?
W sumie jest to bardzo proste teoretycznie... w praktyce już średnio... twoje makro robi za "proxy" między tibia a serwerem Tibii... wysyłasz odpowiedni pakiet (taki sam jaki Tibia wysyła do serwera, gdy się UHasz). Jest to rozwiązanie zdecydowanie lepsze od symulowania klikania myszą, ze względu na to, że nie koliduje z swobodną grą użytkownika makra. Ponadto makro "na pakietach" jest na pewno dużo szybsze od "symulowania użytkownika".

0
procedure TForm1.Timer1Timer(Sender: TObject);
var
temp,pid,uchwyt: Cardinal;
adres_hp: Integer;
adres_hp_point: ^Integer;
hp : integer;
begin
uchwyt:=FindWindowByTitle('Tibia');
pid:=0;
GetWindowThreadProcessId(uchwyt,pid);
uchwyt:=OpenProcess(PROCESS_ALL_ACCESS,true,pid);
adres_hp:=$0049D014;
adres_hp_point:=pointer(adres_hp);

ReadProcessMemory(uchwyt, adres_hp_point, @hp, 4, temp);
Label1.Caption:=IntToStr(hp);
end;

Dokładnie to mi odczytuje ilość HP.

A ja mam kolejne pytania :]

  1. Czy da się za pomocą TSearch wyciąganać do programu np. nazwe chara w Tibii

W sumie jest to bardzo proste teoretycznie... w praktyce już średnio... twoje makro robi za "proxy" między tibia a serwerem Tibii... wysyłasz odpowiedni pakiet (taki sam jaki Tibia wysyła do serwera, gdy się UHasz). Jest to rozwiązanie zdecydowanie lepsze od symulowania klikania myszą, ze względu na to, że nie koliduje z swobodną grą użytkownika makra. Ponadto makro "na pakietach" jest na pewno dużo szybsze od "symulowania użytkownika".

Wcześniej trzeba najpierw poznać jakie pakiety za co są odpowiedzialne jakiego polecasz dobre mi sniffera ?

0

Thx za kod, działa:P Ehh taki prosty błąd ciągle popełniałem omg:P

naryb napisał(a)

A ja mam kolejne pytania :]

  1. Czy da się za pomocą TSearch wyciąganać do programu np. nazwe chara w Tibii

W sumie jest to bardzo proste teoretycznie... w praktyce już średnio... twoje makro robi za "proxy" między tibia a serwerem Tibii... wysyłasz odpowiedni pakiet (taki sam jaki Tibia wysyła do serwera, gdy się UHasz). Jest to rozwiązanie zdecydowanie lepsze od symulowania klikania myszą, ze względu na to, że nie koliduje z swobodną grą użytkownika makra. Ponadto makro "na pakietach" jest na pewno dużo szybsze od "symulowania użytkownika".

Wcześniej trzeba najpierw poznać jakie pakiety za co są odpowiedzialne jakiego polecasz dobre mi sniffera ?

Więc tak... ja używam sniffera WPE, a jeśli chodzi o TSearch to nie napotkałem się przy szukaniu HP/many/capa/lvl/mlvl itd. na name postaci... możliwe, że jest, ale wątpie... pobierz to z pakietu, który przychodzi jak sie logujesz do serwera :)

0

pobierz to z pakietu, który przychodzi jak sie logujesz do serwera

A wiesz/wie ktoś jak to potem z tych hexów odczytać ?

Mac: Jak byś mógł to podaj do siebie jakiś kontakt (np.gg)... sprawiasz wrażenie znającego się na rzeczy a ja mam kilka prostych pytań

0

Dla początkujących oplecam Ethereal (www.ethereal.com - freeware) obok hex'a pokazuje wartosci dziesiętne (w postaci znaków)

0
noone napisał(a)

Dla początkujących oplecam Ethereal (www.ethereal.com - freeware) obok hex'a pokazuje wartosci dziesiętne (w postaci znaków)

zauważyłem że to co jest wysyłane z klienta nie przypomina raczej "czystego tekstu", jak również w odwrotna strone. Przykładowo nasłuchiwałem podczas rozmowy z kumplem i żadnego tekstu który pisaliśmy tam nie było. Ktoś wie czy to jest jakoś skompresowane albo zaszyfrowane ?

0
naryb napisał(a)
procedure TForm1.Timer1Timer(Sender: TObject);
var
temp,pid,uchwyt: Cardinal;
adres_hp: Integer;
adres_hp_point: ^Integer;
hp : integer;
begin
uchwyt:=FindWindowByTitle('Tibia');
pid:=0;
GetWindowThreadProcessId(uchwyt,pid);
uchwyt:=OpenProcess(PROCESS_ALL_ACCESS,true,pid);
adres_hp:=$0049D014;
adres_hp_point:=pointer(adres_hp);

ReadProcessMemory(uchwyt, adres_hp_point, @hp, 4, temp);
Label1.Caption:=IntToStr(hp);
end;

Dokładnie to mi odczytuje ilość HP.

Update świąteczny, wiadomo nowy klient, no i właśnie pobawiłem się troche TSearch i znalazłe że pod adresem $605A0C jest ilość HP, jak zmieniam tam wartości to mi w kliencie cyferki hp sie zmieniaja. I teraz sprobowałem wpisać tą wartość zamiast $0049D014 i mi wyświetla 0 albo jakąś kosmicznie dużą wartość przez chwile, nie wiem juz sam co robie źle bo jestem trochę w tym zielony i opornie mi idzie. Nie da rady przepisać adresu z TSEarch do tego programiku ? Trzeba to jakoś przetłumaczyć na inny adres czy co.
edit
Otóż okazało się ze to TSearch powodował problem, zamknąłem TSearch i normalne pokazuje.
/edit

0

eltrosto, co do twojego pierwszego pytania to tibia używa teraz kodowania XTEA musisz znaleźć klucz w pamięci Tibii i za jego pomocą odkodować pakiet.

Wiem że temat jest stary ale jeśli ktoś by chciał, tak jak założyciel tematu zrobić uchwyt do Tibii używając nazwy okna to należy wpisać

Thandle:= FindWindow(nil, "Tibia   "); //3 spacje po słowie tibia

lub inaczej

THandle:= FindWindow("TibiaClient", nil);
0
Caland napisał(a)

eltrosto, co do twojego pierwszego pytania to tibia używa teraz kodowania XTEA musisz znaleźć klucz w pamięci Tibii i za jego pomocą odkodować pakiet.

znalazlem troche informacji o tym XTEA ale ciezko chyba bedzie,
sa tam jakies tryby:
ECB (Electronic Codebook),
• CBC (Cipher Block Chaining),
• CTR (Counter Mode),
• OFB (Output Feedback, 8 bit i na długości bloku),
• CFB (Cipher Feedback, 8 bit i na długości bloku).

i wektor inicjujacy i oczywiscie klucz.
Pierwszy raz w zyciu sie spotykam z koniecznoscia odszyfrowania czegos czego ktos nie chce abym odszyfrowal :D i nie wiem zupelnie od czego zaczac.
No ale szukam dalej, jakby ktos cos wiedzial chetnie sie zapoznam z ta informacja.
edit
Zamierzam napisac programik ktory bedzie po kolei odczytywal wartosci z pamieci Tibii i podstawial je jako klucz do procedury deszyfrujacej (modul XTea, zaczne od stalej dlugosci 16 bajtow, jak nie pojdzie doloze petelke podstawiajaca rozna dlugosc kluczy), input to zesniffowane dane gdy postac mowi jakis tekst i poszukam w outpucie tekstu ktory postac mowila, moze da rade. Jeśli jest tam jakis haczyk i ktos go zna dajcie info ;)
Taka troche grzebanina w bebechach ale ma tez swoj urok :D
/edit
edit 2
napisalem ten program, ale nic nie moge znaleŹĆ bo to strasznie dlugooooooooooooooooooo trwa
/edit 2

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