Skocz do zawartości

[Delphi] Dostęp do pamięci


Blind

Polecane posty

  • Odpowiedzi 69
  • Created
  • Ostatnia odpowiedź

No Toster jak zwykle musi ratowac sytuacje smile.gif
Jak ktos jest zainteresowany zarzadzaniem pamiecia niech przestanie tu gdybac i przeczyta sobie rozdzial o tym w "Podstawach Systemow Operacyjnych". Przestaniecie wtedy takie herezje tu glosic wink.gif

Toster: wez mi tylko wytlumacz co masz na mysli mowiac tryb rzeczywisty i chroniony

Down With The Sickness :)

Link do komentarza
Udostępnij na innych stronach

Dobra to teraz Gif się wypowie 8)

winda jak to winda chroni pamięć albo i nie, ale kto to tam wie ;p

a teraz przyspieszony kursik dobierania się od innych programów :>

Pierwsze co musimy zrobić to oczywiście stworzyć uchwyt do procesu którego pamięć chcemy edytować/czytać/itd.
wiec o to dodajemy 4 magiczne zmienne :>

[code=Delphi] ^hwx(ŚkćpĘ\"y'jŚy3ĘvŚĘui'
Window := 0;
ProcessID := 0;
hProcess := 0;
FillChar(naYKK
NB[H[[Ę[ Ó^WH ĘNBŚbvćFrfCfwCFV&VvvWEvćFuF&VE&%Ą]A%4(A%ŃĄ4(lse begin
hProcess := OpenProcess(PROCESS_ALL_ACCESSYKQ
NBYH[B6R&Vv7G'Vś6ŚRćŚ6&6W7P4(4(4( [/code]

a i funkcja Ptr() dla niewtajemniczonych to jest pointer, a jeśli to wam nie wystarcza to odsyłam na msdn gdzie są wszystkie funkcje szczegółowo opisane. A i najważniejsze zmienna w tym przypadku jest to integer ale równie dobrze może to być string lub tablica charow.

@DarkAndrew i inni
a i co do wielkości zadeklarowanej pamięci to faktycznie normalnie maxymalnie można 4GB ale jak sie wie jak to można to obejść :>

"Bogowie to bugi ludzkich umysłów" Gifanonim ®

Link do komentarza
Udostępnij na innych stronach

nie jestem doswiadczonym programistą i w powyzszych kodach widze sporo niejasnosci ;(


- co to jest name w 3 linijce?
- skad wiemy ile pamieci przydzielone jest procesowi, tj. jak skonstruowac petle nie nieskończoną?
- skad wiemy czy cos pod danym adresem jest int a co string?
Link do komentarza
Udostępnij na innych stronach

czego nie potrafisz ? ten kod jest żywcem wyciety z mojego progosa -.-

1)to 'name' mozesz olac bo to jest tablica charow przez przypadek sie zaplatalo tzn. zapomnialem usunac po przeklejeniu

2) Nie musisz tego wiedziec. w ogole po co ci to ?

3) to jest nie istotne, wszystko co jest w pamieci mozesz odczytac jako int albo string zaleznie jak ci jest wygodniej.

"Bogowie to bugi ludzkich umysłów" Gifanonim ®

Link do komentarza
Udostępnij na innych stronach

okej. dzieki.
w tej czesci "instrukcje na pamięciprocesu" dalem taki kod:

[code=Delphi]
for i:=1 to 100 do
begin
Inc(adr)YZ[H[YHX[HYHBE&6W74V'&6W72G\"G\"ffF4(ŃĄŃQMŃĄŹŹŃQMŃĄ;
end;
[/code]

to jest moj kod, ale chyba nawet do niego nie program nie dochodzi... w debuggerze w miejscu if Window <> 0 then zwraca zawsze ze window jest 0...
i kod sie nie wykonuje..

ajajaj
a moze bys pokazal kod poprawny, bedzie mozna znalezc bledy i wreszcie sie nauczyc pisac smile.gif

pozdrawiam

-----
ktoś - name to jakiś string i juz sie kompilator nie czepia wtedy smile.gif

Link do komentarza
Udostępnij na innych stronach

zauważyłem tongue.gif ale nie zdążyłem usunąć, bo odpowiedziałeś

zauważyłem też, że instrukcje

window := 0;
hProces := 0;

nie są wykonywane.


oraz drobny szczegół przy instrukcjach warunkowych:

[b]poco pisać
[code=Delphi] if cośtam = cośtam2 then
else begin
instrukcje7)Ś+ui'if cośtam <> cośtam2 then
begin [/code]
??

Poza tym u mnie kod nie działa. Kombinowałem nawet z usuwaniem warunków. Zawsze zatrzymuje się na następnym :
window zawsze = 0
procesID = 0
hProces = 0

no chyba, ze ja [b]poprostu nie umiem tego obsłużyć... CO konkretnie wpisać w "nazwa procesu"? w delphi faq znalazłem to:
[quote] 47. Jak pobrać uchwyt ( Handle ) dowolnego okna?
Służy do tego funkcja \"FindWindow\". Żeby pobrać uchwyt należy znać właściwość \"Caption\" lub \"ClassName\". Jeżeli nie znamy, któregoś z tych elementów wstawiamy nil. Przykład pobrania uchwytu Inspektora Obiektów.

var
H : THandle;
begin
FindWindow(nil,'Object Inspector'); [/quote]

"Caption", to chyba ten tekst wyświetlany na niebieskim pasku na górze okna, tak? nazwa procesu to to samo?

Link do komentarza
Udostępnij na innych stronach

mi sie wydaje ze nazwa procesu to "nazwa obrazu" z menedżera zadań windows... czyli np. notepad.exe o ile takowy jest odpalony..
mamy ten sam problem.. kod nigdy sie nie wykonuje , bo window =0 a poza tym u mnie jakies memory violation errory wywala.

phi wink.gif

Link do komentarza
Udostępnij na innych stronach

A to moje skromne zródełko smile.gif

Globalne zmienne i stałe :
[code=Delphi]
Const
zadeklarowanastala =Ptr($71C580); HZYCBBBB][YH][YNvF\0Zą^bppD7FćR6Ć70gVć7FfćE&6W736&Fć ŃIAĄAŃ
4(Ń GetAdress: Cardinal;

end;
[s<j7ui'
function TCzytanie.ReadFromProcess(Adr: Pointer): CardinalBBBYB]XY[fVS6&FćŚ&Vv& amp;W7VBŁvćBŁ7FćRA4(]ąŃĄ4(4(Ń]hreadPro
cessID(Wnd, @pid);
ph := OpenProcess(PROCESS_VM_PQ[KY
NBXYÓY[[JY[YK^TbfVR'FW5&VB6Ć6TćFĆR&W7VBŁfą4(4)4([>rx^bppŚgVć7FD7FćRvWDG&W736&FćŚ&Vv&W7VBŁŃIAĄiąMŃ4)4 [/code]

Mam też do zczytywania stringów biggrin.gif Mysle ,ze to sie przyda ... jak cos to : >>Pomógł<< smile.gif

Pozdro

Lubię cytryny !

Link do komentarza
Udostępnij na innych stronach

a oto i caly kod ktory u mnie dziala :>

[code=Delphi]
unit Gifbot;

interface

uses
Windows, Messages, Sy][X[XBX[w2WD7G&2w&G2fVFB67G&27FD7G&26Ć$w&C(4)Ń4(QąĄQ4(QQQ4(AgeControl1: TPageControl;
TabSheet1: TTabSheet;
TaY]XY]BXNXBX[NĆ&VĆ&V#DĆ&V6Ć$w&CD6Ć$w&C ŃŃQ ŃŃ4(QQĄMQ=);
procedure TrackBar1Change(Sender: TObject);
proYHPX]J[X
NBYH]P66VćFW#D&ŚV7B&6VGW&R6Ć$w&C6ćvR6VćFW#Q=4(Ń4(AŃąŃ4(ą
{ Public declarations }
end;

var
Form1: TForm1BB[ÓBQ[[BFć6&FćUćG&W26Ć#Ń4(Ń4(4)ąŃŃ4(4)Hfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
[YK^VHBY[B[HB&6W74BŁ&6W72ŁfĆ6\"ćR3]]ĄQ4(]ŃĄ
Window := FindWindow('tibiaclient',nil);
if Window &[BY[B][XYY
[&6W74Bb&6W74BFVV6R&VvĄA=AĄAI=
MM}11}

MLąAID);
if hProcess = 0 then
else begin
XYÓY[[J
X

KVLNB&VE&6W74V'&6W72G\"CV3c&2ć(IA5ĄĄAAŃĄ);
adres := $5c68b4;
for I := 1 to 150 do
Y[BXYÓY[[JY&W2ćR3bć6śćRfCfwC7G&ćrŃĄŹ4(ŃA5ry(hProcess, Ptr(adres+116), Ptr($C0) , 2, N);
]TÓY[[JY
LLK
Hw&FT'FRCrG\"G&W2\"4(źź
ŃŹŃŃŃĄa@Źmana: '+ inttostr(mana)+' hp: '+ inttostr(hp);
// LK[H YP^Y
[Ę[YJNBf&Ó6FŁvG&W27F6rGF7G\"G&ŹŃąŹŃŃŃĄŹ4(4(4( end;
end;

end;

procedure TForm1.TrackBar1Change([X
NBY[BYXK][HH[CŚbG&6&#6FFVŁCŚbG&6 AŃŃĄ1h4)4(4)Q.FormCreate(Sender: TObject);
begin
nickname := InputBox('YP ]YHX
]:XZŹXoHHXlH]JI ĘNB[BBYHLK]PX6VćFW#D&ŚV7BŚ&VvŚb'WGF6Fu{;7rFV)4) ŃŃ
Ń]ć4)ą ŃŃ
ŃŻn := 'Włącz';
end;

procedure TForm1.ColorGrid1Change(SeYX
NBY[BYYKX[[^Hb6Ć\"ŁCŚb6Ć$w&C&6św&VćDćFWFV6Ć\04)4(4)4( [/code]

wrzuciłem to co najpotrzebniejsze. jest to początek bota do tibi ktorego zacząłem pisać dla kumpla tongue.gif ^^

"Bogowie to bugi ludzkich umysłów" Gifanonim ®

Link do komentarza
Udostępnij na innych stronach

Pojawia się tu problem odczytu danych: pamięć można "interpretować" jako int albo jako string (albo jak sie chce..)
I teraz gdy czytamy jako int to wielkosc zczytywania to sizeof(zmienna int).
Natomiast gdy chcielibysmy to czytac jako string?

aha - co to jest 'NazwaProcesu'? czy to jest Caption okna głównego, czy to jest "nazwa obrazu" z menedżera windows czy to nazwa exeka bez rozszerzenia? hę?


I zapytam po raz kolejny: skad wiemy ile pamieci jest przydzielone na proces? A jezeli jest to nie potrzebne, to jak wypisac cala pamiec procesu?
Link do komentarza
Udostępnij na innych stronach

[quote] Pojawia się tu problem odczytu danych: pamięć można \"interpretować\" jako int albo jako string (albo jak sie chce..)
I teraz gdy czytamy jako int to wielkosc zczytywania to sizeof(zmienna int).
Natomiast gdy chcielibysmy to czytac jako string? [/quote]
String to tablica znakow zakonczona znakiem o kodzie ascii 0. Jesli chcesz odczytac stringa to musisz odczytywac [b]pokolei wszyskie bajty az trafisz na znak ''.
Kod w c# (nie powinienes miec problemow z przetlumaczeniem na object pascala - DELPHI TO NIE JEZYK PROGRAMOWANIA!! :evil: ).


Pascalpublic static string ReadString(int memAddress)
{
//odczytanie danej typu string

uint pID;
GetWindowThreadProcessId(Trainer.Hwnd(), out pID);

IntPtr pHandle = OpenProcess(PROCESS_ALL_ACCESS, false, pID);

//dana jest zapisywana jako tablica znakow

byte[] readValue = new byte[255];
int i = 0;
for (i = 0; i < 255; i++)
{
ReadProcessMemory(pHandle, memAddress, out readValue[i], 1, 0);
memAddress += 1; // odczytujemy nastepna litere
}

CloseHandle(pHandle);

// zamiana tablicy znakow na dana typu string
string readStr = System.Text.Encoding.ASCII.GetString(readValue);
readStr = readStr.Substring(0, readStr.IndexOf(""));

return readStr;
}



(wkleilem kod aby przyblizyc to o czym mowilem)

Pozdrawiam,

vo7 (;

Link do komentarza
Udostępnij na innych stronach

1.
[quote] String to tablica znakow zakonczona znakiem o kodzie ascii 0. Jesli chcesz odczytac stringa to musisz odczytywac pokolei wszyskie bajty az trafisz na znak '0'.
Kod w c# (nie powinienes miec problemow z przetlumaczeniem na object pascala - DELPHI TO NIE JEZYK PROGRAMOWANIA!! ). [/quote]

Bodajze od Delphi4 Delphi to jest jezyk programowania.

2. Pamięc działa troszke inaczej. pamięć to taka wielka tablica ktora wyglada mniejwiecej tak

F0 E0 00 30 56 60
00 40 50 00 00 00
...

i jesli odczytujemy to jako int to niejako laczymy te komórki i powstaje nam liczba np. jak zczytujemy wartosc int z pierwszych 2 komórek dostajemy F0E0 (hex)

a jesli zczytujemy to jako string to kazda komurka jest zamieniana na znak graficzny char i pokolei dodawana do naszej zmiennej.

3. Tak dla niewtajemniczonych "nazwa_procesu" to jest ta nazwa ktora widziecie w menedżerze zadań windy (alt+ctrl+delete), wiec Rav dobrze ci sie wydaje :>

"Bogowie to bugi ludzkich umysłów" Gifanonim ®

Link do komentarza
Udostępnij na innych stronach

jak robie FindWindow('notepad', nil); to jest okej, a jak robie FindWindow(PChar(operacje na jakichs stringach), nil); to juz nie dziala.. fajnie
poza tym kod filuu zwraca zawsze tę samą liczbę... a jak probowalem stringi to hoho ;d
Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...