AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Procedure umbiegen

Ein Thema von mr_emre_d · begonnen am 25. Jan 2009 · letzter Beitrag vom 28. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
mr_emre_d
(Gast)

n/a Beiträge
 
#1

Procedure umbiegen

  Alt 25. Jan 2009, 21:38
Hiho liebes Community,

Ich versuche gerade seit ein paar Stunden eine Procedure (MessageBox)
so umzubiegen, dass zuerst eine von mir definierte Procedure aufgerufen
(hingejumpt) wird und anschließend wieder nach Beendigung der Procedure
zurück zu der eigentlichen Procedure gejumpt wird.

Das Problem liegt nun darin, dass die Adresse, wohin gejumpt werden soll,
nicht richtig übergeben wird :S

Delphi-Quellcode:
// umbiegen
var
  pMSG: Pointer;
  dw: DWord;
  dwOldProtect: DWord;
  Buffer: Pointer;
begin
  Buffer := Nil;
  GetMem(Buffer, 5); // jmp = 1byte, adr = 4 byte ..
  Byte(Buffer^) := Jmp; //Jmp = $E9
  dw := Integer(@DOIT); // DoIt = eigene Procedure ..
  Cardinal(Pointer(Integer(Buffer)+1)^) := dw; // $0045218c -> wird verkehrt rum reingeschrieben ..
  pMsg := GetProcAddress( GetMOduleHandle('user32.dll'), 'MessageBoxA' );
  VirtualProtect( pMsg, 5, PAGE_EXECUTE_READWRITE, dwOldProtect );
  WriteProcessMemory( OpenProcess(PROCESS_ALL_ACCESS, False, GetCurrentProcessID),
    pMsg, Buffer, 5, dw );
  VirtualProtect( pMsg, 5, dwOldProtect, dwOldProtect );
  FreeMem(Buffer, 5);
Wenn ich nach dem Aufruf von WriteProcessMemory in die CPU - Ansicht (strg+alt+c) wechsle,
sehe ich folgendes in der MessageBox Procedure:
E98C214500 jmp $776d7870

Anscheinend wurde es richtig "umgebogen" aber warum heißts bitte nun
$776d7870 und nicht $0045218C

MfG
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Procedure umbiegen

  Alt 25. Jan 2009, 22:16
Umgekehrt ist völlig richtig. Das nennt man Little Endian. Und passt schon.

Dein Fehler liegt im OpCode E9. Das ist ein relativer Sprung. Das heißt du gibst nicht die absolute Adresse sondern die relative Adresse an (also die Differenz). Rechne einfach die Differenz aus oder such den absoluten Sprung. Das waren irgendwie 2 Bytes (FF20 oder so)

Edit:
FAR JMP: "FF25"
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#3

Re: Procedure umbiegen

  Alt 25. Jan 2009, 22:37
hmm thx

Nun scheint die Adresse richtig eingetragen zu werden

Aber das Problem besteht immernoch

Delphi-Quellcode:
USER32.MessageBoxA:
772856DF FF258C214500 jmp dword ptr [$0045218c] //hier müsste er doch "sauber" hinspringen oder ?
772856E5 90 nop
:S
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#4

Re: Procedure umbiegen

  Alt 25. Jan 2009, 22:49
Delphi-Quellcode:
Var OldMSG: Function(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; StdCall;

Function NewMSG(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; StdCall;
  Var S: AnsiString;

  Begin
    S := 'Test: ' + lpCaption;
    Result := OldMSG(hWnd, lpText, PAnsiChar(S), uType);
  End;

Procedure TForm1.FormCreate(Sender: TObject);
  Var pMSG: PAnsiChar;
    dwOldProtect, dw: DWORD;
    JumpRec: packed Record
      mov: Byte;
      addr: Pointer;
      jmp: Word;
    End;

  Begin
    pMsg := @MessageBoxA;
    OldMSG := PPointer(PPointer(pMsg + 2)^)^;

    JumpRec.mov := $B8;
    JumpRec.addr := @NewMSG;
    JumpRec.jmp := $E0FF;

    VirtualProtect(pMsg, SizeOf(JumpRec), PAGE_EXECUTE_READWRITE, dwOldProtect);
    WriteProcessMemory(OpenProcess(PROCESS_ALL_ACCESS, False, GetCurrentProcessID),
      pMsg, @JumpRec, SizeOf(JumpRec), dw);
    VirtualProtect(pMsg, SizeOf(JumpRec), dwOldProtect, dw);

    MessageBoxA(0, 'der Text', 'Die Caption', MB_OK);
  End;
die genaue Definition für FarJump fiel mir grad nicht ein, aber so geht's auch
jupp, $E9 = NearJump ... man könnte da natürlich auch (in gewissen Grenzen) die Differenz berechnen und doch per $E9 springen

[add]
PS:
Delphi-Quellcode:
dw := Integer(@DOIT);
Cardinal(Pointer(Integer(Buffer)+1)^) := dw;

// entspricht:

PPointer(Integer(Buffer)+1)^ := @DOIT;
warum einfach, wenn's auch kompliziert geht
außerdem lag die (erste) Adresse bei +2 und nicht +1
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#5

Re: Procedure umbiegen

  Alt 25. Jan 2009, 23:10
zu deinem PS:

ich habe dw nur deshalb deklariert, weil ich mir die Werte anschauen wollte

Ansonsten - Dein Code funzt ... mysteriöserweise :S

PS:
ok irgendwie ists wirklich mysteriös ... Du mov'st die Adresse einfach in EAX und
springst anschließend dann zu eax - ohne Far Jmp :S

MfG
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#6

Re: Procedure umbiegen

  Alt 25. Jan 2009, 23:26
Zitat von mr_emre_d:
ich habe dw nur deshalb deklariert, weil ich mir die Werte anschauen wollte
aso, na dann

[quote="mr_emre_d"]Ansonsten - Dein Code funzt ... mysteriöserweise :S
joar ... hast was anderes erwartet?


Zitat von mr_emre_d:
PS:
ok irgendwie ists wirklich mysteriös ... Du mov'st die Adresse einfach in EAX und
springst anschließend dann zu eax - ohne Far Jmp :S
mir war halt der die Definition nich eingefallen, aber Hauptsache es läuft

ich mach aber dennoch einen FarJump, nur halt über die Adresse in EAX
(zum Glück ist hier alles StdCall und EAX nicht belegt )


ja und der FAR JMP ($FF $25) hat als Parameter einen dereferenzieren Zeiger > JMP [addr]
$FF stimmt zwar, aber das $25 ist "falsch"

nja, aber zumindestens erklärt das, warum ich den Pointer zweimal dereferenziere, da ich ja den Zeiger von der Adresse ausles, welche in dem Original-Jump-Code angesprochen wird.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#7

Re: Procedure umbiegen

  Alt 25. Jan 2009, 23:40
Vielen Dank euch beiden

MfG
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#8

Re: Procedure umbiegen

  Alt 28. Jan 2009, 15:42
[alte adresse einer function sichern]
[im importdirectory nach dieser function suchen] // per eigene Library
[anschließend entry pointer überschreiben mit der eigenen func]
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#9

Re: Procedure umbiegen

  Alt 28. Jan 2009, 16:00
Zitat von mr_emre_d:
[alte adresse einer function sichern]
[im importdirectory nach dieser function suchen] // per eigene Library
[anschließend entry pointer überschreiben mit der eigenen func]
siehe #4
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#10

Re: Procedure umbiegen

  Alt 28. Jan 2009, 17:40
ja das ist die einfache version

warum einfach, wenn auch umständlich möglich ?



EDIT:
OK ... ich gebs zu ... ich habe deinen doppelten PPointer nicht
ganz verstanden gehabt

MfG
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:57 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