ocultar texto en bat

Iniciado por gAb1, 9 Septiembre 2014, 00:37 AM

0 Miembros y 1 Visitante están viendo este tema.

gAb1

Hola, estoy creando un pequeño script para ocultar el ejecutable de un juego. Todo funciona perfectamente, pero me gustaría saber como ocultar o poner asteriscos cuando escribo la contraseña.

Este es el script:

Código (dos) [Seleccionar]
cls
@ECHO OFF
title File Locker
if EXIST "test.txt" goto NOTLOCKED
if NOT EXIST "test.txt" goto LOCKED
:NOTLOCKED
color 02
cls
echo.
echo Game is not locked
echo ==================
echo.
echo [ *] Lock the game? (Yes/No)
echo [ *] Play now? (Play/No)
echo.
set /p "op=>"
if %op%==Yes goto LOCK
if %op%==yes goto LOCK
if %op%==No goto END
if %op%==no goto END
if %op%==Play goto PLAY
if %op%==play goto PLAY
goto NOTLOCKED
:LOCKED
color 02
cls
echo.
echo Game is locked
echo ==============
echo.
echo [ *] Unlock the game? (Yes/No)
echo.
set /p "op=>"
if %op%==Yes goto UNLOCK
if %op%==yes goto UNLOCK
if %op%==No goto END
if %op%==no goto END
goto LOCKED
:LOCK
ren test.txt "Pprotected"
attrib +h +s "Pprotected"
cls
echo Game Locked...
timeout /t 2 /nobreak > NUL
goto END
:UNLOCK
cls
echo Enter password to unlock the game
set /p "pass=>"
if NOT %pass%== abc goto FAIL
attrib -h -s "Pprotected"
ren "Pprotected" test.txt
goto QPLAY
:QPLAY
cls
echo Wanna play now? (Yes/No)
set /p "play=>"
if %play%==Yes goto PLAY
if %play%==yes goto PLAY
if %play%==No goto END
if %play%==no goto END
goto QPLAY
:PLAY
start test.txt
goto END
:FAIL
echo Invalid password
goto End
:END


He estado viendo en algunos foros scripts que funcionan, pero realmente no se como adaptarlos a lo que quiero.

Agradecería cualquier consejo para mejorar y simplificar el script.

Gracias.

Eleкtro

#1
Cita de: gAb1 en  9 Septiembre 2014, 00:37 AMHe estado viendo en algunos foros scripts que funcionan, pero realmente no se como adaptarlos a lo que quiero.

La solución más sencilla, simplificada y eficiente sería la siguiente:

Cita de: Eleкtro en 16 Diciembre 2012, 10:32 AM
Puedes usar la utilidad EditVar (x86 o x64 dependiendo de tu SO) > http://www.westmesatech.com/editv.html

Código (dos) [Seleccionar]
CHCP 1252 >NUL
editv64 -m -p "Esciba la contraseña >>" "PASSWORD"
Echo %PASSWORD%




Otra solución igual de simplificada y eficiente sería -> esta <- pero necesitas un objeto ActiveX que parece existir solamente en XP.

El resto de códigos, los cuales la mayoria son bastante largos, incómodos, y poco fiables, elaboraciones de casi cien lineas en algunos casos, ese tipo de códigos no me voy a molestar ni siquiera en nombrarlos, esto es Batch, un lenguaje simple que no fue diseñado para este tipo de tareas, si quieres hacer algo así la alternativa más fiable es depender de una aplicación de terceros (desarrollada en un lenguaje de verdad) como la que mencioné al principio.




Cita de: gAb1 en  9 Septiembre 2014, 00:37 AMAgradecería cualquier consejo para mejorar y simplificar el script.

Código (dos) [Seleccionar]
if %op%==Yes goto LOCK
if %op%==yes goto LOCK

Realizar comparaciones de esa manera no tienen sentido, puedes desactivar la distinción de mayusculas minúsculas con el parámetro /I :
Código (dos) [Seleccionar]
If /I "%op%" EQU "Yes" (Goto :Lock)

