[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 xdstylaEDIT: 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