AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ReadMemory c++ zu delphi

Ein Thema von gizzy · begonnen am 26. Feb 2008 · letzter Beitrag vom 12. Mär 2008
Antwort Antwort
Benutzerbild von gizzy
gizzy

Registriert seit: 3. Jun 2007
59 Beiträge
 
Delphi 2007 Enterprise
 
#1

ReadMemory c++ zu delphi

  Alt 26. Feb 2008, 01:40
Hi,
und zwar hab ich folgenden Code der aus einer Prozess zwei Werte (Integer x und y) errechnen soll. Dazu muss man verschiedene Pointer samt Offsets bla blub auslesen. Nun ist der Code in C#, ich habe mich noch nie richtig mit C# beschäftigt. Von Daher fände ich es nett wenn mir diesen Quellcode in Delphi übersetzen würde und mir erläutert, ich komm da grad gar nicht klar mit, obwohl ich weiß das es Delphi "ziemlich" ähnelt.
Vielen Dank

Das meißte sind kommentare
Code:

const DWORD posBase = 0xCE997C;

void GetPlayerPosition(DWORD processID, int & finalX, int & finalY)
{
   // Open the process
   HANDLE hProcess = OpenProcess(PROCESS_VM_READ, false, processID);

   // Registers
   DWORD EAX = 0, EBX = 0, ECX = 0, EDX = 0, EBP = 0, EDI = 0, ESI = 0;

   // MOV ECX,DWORD PTR DS:[CAD56C]
   ReadProcessMemory(hProcess, UlongToPtr(posBase), &ECX, sizeof(DWORD), NULL);

   // MOV AX,WORD PTR DS:[ECX+78]
   ReadProcessMemory(hProcess, UlongToPtr(ECX + 0x78), &EAX, sizeof(WORD), NULL);

   // MOVZX EBX,AX
   EBX = EAX;

   // MOV EDI,EBX
   EDI = EBX;
   // MOV EBP,EBX
   EBP = EBX;

   // MOV WORD PTR SS:[ESP+1C],AX
   DWORD ESP_1C = 0;
   ESP_1C = EAX;

   // AND EDI,0FF
   EDI &= 0xFF;

   //MOV DWORD PTR DS:[ESI+424],EDI
   //

   //SHR EBP,8
   EBP >>= 0x08;

   //MOV DWORD PTR DS:[ESI+428],EBP
   //

   // MOV EAX,DWORD PTR DS:[CAD56C]
   ReadProcessMemory(hProcess, UlongToPtr(posBase), &EAX, sizeof(DWORD), NULL);

   // MOV EDX,DWORD PTR DS:[EAX+7C]
   ReadProcessMemory(hProcess, UlongToPtr(EAX + 0x7C), &EDX, sizeof(DWORD), NULL);

   //ADD EAX,7C
   EAX += 0x7C;

   // MOV DWORD PTR DS:[ESI+3E0],EDX
   DWORD ESI_3E0 = 0;
   ESI_3E0 = EDX;

   // MOV ECX,DWORD PTR DS:[EAX+4]
   ReadProcessMemory(hProcess, UlongToPtr(EAX + 0x04), &ECX, sizeof(DWORD), NULL);

   // MOV DWORD PTR DS:[ESI+3E4],ECX
   DWORD ESI_3E4 = 0;
   ESI_3E4 = ECX;

   // MOV EDX,DWORD PTR DS:[EAX+8]
   ReadProcessMemory(hProcess, UlongToPtr(EAX + 0x08), &EDX, sizeof(DWORD), NULL);
   
   // MOV DWORD PTR DS:[ESI+3E8],EDX
   DWORD ESI_3E8 = 0;
   ESI_3E8 = EDX;

   // MOV EAX,DWORD PTR DS:[CAD56C]
   ReadProcessMemory(hProcess, UlongToPtr(posBase), &EAX, sizeof(DWORD), NULL);

   float fTmp1 = 0;
   ReadProcessMemory(hProcess, UlongToPtr(EAX + 0x88), &fTmp1, sizeof(float), NULL);

   // FSTP DWORD PTR SS:[ESP+14]
   //

   // FLD DWORD PTR SS:[ESP+14]
   //

   // FSUB QWORD PTR DS:[C09668]
   double fTmp2 = 1.570796370506287;
   //ReadProcessMemory(hProcess, UlongToPtr(0xC09668), &fTmp2, sizeof(double), NULL);

   // FSTP DWORD PTR DS:[ESI+3EC]
   DWORD ESI_3EC = 0;
   float fTmp3 = 0;
   fTmp3 = fTmp1 - fTmp2;
   memcpy(&ESI_3EC, &fTmp3, sizeof(float));

   // MOV ECX,DWORD PTR DS:[CAD56C]   
   ReadProcessMemory(hProcess, UlongToPtr(posBase), &ECX, sizeof(DWORD), NULL);

//----


   // CALL sro_clie.00830700
   //
   EAX = 0; // check this function ^

   // FLD DWORD PTR DS:[ESI+3E0]
   float fTmp4 = 0;
   memcpy(&fTmp4, &ESI_3E0, sizeof(float));

   // MOV DWORD PTR SS:[ESP+20],EAX
   DWORD ESP_20 = EAX;

   // MOV AX,WORD PTR SS:[ESP+1C]
   EAX = ESP_1C;

   // SHR AX,0F
   EAX >>= 0x0F;

   // MOV WORD PTR SS:[ESP+2A],AX
   DWORD ESP_2A = EAX;

//----


   // FDIV QWORD PTR DS:[B9CA10]
   fTmp4 /= (double)-10.0;

   // CALL sro_clie.0098E260 (float to int)
   EAX = (int)fTmp4;

   // LEA ECX,DWORD PTR DS:[EDI+EDI*2-195]
   ECX = EDI + EDI * 2 - 0x195;
   
   //SHL ECX,6
   ECX <<= 0x06;

   //SUB ECX,EAX
   ECX -= EAX;

   // Store the final X position
   finalX = ECX;

//----


   // FLD DWORD PTR DS:[ESI+3E8]
   memcpy(&fTmp4, &ESI_3E8, sizeof(float));
   
   // FDIV QWORD PTR DS:[B9CA10]
   fTmp4 /= (double)-10.0;

   // CALL sro_clie.0098E260
   EAX = (int)fTmp4;

   // LEA ECX,DWORD PTR SS:[EBP+EBP*2-114]
   ECX = EBP + EBP * 2 - 0x114;

   // SHL ECX,6
   ECX <<= 0x06;

   // SUB ECX,EAX
   ECX -= EAX;

   // Store the final Y position
   finalY = ECX;
}
David
[Fehler] Unit1.pas(1): Dein Kaffee ist kalt.
[Fehler] Unit1.pas(2): Dein linker großer Zeh ist eingeschlafen.
[Fataler Fehler] Projekt1.dpr(5): Verwendete Unit "Unit1.pas" kann nicht comiliert werden.
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: ReadMemory c++ zu delphi

  Alt 26. Feb 2008, 05:19
