Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ReadMemory c++ zu delphi (https://www.delphipraxis.net/109202-readmemory-c-zu-delphi.html)

gizzy 26. Feb 2008 01:40


ReadMemory c++ zu delphi
 
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;
}

Dani 26. Feb 2008 05:19

Re: ReadMemory c++ zu delphi
 
Zitat:

GetPlayerPosition
Ich kann dir helfen aber ich bräuchte vorher kurz Account + Passwort. :roll:

gizzy 26. Feb 2008 09:16

Re: ReadMemory c++ zu delphi
 
Zitat:

Zitat von Dani
Zitat:

GetPlayerPosition
Ich kann dir helfen aber ich bräuchte vorher kurz Account + Passwort. :roll:

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 ;)!

Jeopardize 26. Feb 2008 13:44

Re: ReadMemory c++ zu delphi
 
Von welchem Programm brauchst du denn die X,Y Werte?

1234588 26. Feb 2008 14:52

Re: ReadMemory c++ zu delphi
 
warum nicht GetWindowRect()?

bzw. seit wann wird die fenster position im programm selbst gespeichert?

gizzy 12. Mär 2008 15:43

Re: ReadMemory c++ zu delphi
 
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 :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:59 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