FASM Relative Referenz zu Label

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Der Eisvogel

Betreff: FASM Relative Referenz zu Label

BeitragSa, Jun 09, 2012 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich habe folgenden ASM Code:
Code: [AUSKLAPPEN]
_run:
push ebp
mov ebp, esp
push module
call GetModuleHandleA
pop ebp
ret
module:
db 'user32.dll',0


Hinter dem Label "module" verbirgt sich ein statischer String, der an die Funktion "GetModuleHandleA" übergeben werden soll. Wenn dieser Code nun kompiliert wird, dann wird "push module" zu "push 03530000", als Beispiel. Mir ist klar, dass dies bei jedem Start anders ist, je nachdem in welchem Adress-Bereich die Funktion geladen wird. Gibt es eine Möglichkeit diese "push" Anweisung relativ zu machen? In etwa so wie eine "jmp" Anweisung? So dass egal in welchem Adressbereich die Funktion ausgeführt wird, die "push" Anweisung nicht angepasst werden muss?

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BladeRunner

Moderator

BeitragSa, Jun 09, 2012 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch wenn BMax mit FASM arbeitet ist das Problem hier ja kein BMax-Spezifisches, daher:
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Noobody

BeitragSa, Jun 09, 2012 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin nicht sicher, ob ich die Frage ganz verstehe, aber im Prinzip willst du eine relative Adresse für "module" verwenden, da dein Stück ASM-Code je nach dem bei mehreren Programmstarts an anderen Orten in den Speicher geladen wird?

Dann kann ich dich beruhigen, denn seit 40-50 Jahren gibt es die Virtuelle Speicherverwaltung, welcher dank Adressenübersetzung dafür sorgt, dass egal, wo dein Program im RAM landet, es immer die gleichen absoluten Addressen benutzen kann. Sonst wäre Programmierung eine ziemlich Qual, unter anderem auch, weil das Betriebssystem durchaus deinen Programmspeicher in verschiedenen Teil des RAMs unterbringt - es muss nicht immer alles an einem Stück sein.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Der Eisvogel

BeitragSa, Jun 09, 2012 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist mir schon klar. Mal ein Beispiel:
Nehmen wir mal an diese Funkion würde an die Speicherstelle 01230000 geladen. Dann wird das push angepasst "push 0123XXXX", wobei die X für das entsprechne Offset stehen. So, dass steht jetzt fest dadrin. Jetzt nehme ich diesen Speicher und kopiere ihn selbst an die Stelle 04560000. Jetzt steht bei dem push aber immer noch "push 0123XXXX", da die Funktion von mir selbst da hingeschrieben wurde. Ich weiß grad nicht wie das Ding heißt, dass diese Adresse anpasst, aber das wird ja dann nicht mehr ausgeführt. Das heißt ich müsste das selbst beim Kopieren anpassen. Das ist theorethisch auch kein Problem, solange ich meinen Code nicht veränder. Aber wenn ich dann mehrere solcher Passage habe und den Code ändern möchte, muss ich ja jedes einzelne Segment beachten und aktuallisieren. Einfach er wäre das natürlich, wenn es das ähnlich wie bei Jumps, mit relativen Bezügen geben würde. Das würde mir die Arbeit ersparen, das selbst anpassen zu müssen.
Ich hoffe mein Anliegen ist jetzt besser verständlich.

EDIT: Das Ding heißt PE Loader.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Thunder

BeitragSa, Jun 09, 2012 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist die Adresse grundsätzlich bekannt, die du laden willst? D.h. könntest du sie als Parameter an _run übergeben?
Code: [AUSKLAPPEN]
push module
call _run
add esp, 4

...

_run:
push ebp
mov ebp, esp
push [ebp+8]
call GetModuleHandleA
add esp, 4
pop ebp
ret
module:
db 'user32.dll',0


Der Code ist logischerweise ungetestet, aber es dürfte so funktionieren. Ich hoffe, ich hab das Problem richtig verstanden Smile

Edit: Mir dämmert langsam, was du meinst, aber ich habe im Moment keinen Lösungsvorschlag.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
  • Zuletzt bearbeitet von Thunder am So, Jun 10, 2012 12:08, insgesamt 2-mal bearbeitet

Der Eisvogel

BeitragSa, Jun 09, 2012 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber selbst bei dem Code funktioniert es nicht mehr, wenn ich die ganze Funktion, wohlgemerkt inklusive des Labels verschiebe, da sich die Adresse des String ja dann auch ändert.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group