![]() |
Re: [asm]JMP bei Delphi-Inline-Assemlber
Zitat:
Also einen sozusagen ein relativer Sprung, von der Stelle aus, wo er steht. Den Opcode für einen absoluten Sprung hab ich auch gerade nicht im Kopf ... könnte höchstens mal heut abend nachseh ^^ Zitat:
Es ist so ähnlich wie mit Flocke's Code...
Delphi-Quellcode:
so ginge es ja auch
mov eax, $11223344
jmp eax
Delphi-Quellcode:
da [] eh auf 'nen Pointer hinweißt, ist es also nicht nötig ... genauso wie das dword, da im Win32 doch eh alles erstmal als LongInt/LongWord/32-Bit-Pointer angesehn wird.
mov eax, dword $11223344
jmp eax
Delphi-Quellcode:
// das ist also dat "Selbe"
mov eax, dword ptr [$11223344] mov eax, ptr [$11223344] mov eax, [$11223344] // wohingegen das mal was Anderes ist ^^ mov eax, byte ptr [$11223344] Zitat:
Ist praktischer, weil die ja weniger Speicher verbrauchen, man kann damit allerdings nicht so weit springen ... was aber och klar sein sollte ^^ Zitat:
Also ich kann höchstens dann nochmal nachgucken was der richtig Opcode hierfür wäre oder du nimmst den indirekten Weg :roll: Aber was ich mich bisher immer grfragt hab ... woher will eigentlich Windows wissen was ein Pointer ist und ob der eventuell gefixt werden muß? Weil oftmals ist es ja nicht gerade eindeutig, was einer ist, oder ob der schon gefixt wurde. z.B.
Delphi-Quellcode:
Windows kann doch shcließlich nicht wissen was das für ein Wert in EAX ist :gruebel:
JMP EAX
|
Re: [asm]JMP bei Delphi-Inline-Assemlber
über das Fixen von Windows hab ich mir bisher gar keine Gedanken gemacht. Aber so wie du das schreibst würds mich auch interessieren woher windows weiß was gefixt werden muss und was nicht. Wobei Windows das früh oder Später ja ausführt und von daher schon wissen sollte was durch die Befehle passiert.
|
Re: [asm]JMP bei Delphi-Inline-Assemlber
aso
Zitat:
Obwohl du dort natürlich auch relativ springen könntest
Code:
also in etwa:
JMP (neueFunktion - aktuellePosition)
Delphi-Quellcode:
PS: wenn du es schon so aufschlüsselt, dann wäre es so wohl "richtiger" ;)
lBuffer : Array[0..4] of Byte;
... PByte(@lBuffer)^ := $e9; PCardinal(@lBuffer[1])^ := Cardinal(ANewFunction) - Cardinal(AOldFunction);
Delphi-Quellcode:
lBuffer : Array[0..(2 + 4 + 4) - 1] of Byte;
|
Re: [asm]JMP bei Delphi-Inline-Assemlber
[ä bissl OT]
Zitat:
wenn ich z.B. irgendwo im Quellcode einer Variable einen hardcodierten Wert übergeben, welcher z.B. die Position einer Funktion ist,
Delphi-Quellcode:
(wenn funktion eine eigene Funktion im eigenem Programm ist, dann wird der Wert ja vom Compiler hardgecodet)
Variable := @Funktion;
dort vielleicht noch ein bissl rumrechne
Delphi-Quellcode:
und dann wohinspringen will,
Variable := Variable + irgendwas;
Delphi-Quellcode:
dann muß hier gefixt werden, wenn die der Programmcode nicht an seiner vorgesehenen Position ist.
JMP &Variable
Wenn ich das ganze aber mit aktuellen Werten aus dem laufenden Programm mache, dann sind die Positionen ja schon gefixt (da dort die verwendete Funktion schließlich bereits verschoben wurde) und müssen demnach ja nichtmehr gefixt werden. o.O |
Re: [asm]JMP bei Delphi-Inline-Assemlber
@Himitus: das "JMP &Variable" muss eignetlich nicht gefixt werden da der Inhalt der Variablen bereits vorher gefixt wird. Der Inhalt von "Variable" ergibt sich ja aus anderen Adressen und diese sind bereits gefixt.
|
Re: [asm]JMP bei Delphi-Inline-Assemlber
es gibt keinen assembler befehl für einen 'absoluten' jump so wie du ihn suchst.
entweder
Delphi-Quellcode:
oder
mov eax, addr
jmp eax
Delphi-Quellcode:
nehmen oder den Umweg über eine globale/lokale variable machem.
push addr
ret
Delphi-Quellcode:
und 0xE9 ist kein relative short distance jump, das wäre 0xEB
jmp [variable]
und wenn du die einen relativen jump brauchst, die berechnung wäre zieladresse-vonadresse-5 |
Re: [asm]JMP bei Delphi-Inline-Assemlber
PS:
![]() Merke: Der Link ist natürlich nur für x86 Wenn ich das nu Spontan Richtig sehe wäre also ein FF ein direkter Jump auf die Addy! (Nich hauen wenns falsch ist ;) ) Greetz Boombuler |
Re: [asm]JMP bei Delphi-Inline-Assemlber
ich habs jetzt erstmal mit dem ablegen auf dem Stack, und dann mit "ret" zur Adresse "zurück" springen gemacht. Das spaart im Gegensatz zu meiner Ursprünglichen Variante schon ganze 4 Byte.
Den Link werd ich mir gleich mit ansehen. [Edit] Ein reines FF reicht nicht aus. Und sobald 1 Byte mehr dazu kommt bin ich wieder bei der gleichen Anzahl wie bei der Variante mit push + ret Die Variante mit push + ret sieht so aus $68$33$22$11$00 $C3 [/Edit] |
Re: [asm]JMP bei Delphi-Inline-Assemlber
Delphi-Quellcode:
entspricht
Variable := @Funktion;
Delphi-Quellcode:
hier kann nichts von windows gefixt werden, denn für Windows ist es nur eine "normale" Zahl, welche in irgendeinen peicherbereich kopiert wird ... und da es nicht wissen kann, daß es eigentlich ein Pointer ist, kann es dort definitiv nicht fixen und später fixen ginge och nicht, da dort Windows eigentlich nicht wissen kann, ob gefixt werden muß, oder nicht, da es ja nicht weiß was für ein Wert in der Variable drinsteht, also ob das schon ein gefixter ist, oder eben noch ein ungefixter (aus 'nem hardgecodeten Pointer).
MOV &Variable, $00123456
denn wenn ich sowas mache, dann würde ja ein "gefixter" Wert in die Variable geschrieben, da ja die Adresse der bereits verschobenen Prozedur zurückgegeben wird.
Delphi-Quellcode:
also liebe als letztes nur noch der Jump-Befehl, wo windows fixen könnte, aber da es ja nicht weiß was in Variable für ein Wert ist ... woher soll es denn dann wissen, was es machen soll?
Variable := GetProcAddr('irgendwas');
Delphi-Quellcode:
JMP &Variable
|
Re: [asm]JMP bei Delphi-Inline-Assemlber
Delphi-Quellcode:
in dem Fall weiß der Compiler, dass er einen Eintrag in die Relocation Table packen muss
Variable := @Funktion;
Delphi-Quellcode:
in dem Fall nicht. Wer auch immer nu Recht hat, wollte das nur noch mal sagen.
MOV &Variable, $00123456
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz