Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Speicher von fremden Programm ...... (https://www.delphipraxis.net/144079-speicher-von-fremden-programm.html)

GOOFY009 29. Nov 2009 17:55


Speicher von fremden Programm ......
 
auf eigene Procedure "umbiegen".

Hallo !

Ich habe das Topic mal hier rein gestellt. Falls es in dieser Rubrik falsch ist, bitte einfach verschieben.

Zum Problem :

Ich bin zur Zeit dabei einen C++ Code nach Delphi zu portieren und hatte hier vom Forum
schon einige Hilfe dafür bekommen (Delphi für Win32
D3D9 Hook bzw. als "proxy.dll"
.

Nun stehe ich vor einem neuen Problem. Hier erst einmal der C++ Source (in gekürzter Fassung) :
Delphi-Quellcode:
void InsertCodeCave()
{
   DWORD dwWritten;
   DWORD_PTR temp;
   unsigned char buf;

      buf = 0xe8;
      WriteProcessMemory(procHandle, (LPVOID)0xb1b5d3, &buf, 1, &dwWritten);
      temp = ((DWORD_PTR)asmCurrentIsland) - (0xb1b5d3 + 5);

}

void asmCurrentIsland()
{
   _asm mov ecx,[esi+0x20]
   _asm lea eax,[esi+0x20]
   _asm mov curIsland, edi
}
Ich habe ehrlich gesagt keinen "Dunst" wie ich das in Delphi umsetzten soll. Ich habe auch schon jede Menge über
WriteProcessMemory und ReadProcessMemory gelesen und das war auch soweit klar.

Aber hier wird wohl eine Sprungadresse und die eigen Procedure ins Ram kopiert und da steig ich momentan nicht durch.
Wer also eine Lösung parat hätte... immer her damit :wink:

Danke und CU
GOOFY

brechi 29. Nov 2009 18:09

Re: Speicher von fremden Programm ......
 
Du musst dir ne DLL schreiben und dann diese in den Prozess injezieren. (Suche: InjectLibrary)
Wenn die DLL dann im Speicher ist kannst du den OrignalCode mittels WriteProcessMemory (bzw direkt über Pointer) abändern.

In delphi kannst du den Assemblercode mit ASM END; nachbilden.
So wie es aussieht wird ein realitver Jump ($e8) gesetzt der dann zu deinem Code springt.

Ich glaube aber eher, dass du auch direkt das CurIsland auslesen aknnst (aus dem Speicher) ohne Code injezieren zu müssen. Sofern du nur Daten auslesen willst und nicht verändern willst.

himitsu 29. Nov 2009 18:14

Re: Speicher von fremden Programm ......
 
Delphi-Quellcode:
temp = Pointer(Integer(@asmCurrentIsland) - ($B1B5D3 + 5));

procedure asmCurrentIsland;
asm
  mov ecx, [esi+$20]
  lea eax, [esi+$20]
  mov curIsland, edi
end;
der Rest sollte einfacht sein ... es wird einfach nur ein Byte ( $E8 ) an eine bestimmte Stelle geschrieben.

brechi 29. Nov 2009 18:18

Re: Speicher von fremden Programm ......
 
wenn schon: $b1b5d3 :)
Naja, es wird ein gekürzter Code sein...
Es macht doch nur sinn Wenn auch noch Temp geschrieben wird (nach dem $E8) -> die Berechnung ist ja ein relativer Jump. Der überschriebene Code wird wohl das mov und lea sein. Und irgendwie muss der dann ja auch wieder zurückspringen.

GOOFY009 29. Nov 2009 19:36

Re: Speicher von fremden Programm ......
 
Hi !

Danke an alle, für die schnellen Antworten !

Delphi-Quellcode:
temp = Pointer(Integer(@asmCurrentIsland) - ($B1B5D3 + 5));
Das hatte mir noch gefehlt und außerdem hatte ich die asmCurrentIsland Prozedure (anscheinend durchs viele Testen)
doppelt im Source. Einmal in meiner Klasse und einmal als globale Procedure, was letztlich auch einen falschen Rückgabewert
ergab.

Jetzt ist dieses Problem auch gelöst und weiter gehts.....

Danke nochmal an alle die geholfen haben.

CU GOOFY


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