AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Delphi WriteProcessMemory mit Offsets zum Pointer
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi WriteProcessMemory mit Offsets zum Pointer

Offene Frage von "infY2k7"
Ein Thema von infY2k7 · begonnen am 21. Mai 2008 · letzter Beitrag vom 21. Mai 2008
Antwort Antwort
Seite 2 von 2     12   
Nuclear-Ping
(Gast)

n/a Beiträge
 
#11

Re: Delphi WriteProcessMemory mit Offsets zum Pointer

  Alt 21. Mai 2008, 13:22
Delphi-Quellcode:
procedure p_memorywrite(value,size:integer;adresse:dword);
begin
    GetMem(buf,1);
    ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
    HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
    try
      buf^ := Chr(value);
      WriteProcessMemory(HandleWindow,ptr(adresse),buf,size,write);
    finally
      FreeMem(buf);
      closehandle(HandleWindow);
    end;
end;
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#12

Re: Delphi WriteProcessMemory mit Offsets zum Pointer

  Alt 21. Mai 2008, 13:26
oha.

Sagen wir es mal so - Dein Code hat gewisse Entfaltungsmöglichkeiten. Ich werde ihn Dir nicht neu schreiben, habe aber ein paar Anregungen:

- Wo kommen "WindowName" und "ProcessId" her? Globale Variablen sind i.a. "pfui".
- Wenn Du eine Funktion wie "GetWindowThreadProcessId" oder "openProcess" aufrufst, muss Du immer damit rechnen, dass diese Funktionen fehlschlagen. Also das Ergebnis dieser Funktionen prüfen, ob ein Fehlercode geliefert wurde. (Google: msdn + {funktionsname} führt Dich zur Doku)
- "Chr(value)" versucht, den in Value enthaltenen Wert in den Datentyp Character zu pressen. Die klassischen Charakters konnten aber nur Werte bis 255 - Dein Value, vom Typ intger, kann deutlich mehr. Was passiert bei größeren Werten? Das solltest Du berücksichtigen. In Zeiten von Unicode ist ein Zeichen nicht mehr unbedingt ein Byte lang. Du reservierst ein Byte an Speicher, schreibst aber u.U. deutlich mehr in diesen Bereich und verletzt damit umliegende Bereiche.

Nur so auf die Schnelle.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
infY2k7

Registriert seit: 21. Mai 2008
23 Beiträge
 
#13

Re: Delphi WriteProcessMemory mit Offsets zum Pointer

  Alt 21. Mai 2008, 13:32
der code von nuclear läuft schonmal!
aber eine frage habe ich trotzdem noch: kann ich diese funktion genauso übernehmen, bloß mit readprocessmemory?
für die, die nicht genau wissen, was ich meine hier mal ein bild:

http://1337files.13.funpic.de/ce.jpg

der pointer ist hier:00903804
offsets:+20+450
pointet zur adresse 053080c0
den wert, der dann in dieser adresse ist, möchte ich auslesen!
mfg infy
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#14

Re: Delphi WriteProcessMemory mit Offsets zum Pointer

  Alt 21. Mai 2008, 13:37
Zitat von infY2k7:
aber eine frage habe ich trotzdem noch: kann ich diese funktion genauso übernehmen, bloß mit readprocessmemory?
Was hält Dich davon ab, es zu probieren?
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Delphi WriteProcessMemory mit Offsets zum Pointer

  Alt 21. Mai 2008, 13:37
du musst den Quelltext verstehen! Dann weißt du auch ob es mit ReadProcessMemory funktioniert. Es macht absolut keinen Sinn das du Quelltext verwendest ohne zu wissen was da genau passiert. Dabei lernst du rein gar nichts. Nur wenn du den Quelltext auch verstehst kann am Ende was sinnvolles dabei raus kommen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
infY2k7

Registriert seit: 21. Mai 2008
23 Beiträge
 
#16

Re: Delphi WriteProcessMemory mit Offsets zum Pointer

  Alt 21. Mai 2008, 13:42
hast recht, das wars also ersmal bis hier, den rest krieg ich schon irgendwie hin!
danke für eure hilfe mfg infy
  Mit Zitat antworten Zitat
infY2k7

Registriert seit: 21. Mai 2008
23 Beiträge
 
#17

Re: Delphi WriteProcessMemory mit Offsets zum Pointer

  Alt 21. Mai 2008, 15:42
Zitat von Daniel:
Naja, mit Deinem Beispiel aus dem ersten Beitrag bist Du doch schon recht weit.

Also: Eine neue Variable muss her, vom Typ DWORD (LongWord). Und dann kannst Du einfach zuweisen und rechnen: myVariable:= $9451524 + $20. In Deinem Code ersetzt Du dann die Konstante durch myVariable und gut is'.

Dann würde ich Dir raten, das Ganze in einer Funktion zu verpacken und die gewünschte Adresse als Parameter zu übergeben.

Wenn Du nicht genau weißt, wie Du Variablen deklariert oder Funktionen erstellst, dann empfehle ich http://www.delphi-treff.de/tutorials...-fange-ich-an/.

Hab das mit write und read memory nun halbwegs hinbekommen! Aber: wenn ich nun $00903804+$20 rechnen lasse, dann kommt raus 9451556! jedoch ist das mehr oder weniger sinnlos, da ein pointer ja zu einer adresse zeigt, die sich ständig ändert, jedoch würde diese adresse immer gleich sein!
bei meinem problem zeigt der pointer $00903804 mit dem offset $20 auf die adresse 0320ADD8(siehe bild)
http://1337files.13.funpic.de/ce.jpg
was ich brauche, wäre also eine funktion in delphi, die das mit den pointern geregelt kriegt. zum vergleich,
in autoit sah die funktion so aus:

Delphi-Quellcode:
Func _MemoryPointerRead ($iv_Address, $ah_Handle, $av_Offset, $sv_Type = 'dword')
   
   If IsArray($av_Offset) Then
      If IsArray($ah_Handle) Then
         Local $iv_PointerCount = UBound($av_Offset) - 1
      Else
         SetError(2)
         Return 0
      EndIf
   Else
      SetError(1)
      Return 0
   EndIf
   
   Local $iv_Data[2], $i
   Local $v_Buffer = DllStructCreate('dword')
   
   For $i = 0 to $iv_PointerCount
      
      If $i = $iv_PointerCount Then
         $v_Buffer = DllStructCreate($sv_Type)
         If @Error Then
            SetError(@Error + 2)
            Return 0
         EndIf
         
         $iv_Address = '0x' & hex($iv_Data[1] + $av_Offset[$i])
         DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
         If @Error Then
            SetError(7)
            Return 0
         EndIf
         
         $iv_Data[1] = DllStructGetData($v_Buffer, 1)
         
      ElseIf $i = 0 Then
         DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
         If @Error Then
            SetError(7)
            Return 0
         EndIf
         
         $iv_Data[1] = DllStructGetData($v_Buffer, 1)
         
      Else
         $iv_Address = '0x' & hex($iv_Data[1] + $av_Offset[$i])
         DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
         If @Error Then
            SetError(7)
            Return 0
         EndIf
         
         $iv_Data[1] = DllStructGetData($v_Buffer, 1)
         
      EndIf
      
   Next
   
   $iv_Data[0] = $iv_Address
   
   Return $iv_Data

EndFunc
ist also doch nicht so leicht, wie ich dachte! bitte um hilfe, mfg infy
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 13:24 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