Thema: Delphi Offset bei AllocMem?

Einzelnen Beitrag anzeigen

Plastewolf
(Gast)

n/a Beiträge
 
#8

AW: Offset bei AllocMem?

  Alt 21. Sep 2013, 21:09
Ich glaube ich habe das noch nicht zu 100% verstanden.

Delphi-Quellcode:
procedure Grafikspeicher();
var
  Offset : String;
  Memory : Pointer;
  OldProtect : Cardinal;

begin
   Memory := AllocMem(16777216);
  try
    Offset := IntToHex(DWord(Memory), 8);
    VirtualProtect('$0042053E', 4, PAGE_EXECUTE_READWRITE, OldProtect);
    PDWord($0042053E)^ := PDWORD(Offset)^;
  finally
    FreeMem(Memory);
    Showmessage('Es ist ein Fehler aufgetreten. Bitte starten Sie den Computer neu!');
  end;
end;
Der Bereich 0042053E-0042053F enthält das Offset zu der ersten Adresse. Ohne das VP spuckt er zwar keinen Fehler aus, änderte allerdings noch während der parallelen Überwachung mit OllyDbg nicht den gewünschten Bereich. Wenn ich es mit der VirtualProtect Variante versuche sagt er mir nur das es keine überladene Version geben würde, was unzweifelhaft daran liegt das ich den Pointer falsch übergeben habe. Vielleicht kann man den gesamten Bereich des Programmes von anfang an auf RW setzen?



Edit:

Ich habe gerade Bemerkt das es scheinbar doch funktioniert, es gab ein Problem mit dem Injector. Jedoch kommt nach der Injection eigentlich nur Datenmüll heraus, da er auf das Offset MOV EDX,37E170 schreibt, welches den Direct3D Header initialisiert.

Edit2:

Also ich hatte mich bei dem Offset verrechnet. Das korrekte Offset lautete "0042053C - 0042053F". Wenn ich des jetzt über PDword schreiben lasse kommt folgendes heraus: "MOV EDX,00450037". Obwohl der Rückgabewert für den neuen Speicher hier liegen müsste: "7EEA0010". Ich finde irgentwie den Fehler nicht...

Edit3:

Alles klar ich habe das Problem nun selbst gelöst. Mein Ansatz war falsch, ich hätte mich nie auf den String Wert Offset beziehen dürfen sondern direkt den DWORD Wert von Memory nehmen sollen. Jetzt sollte es Funktionieren. Fraglich ist aber warum er die Messagebox aus dem Finally bereich auslöst.

Vielen Dank nochmals für deine Hilfe!


Edit 4:

Das Problem ist doch noch nicht so gelöst wie ich es gerne hätte
Er reserviert zwar augenscheinlich Arbeitsspeicher und übergibt die Offset, welche jetzt auch korrekt geschrieben wird, aber wie sich gerade Rausstellt gibt es keinen freien Speicher auf der übergebenen Adresse. Irgentwie ist das übergebene Offset auch immer das gleiche, müsste das sich nicht eigentlich bei jedem Start ändern?

Geändert von Plastewolf (21. Sep 2013 um 22:30 Uhr)
  Mit Zitat antworten Zitat