Aunque directamente, deberías utilizar el comando CHOICE para ese tipo de preguntas:

Código (dos) [Seleccionar]
Choice /C "YN" /M "[ *] Unlock the game? (Yes/No)"
If %ErrorLevel% EQU 1 (...) Else (...)


Cita de: gAb1 en  9 Septiembre 2014, 00:37 AM
Código (dos) [Seleccionar]

:PLAY
start test.txt

No estás utilizando la sintaxis correcta que especifica el comando, échale un ojo a la ayuda del comando:
Código (dos) [Seleccionar]
Start /?
Start "" ".\Test.txt"


Pero de todas formas es innecesario el uso de dicho comando, basta con escribir:
Código (dos) [Seleccionar]
".\Test.txt"

Citar
Código (dos) [Seleccionar]
if EXIST "test.txt" goto NOTLOCKED
if NOT EXIST "test.txt" goto LOCKED

Ese tipo de repetición de código es innecesaria, debes utilizar ELSE.

Código (dos) [Seleccionar]
Call :CheckLocked ".\Test.txt"

:CheckLocked
If /I EXIST "%~f1" (call :NOTLOCKED) Else (call :LOCKED)
Goto :EOF


saludos








gAb1

#2
Gracias, era lo que me esperaba, voy a utilizar esa aplicación. Tambien gracias por los consejos, parece que de esa manera funcionará mucho mejor el script, ya que lo voy a compilar y tiene que estar bien hecho.

Edito: Tengo un pequeño problema, y es que parece que la secuencia se repite en algun punto una sola vez, cuando se llama a la funcion END vuelve otra vez al principio, pero solo pasa una vez. No sé que puede ser.

A parte, cuando existe el archivo test.txt y escribes n(o) deberia terminar, pero por alguna razón aparece el siguiente menu, como si hubieras escrito s(i)

Código (dos) [Seleccionar]

Cls
@Echo OFF
title File Locker
Call :CheckLocked ".\Test.txt"
:CheckLocked
If /I EXIST "%~f1" (call :NOTLOCKED) Else (call :LOCKED)
Goto :EOF
:NOTLOCKED
Color 02
Cls
Echo.
Echo Game is not locked
Echo ==================
Echo.
Echo [*] Lock the game? [Y/N]
Echo [*] Play now? [Play/N]
Echo.
Set /p "op=>"
If /I "%op%" EQU "Y" (Goto :LOCK)
If /I "%op%" EQU "N" (Goto :END)
If /I "%op%" EQU "Play" (".\Test.txt")
Goto :NOTLOCKED
:LOCKED
Color 02
Cls
Echo.
Echo Game is locked
Echo ==============
Echo.
Choice /C "YN" /M "Unlock the game? "
If %ErrorLevel% EQU 1 (Goto :UNLOCK) Else (Goto :END)
Goto LOCKED
:LOCK
Ren test.txt "Pprotected"
Attrib +h +s "Pprotected"
Cls
Echo Game Locked...
Timeout /t 2 /nobreak > NUL
Goto END
:UNLOCK
Cls
EditV64 -m -p "Enter the password to unlock the game: " "pass"
If NOT "%pass%" EQU "abc" (Goto :FAIL)
Attrib -h -s "Pprotected"
ren "Pprotected" test.txt
Goto :QPLAY
:QPLAY
Cls
Choice /C "YN" /M "Wanna play now? "
If %ErrorLevel% EQU 1 (".\Test.txt") Else (Goto :END)
Goto :END
:FAIL
Echo Invalid password
Timeout /t 2 /nobreak > NUL
Goto :END
:END

gAb1

¿Por casualidad no sabrás por qué me da este error?

CitarError 216: This version of "C:\Users\HOME~1\AppData\Local\Temp\afolder\EditV64
.exe" is not compatible with the version of Windows you're running. Check your c
omputer's system information and then contact the software publisher.
Invalid password

Tal y como me dice la aplicación que uso para compilar - Advanced BAT to EXE Converter (v.91) - Utilizo la variable de entorno: %MYFILES%\EditV64

