AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Code-Injection JMP Adresse ermitteln...

Delphi Code-Injection JMP Adresse ermitteln...

Ein Thema von xice · begonnen am 20. Mai 2009 · letzter Beitrag vom 18. Jun 2009
Antwort Antwort
xice

Registriert seit: 29. Apr 2009
6 Beiträge
 
#1

Delphi Code-Injection JMP Adresse ermitteln...

  Alt 20. Mai 2009, 14:48
Hallo !

Ich versuche eine Art Code-Injection zu programmieren.
Mein Problem ist nun die Sprungstelle zum Code-Cave
Die Adresse stimmt nicht mit der zugewiesenen überein.

Die Sprungadresse müsste z.B.: $080C0000 lauten. Ich kriege aber $0046e1a0

Mach ich was falsch ? Bin für jede Hilfe dankbar!

Delphi-Quellcode:
var mem :Pointer;

...

procedure Inject;
begin
  asm
    push mem <-- Sprungstelle zum Code-Cave ... Adresse wird weiter unten im Quelltext ermittelt
    ret
    nop
  end;
end;

procedure Code_Cave;
begin
  asm
    mov [edi+04],00000001
    fcom dword ptr [edi+04]
    add esp,08
    fnstsw ax
    push $006C37C2
    ret
  end;
end;

procedure Test;
var process,PID:Cardinal;
    wbyte:DWORD;
begin
  PID:=GetPID('Anwendung');
  process := OpenProcess(PROCESS_ALL_ACCESS,false,PID);

 // Speicher anfordern
  mem := VirtualAllocEx(process, nil,19,MEM_COMMIT,PAGE_EXECUTE_READWRITE);

 //-- Schreibe in mem
  WriteProcessMemory(process,mem,@Code_Cave,19, wbyte);

 //-- Überschreibe vorhanden Code durch ein sprung zum Code-Cave
  WriteProcessMemory(process,ptr($006C37C2),@Inject,8, wbyte);

// VirtualFreeEx(process,mem,0,MEM_RELEASE);
  CloseHandle(process);
end;
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Delphi Code-Injection JMP Adresse ermitteln...

  Alt 20. Mai 2009, 20:02
Das kann nicht funktionieren.
Delphi-Quellcode:
procedure Inject;
begin
  asm
    push mem <-- Sprungstelle zum Code-Cave ... Adresse wird weiter unten im Quelltext ermittelt
    ret
    nop
  end;
end;
Das bedeutet nicht, daß da mem durch die Adresse die in mem steht getauscht wird. Dazu müsste sich der Code selbst modifizieren zur Laufzeit. Stattdessen wird daraus:
Delphi-Quellcode:
push dword ptr [Adresse von mem]
ret
nop
Da an der Adresse im fremden Prozess aber irgendetwas steht nur wahrscheinlich nicht die Adresse der Code Cave, wird entsprechend der falsche Wert gelesen und auf den Stack gepackt .

Lösung: Mach Inject zu nem Byte Array. In das packst die korrekten Opcodes (Intel Manual) und die korrekte Adresse zu der gesprungen werden soll und schreibst das Byte Array in den Zielprozess.
Fridolin Walther
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#3

Re: Delphi Code-Injection JMP Adresse ermitteln...

  Alt 21. Mai 2009, 13:09
Delphi-Quellcode:
  TJmpCode = packed record
    bPush: Byte;
    pAddr: Pointer;
    bRet : Byte;
  end;
mit

Delphi-Quellcode:
  JumpCode.bPush := $68;
  JumpCode.bRet := $C3;
  JumpCode.bAddr := // Deine addresse
und WriteProcessMemory(.. jmpCode, SizeOf(TJmpCode)) sollte helfen
  Mit Zitat antworten Zitat
xice

Registriert seit: 29. Apr 2009
6 Beiträge
 
#4

