FASM Relative Referenz zu Label
Übersicht

![]() |
Der EisvogelBetreff: FASM Relative Referenz zu Label |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group