Sin compilar funciona perfectamente, tambien he probado a usar el editv64 de la carpeta temporal y tambien funciona. Es un problema del .exe o del compilador...

¿Alguna ayuda?

Eleкtro

#4
Cita de: gAb1 en 10 Septiembre 2014, 13:44 PMTengo un pequeño problema, y es que parece que la secuencia se repite en algun punto una sola vez, cuando se llama a la funcion END vuelve otra vez al principio, pero solo pasa una vez. No sé que puede ser.

Has de saber distinguir el uso de una llamada CALL de un GOTO.

El problema es que cuando haces un CALL al bloque :CheckLocked,
este a su vez hace un CALL al bloque :NOTLOCKED o al bloque :LOCKED,
y el problema es que en ambos bloques :NOTLOCKED/:LOCKED haces un GOTO a :END,
al no contener instrucciones el bloque :END, la llamada del CALL se acaba y vuelve al punto de inicio de ese CALL, es lo mismo que un GOTO:EOF.

Para solucionarlo:

Código (dos) [Seleccionar]
:END
Exit


Cita de: gAb1 en 10 Septiembre 2014, 13:44 PMA parte, cuando existe el archivo test.txt y escribes n(o) deberia terminar, pero por alguna razón aparece el siguiente menu, como si hubieras escrito s(i)

Es el mismo error que he comentado arriba, no estás terminando la ejecución del script, solo estás terminando una llamada a un bloque (CALL) así que vuelves a la linea en donde iniciaste ese CALL.




Cita de: gAb1 en 10 Septiembre 2014, 15:20 PM
¿Por casualidad no sabrás por qué me da este error?

CitarError 216: This version of "C:\Users\HOME~1\AppData\Local\Temp\afolder\EditV64
.exe" is not compatible with the version of Windows you're running. Check your c
omputer's system information and then contact the software publisher.
Invalid password

Me he fijado en que la versión de Editv32 y Editv64 son la misma (3.0.0.0), pero la versión de 32 Bits parece no funcionar o bien en Windows 8/81 o bien en equipos de 64 Bits (no lo he comprobado a fondo).

Solo el propio desarrollador sabrá porque motivo ha querido imponer esa denegación de ejecución de la versión de 32 Bits, pero en caso de que no sea una limitación de uso en "X" versión de Windows entonces esto debería funcionar:

Código (dos) [Seleccionar]
:: X86
If Not Defined ProgramW6432 (
REM Ejecutar Editv32.exe
)

:: x64
If Defined ProgramW6432 (
REM Ejecutar Editv64.exe
)


PD: No he echo la prueba en un Windows 7/8 x86.

Saludos








gAb1

#5
Cierto, que error más tonto... ahora ya se la diferencia de CALL y GOTO :)

Respecto al programa, es extraño porque funciona bien desde el archivo .bat y el sistema operativo es windows 8.1 pro 64. El ordenador donde lo voy a usar es un windows 7 profesional 64.

El problema es que me sale ese error cuando lo ejecuto desde el archivo compilado .exe

Lo que no sé es donde utilizar eso que me has dicho, ¿en que parte del script lo pongo?

Gracias.

Edito: ¿Tal vez deba añadir el programa a la variable del entorno y moverlo a la carpeta del sistemta? Porque funciona perfectamente si se usa con el archivo bat...

Edito 2: Al final he encontrado un trozo de codigo, al parecer es powershell pero funciona perfectamente.

Código (dos) [Seleccionar]
set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
If NOT "%password%" EQU "abc" (Goto :FAIL)

Eleкtro

Cita de: gAb1 en 10 Septiembre 2014, 19:05 PM

Edito 2: Al final he encontrado un trozo de codigo, al parecer es powershell pero funciona perfectamente.

Código (dos) [Seleccionar]
set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
If NOT "%password%" EQU "abc" (Goto :FAIL)


Solo comento para decir muy pero que muy buena alternativa, pero como siempre en Batch se debe recurrir a la utilización de otro lenguaje y/o herramienta externa para llevar a cabo algunos propósitos de forma eficiente.

Saludos!