Re: Delphi Code-Injection JMP Adresse ermitteln...

  Alt 21. Mai 2009, 22:35
Dank eurer Lösung hab ich das Problem gelöst.

Ich hätte da noch gewusst, ob es eine Möglichkeit gibt,
die Größe der Code_Cave Procedure zu ermitteln,
damit ich mit VirtualAllocEx soviel Speicher reservieren kann, wie Code_Cave umfasst ?

Mein jetziger Ansatz ist:

Delphi-Quellcode:
//--Code_Cave SIZE
size := DWORD(@Code_Cave) - DWORD(@Inject);
Damit erhalte ich 16 Bytes, was zu wenig ist, denn ich brauche 19.
Wo sind die restlichen 3 Bytes ?

Danke.
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Delphi Code-Injection JMP Adresse ermitteln...

  Alt 21. Mai 2009, 22:50
Ich bin mir grade nicht so sicher, ob man davon ausgehen kann, daß die Funktionen im Kompilat in exakt der Reihenfolge vorliegen wie im Source und nicht durch andere Funktionen unterbrochen sind. Darauf würdest Du Dich in Deinem Falle ja verlassen. Aber angenommen, das man davon ausgehen kann, ist Deine Berechnung falsch:

Inject ist vor Code_Cave definiert (liegt also auch im Speicher vor Code_Cave). So wäre der Abstand zw. Code_Cave und Inject die größe von Inject, nicht von Code_Cave. Dort kommen 16 Bytes auf Grund des Alignments durchaus hin. Du müsstest den Abstand zw. Test und Code_Cave berechnen um die Größe von Code_Cave zu erhalten.
Fridolin Walther
  Mit Zitat antworten Zitat
xice

Registriert seit: 29. Apr 2009
6 Beiträge
 
#6

Re: Delphi Code-Injection JMP Adresse ermitteln...

  Alt 21. Mai 2009, 23:03
Stimmt, die Berechnung war falsch.
Die Reihenfolge scheint sich wohl nicht zu ändern.

Aber mit der Korrektur erhalte ich nun 24 Bytes, also 5 zuviel.
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Delphi Code-Injection JMP Adresse ermitteln...

  Alt 21. Mai 2009, 23:17
Den exakten Wert wirst Du so wahrscheinlich eher nicht errechnen auf Grund des Alignments, außer natürlich es fällt zufällig auf eine Alignmentgrenze. Allerdings sollte es nicht wirklich ein Problem sein die Padding Bytes mit zu kopieren.
Fridolin Walther
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Delphi Code-Injection JMP Adresse ermitteln...

  Alt 22. Mai 2009, 11:01
Mit VirtualAllocEx kannst du sowieso nur Vielfache von 4096 Byte (das ist normalerweise die Speicherseitengröße) reservieren - eigentlich kannst du dir den Aufwand also sparen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
xice

Registriert seit: 29. Apr 2009
6 Beiträge
 
#9

Re: Delphi Code-Injection JMP Adresse ermitteln...

  Alt 24. Mai 2009, 22:23
Danke nochmal für die Informationen.
Ich hab da noch ein kleines Problem.

Wie kann ich aus diesem ASM-Code

mov [edi+04],00000001 eine variable Wertübergabe machen ?

mov [edi+04],Variable
  Mit Zitat antworten Zitat
xice

Registriert seit: 29. Apr 2009
6 Beiträge
 
#10

Re: Delphi Code-Injection JMP Adresse ermitteln...

  Alt 18. Jun 2009, 15:53
Zitat von xice:
Danke nochmal für die Informationen.
Ich hab da noch ein kleines Problem.

Wie kann ich aus diesem ASM-Code

mov [edi+04],00000001 eine variable Wertübergabe machen ?

mov [edi+04],Variable
Problem gelöst...

Delphi-Quellcode:
type TData=packed record
   b1:array [0..2] of Byte;
    s:single;
end;
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 10:19 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