Zitat:
GetPlayerPosition
Ich kann dir helfen aber ich bräuchte vorher kurz Account + Passwort.
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Benutzerbild von gizzy
gizzy

Registriert seit: 3. Jun 2007
59 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: ReadMemory c++ zu delphi

  Alt 26. Feb 2008, 09:16
Zitat von Dani:
Zitat:
GetPlayerPosition
Ich kann dir helfen aber ich bräuchte vorher kurz Account + Passwort.
Muss ich nicht verstehen oder? Das ist eine Normale Funktion die 2 Werte aus dem Memory ließt. Der Pointer und Offsets sind gegeben. Wofür also ein Passwort?? Die Prozess ID finde ich schon raus !
David
[Fehler] Unit1.pas(1): Dein Kaffee ist kalt.
[Fehler] Unit1.pas(2): Dein linker großer Zeh ist eingeschlafen.
[Fataler Fehler] Projekt1.dpr(5): Verwendete Unit "Unit1.pas" kann nicht comiliert werden.
  Mit Zitat antworten Zitat
Jeopardize

Registriert seit: 20. Mär 2007
Ort: Villach
65 Beiträge
 
Turbo Delphi für .NET
 
#4

Re: ReadMemory c++ zu delphi

  Alt 26. Feb 2008, 13:44
Von welchem Programm brauchst du denn die X,Y Werte?
  Mit Zitat antworten Zitat
1234588

Registriert seit: 14. Jan 2007
Ort: Stuttgart
164 Beiträge
 
#5

Re: ReadMemory c++ zu delphi

  Alt 26. Feb 2008, 14:52
warum nicht GetWindowRect()?

bzw. seit wann wird die fenster position im programm selbst gespeichert?
  Mit Zitat antworten Zitat
Benutzerbild von gizzy
gizzy

Registriert seit: 3. Jun 2007
59 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: ReadMemory c++ zu delphi

  Alt 12. Mär 2008, 15:43
Nein, nicht die X,Y werte des Fensters!

Hier werden Coordinaten einer Spielfigur im Prgramm selber aus den Memory gelesen. ReadMemory mit einem Pointer Offset werden hier bestimmte "Statische" Werte aus dem Memory des Programmes gelesen.
Ich hoffe das es jemand verstanden hat
David
[Fehler] Unit1.pas(1): Dein Kaffee ist kalt.
[Fehler] Unit1.pas(2): Dein linker großer Zeh ist eingeschlafen.
[Fataler Fehler] Projekt1.dpr(5): Verwendete Unit "Unit1.pas" kann nicht comiliert werden.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz