Einzelnen Beitrag anzeigen

sILeNt heLLsCrEAm

Registriert seit: 19. Dez 2012
13 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Hilfe bei dynamischer Sprungberechnung

  Alt 20. Dez 2012, 13:50
Erstmal Dankeschön an euch für eure Antworten. An dieser Stelle werde ich mal allgemein darauf antworten.
In erster Linie folgendes... Ich hatte in verschiedene Richtungen Versuche gestartet. Um an den "ByteSwap" festzuhalten... Mein Versuch war eben die Bytes, bzw. den 4-Byte großen Hex-Wert, umzukehren und dazu den Wert $E900000000 hinzuzuaddieren. So stimmt das Ganze und korrekt berrechnete Sprung ist zur weiteren Verabeitung verfügbar. Problem ist eben allerdings das, wenn man den Integerwert in den Speicher schreibt, aus z.B. $E9 08 15 FF 79 einfach mal $79 FF 15 08 E9 wird.
Deswegen war mein zweiter Versuch eben jenen ByteSwap wegzulassen. Allerdings kann man dann nicht einfach den Wert $E900000000 hinzuaddieren, da wirds ja dann auch wieder Mist. Daraufhin schrieb ich ja hier ob es eine elegante Lösung gibt statt einen Wert hinzuaddieren einfach einen Wert, in diesem Falle Byte hinzuzufügen?
Beispiel (wirklich nur Beispiel)...
Ich habe die korrekte Sprungweite $87 65 43 21. Damit ein korrekter Sprung draus würde muss, um es korrekt in den Speicher zu schreiben ein $E9 nicht hinzuaddiert werden sondern angehangen werden. Also so $87 65 43 21 E9.

Eine Lösung hätte ich ja bereits gehabt. Nämlich zuerst das Byte $E9 schreiben und dann die swapped Sprungweite. Allerdings müsste ich dazu 2x auf die WriteProcess API zurückgreifen was ich eigentlich vermeiden wollte.

Eine Adresse zu Pushen gefolgt von einem Return ist mir durchaus geläufig. Wäre dann auch meine letzte Möglichkeit um alles in einem Rutsch zu schreiben. Sind zwar Kleinigkeiten, aber dadurch werden ja 6 Bytes geschrieben anstatt nur 5.
Aber, um das mal noch etwas weiter zu vertiefen. Ich könnte ebenfalls z.B. schreiben...
Zitat:
mov eax, [adresse]
jump eax
Natürlich muss dabei das Register gesichert und später wiederhergestellt werden. Verbraucht aber alles in allem 9 Bytes die geschrieben werden müssten.

Ich habe jetzt nochmal ne Stunde dran gebaut und wahrscheinlich ist es wohl doch so das man manchmal den Wald vor lauter Bäume nicht sieht. Ich hab mir insofern ne simple ASM Anweisung gestrickt...
Delphi-Quellcode:
function CompleteJMPCalc(const Wert: Int64): Int64;
asm
  mov eax, dword [Wert]
  mov dword [result+1],eax
  mov byte [result], $E9
end;
Da ein Sprung aber nur 5 Bytes hat und ich per API dann auch nur 5 Bytes schreibe werden die letzten 3 Bytes des 8 Byte großen Integer-Wertes abgeschnitten. Also soweit erstmal kein Problem.

Und zum Thema Absoluter Sprungbefehl...
Die "einzigen" Sprünge die ich kenne sind eben die absoluten (explizit handelt sich's dabei nur um JMP) oder bedingten Jumps, wie z.B. JE, JNE usw...


Abschließend dazu möchte ich nochmal zusammenfassen...
Wie ich die Sprünge berrechne und wie diese dann im Speicher zu stehen haben das dass funktioniert ist kein Problem.
Hauptsächlich habe/hatte ich damit ein Problem wie ich die Sprungweiten und das Byte ($E9), laienhaft ausgedrückt - zusammenkriege.
Die oben gennante ASM Lösung ist soweit funktionabel, aber interessehalbe frage ich mal ob es noch eine elegantere Lösung gibt?!


Viele Grüße
sILeNt heLLsCrEAm


Nachtrag:
Wollte mir mal deine UALL Collection anschauen, aber mein Security Tool beruhigt sich ja garnet mehr.
Ich werde mal im Netz nach einem alt. Download googeln. Es sei denn Du hast aus dem stehgreif noch einen da?
Wenn ich mal ganz lieb frag
  Mit Zitat antworten Zitat