Stack im assembler



  • Hallo, habe folgendes main :

    int main()
    {
    	DWORD i,j;
    	__asm
    	{
    		PUSH 0xFFFFFFFF
    		MOV i, ESP
    		MOV j, EBP
    	}
    
    	cout << hex;
    
    	cout << "main : " << &main << endl;
    	cout << "ESP  : " << i << endl;
    	cout << "EBP  : " << j << endl;
    
    	while (1)
    	{
    		_getch();
    		__asm PUSH 1
    	}
    
    	_getch();
    	return 0;
    }
    

    main im assembler :

    PUSH EBP
    MOV EBP,ESP
    SUB ESP,0C
    PUSH ESI
    PUSH -1
    MOV DWORD PTR SS:[EBP-4],ESP
    MOV DWORD PTR SS:[EBP-8],EBP
    MOV ECX,DWORD PTR DS:[40305C]
    PUSH 4012A0
    CALL DWORD PTR DS:[40303C]
    MOV ECX,DWORD PTR DS:[40305C]
    MOV EDX,4031BC
    PUSH 401A40
    PUSH 4012C0
    CALL 00000C00
    MOV ECX,EAX
    CALL DWORD PTR DS:[403034]
    MOV ECX,EAX
    CALL DWORD PTR DS:[403064]
    MOV ECX,DWORD PTR DS:[40305C]
    MOV EDX,4031C4
    PUSH 401A40
    PUSH DWORD PTR SS:[EBP-4]
    CALL 00000C00
    MOV ECX,EAX
    CALL DWORD PTR DS:[403038]
    MOV ECX,EAX
    CALL DWORD PTR DS:[403064]
    MOV ECX,DWORD PTR DS:[40305C]
    MOV EDX,4031CC
    PUSH 401A40
    PUSH DWORD PTR SS:[EBP-8]
    CALL 00000C00
    MOV ECX,EAX
    CALL DWORD PTR DS:[403038]
    MOV ECX,EAX
    CALL DWORD PTR DS:[403064]
    MOV ESI,DWORD PTR DS:[4030E0]
    CALL ESI
    PUSH 1
    JMP SHORT 00000760
    

    Hier der stack :

    FF FF FF FF ;mein push ff ff ff ff
    01 00 00 00 ;was ist das ? vielleicht von while(1)?
    79 CC 67 67 ;und das ? bleibt bei jedem compilen gleich
    F0 F8 3E 00 ;ESP
    DC F8 3E 00 ;EBP
    

    Kann man eigentlich einen komplett leeren stack haben ? Habe es nämlich auch ab und an das auf dem stack ganz viele 0xCC's liegen! wodurch kommt das ? und wie kommt der obige stack zustande? Außerdem frage ich mich wo der instruction pointer ist, soll der nicht auch auf dem stack sein?

    Man kommt an den EIP auch nicht ran oder ?

    MOV i, EIP ;error
    

    Und was ist die return addresse (rückgabe addresse)? Müsste die nicht auch auf dem stack liegen?

    Danke & viele grüße



  • Ceno schrieb:

    Kann man eigentlich einen komplett leeren stack haben ?

    Nur in der Theorie. Irgendwo ganz am Anfang ist der Stack natürlich leer, aber lange bevor dein "main" aufgerufen wird macht die Runtime ja noch so einiges. 😉

    Ceno schrieb:

    Habe es nämlich auch ab und an das auf dem stack ganz viele 0xCC's liegen! wodurch kommt das ?

    Aber nur im Debugmodus. 😉
    Das ist (zumindest bei VC) das Zeichen "hier ist nichts". Da wird regelmäßig geprüft ob du 1) uninitialisierte Variablen genutzt und 2) ob du du den Stack überschrieben hast, z.B. über Arraybounds.

    Ceno schrieb:

    und wie kommt der obige stack zustande? Außerdem frage ich mich wo der Instruction pointer ist, soll der nicht auch auf dem stack sein?

    Warum sollte der Instruktionpointer auf dem Stack sein ? Der gibt an wo du gerade bist, das ist ein Register. Der wird nur als Rücksprungaddresse auf den Stack gepusht.

    FF FF FF FF
    01 00 00 00 ;wohl eher dein "push 1"
    79 CC 67 67 ;Security cookie vielleicht ? Damit Stackoverflows verhindert werden können
    F0 F8 3E 00
    DC F8 3E 00
    

    Du solltest

    1. Dazusagen wo du das Stackabbild gemacht hast und
    2. Den Stack nicht zerschießen mit deinem "push" wenn du schon verstehen willst wie es geht. 😃

    Ceno schrieb:

    Man kommt an den EIP auch nicht ran oder ?

    Siehe oben

    call labelHier
    labelHier:
    pop eax ;eax hat nun die Addresse worauf auch EIP gerade zeigt(e)
    

    Braucht man aber eh nie. 🤡

    Ceno schrieb:

    Und was ist die return addresse (rückgabe addresse)? Müsste die nicht auch auf dem stack liegen?

    Tut sie doch ?



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Für das Eip kannst du das auch über GetThreadContext machen, da dein Thread immer wissen muss, an welcher Stelle sich der Instruction Pointer gerade befindet.



  • Ceno schrieb:

    Habe es nämlich auch ab und an das auf dem stack ganz viele 0xCC's liegen! wodurch kommt das ?

    http://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_debug_values

    Ceno schrieb:

    und wie kommt der obige stack zustande?

    Step' doch einfach im Debugger durch.

    Ceno schrieb:

    Außerdem frage ich mich wo der instruction pointer ist, soll der nicht auch auf dem stack sein?

    Nö, der aktuelle IP liegt natürlich nicht auf dem Stack. Der IP wird nur auf den Stack gepusht wenn ne Unterfunktion aufgerufen wird ("call").



  • Mr.Long schrieb:

    Für das Eip kannst du das auch über GetThreadContext machen, da dein Thread immer wissen muss, an welcher Stelle sich der Instruction Pointer gerade befindet.

    Ist auch möglich, aber etwas unpraktisch:

    <a href= schrieb:

    MSDN - GetThreadContext">You cannot get a valid context for a running thread. Use the SuspendThread function to suspend the thread before calling GetThreadContext.
    If you call GetThreadContext for the current thread, the function returns successfully; however, the context returned is not valid.

    Du willst vermutlich sicherstellen dass der Thread genau in deinem Code stehenbleibt...



  • Danke für die antworten 🙂


Anmelden zum Antworten