[MASM32] Console-Problem



  • Hi,

    ich habe ein Problem mit folgendem Code:

    *linked im Console-Subsystem-Mode*

    .386
    .model flat, stdcall
    option casemap :none
    
    include		windows.inc
    include		kernel32.inc
    includelib	kernel32.lib
    include		masm32.inc
    includelib	masm32.lib
    
    .data
    	txt	db "TESTTEST:",0
    .data?
    	buff1	db 128 dup (?) ;Für später schonmal größer gemacht
    	buff2	db 1 dup (?)
    	hOut	dd ?
    .code
    start:
    	invoke SetConsoleCP,850
    	invoke SetConsoleOutputCP,850
    	invoke GetStdHandle, STD_OUTPUT_HANDLE
    	mov hOut,eax
    	invoke WriteConsole, ADDR hOut,word ptr [txt],1,ADDR buff1,NULL
    	invoke StdIn,ADDR buff2,1
    	invoke ExitProcess,0
    end start
    

    Bevor StdIn ausgeführt wird, schließt sich das Programm. Ich hab mir die Exe-Datei im Olly mal angeschaut und da ist folgendes drin:

    1. 00401020  |.  6A 00         PUSH 0
       2. 00401022  |.  68 0C304000   PUSH console1.0040300C                   ; /pReserved = console1.0040300C
       3. 00401027  |.  6A 01         PUSH 1                                   ; |pWritten = 00000001
       4. 00401029  |.  6A 00         PUSH 0                                   ; |CharsToWrite = 0
       5. 0040102B  |.  66:FF35 00304>PUSH WORD PTR DS:[403000]                ; |Buffer = 00004554
       6. 00401032  |.  68 8F304000   PUSH console1.0040308F                   ; |hConsole = 0040308F
       7. 00401037  |.  E8 2C000000   CALL <JMP.&kernel32.WriteConsoleA>       ; \WriteConsoleA
    

    Wie man sieht, ist der 1. Push (letzter Parameter) nicht mehr drin, weil in der Mitte ja noch dieser "PUSH 0" drin ist, den ich allerdings nirgendwo im Source stehen hab. pReserved hat deshalb die Adresse von "buff1". Das kann ja nicht Funktionieren, da das in der Win32 API Referenz steht:
    lpReserved - Reserved; must be NULL.

    Jetzt ist natürlich meine Frage: Woher kommt dieser "0-Push" und wie kann ich das beheben?

    Ich hoffe ihr könnt mir helfen,
    lg xdstyla



  • Schau dir mal Zeile 23 ganz genau an... Da stimmt einiges mit den Parametern nicht.
    Als 1. Parameter wird ein Handle erwartet, nicht ein Pointer auf ein Handle. Im Prinzip solltest du hier direkt eax als Parameter angeben koennen.
    Als 2. Parameter wird ein Pointer auf den auszugebenden String erwartet, fuer 32Bit-Programme also ein dowrd-Offset (4 Byte) und nicht was auch immer fuer ein 1 word (2 Byte) breiter Wert deiner Meinung nach von den ersten 2 Zeichen deines Strings bei "txt" gebildet wird.
    Das push 0 kommt also wahrscheinlich daher, dass MASM automatisch versucht, den zu kurzen 2. Parameter zu kompensieren. Klappt natuerlich so oder so nicht, da der Wert, den du als 2. Parameter uebergibst so in jedem Fall keine gueltige Adresse ergibt.

    BTW:
    Der Aufruf in der darauffolgenden Zeile duerfte wahrscheinlich auch nicht klappen. Den std_in-handle musst du dir wie std_out auch erst holen.



  • Hi,

    DANKE!
    Habs mir nochmal genau durchgelesen, also meine Zeile und deinen Text ( 😃 ) und habs jetzt geändert. Klappt jetzt 😉

    invoke WriteConsole, hOut,addr [txt+1],1,ADDR buff1,NULL
    

    Nochmals vielen Dank,
    lg xdstyla

    EDIT: Achja, zu deinem BTW: Brauch ich nich 😃 In der proc ist der Aufruf schon drinne. 😃
    Ich hätte auch StdOut nehmen können, nur da gibts keine Begrenzung der Länge der Ausgabe.



  • Das masm32-SDK kommt mit einer Vielzahl praktischen macros - vieleicht sagt es dir ja zu:

    include masm32rt.inc
    .code
    start:
        mov esi,input("enter string : ")
        print "string='"
        print esi,027h,10,13
        inkey "..."
        xor eax,eax 
        ret
    end start
    

    Weitere Informationen zu den macros, deren Parameter und was man beachten muss findest du in \masm32\help\hlhelp.chm


Anmelden zum Antworten