elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16 17
91  Programación / Scripting / Re: Sucesión Fibonacci [Batch] en: 14 Abril 2009, 09:39 am
Leo, el límite para cmd.exe es 32 bits de amplitud o ancho. Así:

11111111111111111111111111111111
notación binaria: 32 bits o flags.

es en notación decimal: 4294967295

Ahora, el rango abarca números negativos y positivos, por lo que queda así:

-2147483648 a 2147483647

Hice una función que suma números en formato cadena de caracteres, para que así la sucesión no quede negativa.
92  Programación / Scripting / [Batch] Función que suma números positivos mayores a 32 bits. v1.2 en: 14 Abril 2009, 09:29 am
:: Hice este código debido al problema que tuvo Leo con la sucesión de Fibonacci.


::
Código:
@echo off

setlocal

call :suma 777777777777777777777777  9999999999999999999999999999
echo. 777777777777777777777777 + 9999999999999999999999999999 = %suma%


call :suma 777777777777777777777777 + 9999999999999999999999999999
echo. 777777777777777777777777 + 9999999999999999999999999999 = %suma%

pause

endlocal
goto :eof

::suma dos numeros positivos.
::version 1.2
::Recibe dos numeros en formato de cadena de caracteres.
::Uso:
::call :suma  2147483647 +  10002147483648
::o
::call :suma  2147483647  10002147483648
::Almacena el resultado en la variable suma
::util para sumar numeros mayores a 2147483647 (limite positivo. el rango de 32 bits en cmd solo permite numeros entre -2147483648 y 2147483647 )
::En windows nt y 2000 las cadenas de variables tiene un largo de maximo de 2047 caracteres, y en xp y superior: 8191.
::programado a la rapida por 0x0309
:suma
setlocal enableextensions enabledelayedexpansion
for /f "delims=+ tokens=1,2" %%a in ("%~1+%~2+%~3") do (
set primerNumero=%%a
set segundoNumero=%%b
)

call :len %primerNumero%
set /a lenPrimerNumero=%tam%
call :len %segundoNumero%
set /a lenSegundoNumero=%tam%
if %lenPrimerNumero% gtr %lenSegundoNumero% (
set mayor=primerNumero
set /a len=%lenPrimerNumero%-1
set menor=segundoNumero
) else (
set /a len=%lenSegundoNumero%-1
set mayor=segundoNumero
set menor=primerNumero
)
set /a diferencia=!len%mayor%!-!len%menor%!
set "loQueFalta="
for /l %%a in (1,1,%diferencia%) do (set loQueFalta=!loQueFalta!0)
set %menor%=%loQueFalta%!%menor%!
set /a reserva=0
set "suma="
:ciclo
for /F %%a in ("primerNumero:~!len!,1") do set digitoUno=!%%a!
for /F %%a in ("segundoNumero:~!len!,1") do set digitoDos=!%%a!
set /a sumaDigitos=!digitoUno!+!digitoDos!+!reserva!
set /a digitoResultante=!sumaDigitos!%%10
set /a reserva=!sumaDigitos!-!digitoResultante!
set /a reserva /=10
set suma=!digitoResultante!!suma!
set /a len -=1
if !len! geq 0 goto ciclo
if !reserva! gtr 0 (set suma=!reserva!!suma!)
(
endlocal
set suma=%suma%
)
goto :eof
:len
setlocal
set /a contl=0
set wordl=%~1
:loopl
if not defined wordl (goto endl)
set wordl=%wordl:~1%
set /a contl +=1
goto loopl
:endl
endlocal & set /a tam=%contl%
goto :eof

::
93  Programación / Scripting / Re: Ayuda con BAT en: 14 Abril 2009, 03:54 am
aquí adapté el código, para que identifique el xp.

Código:
@echo off
rem Universal Batch Operating System Detector
rem Based on work of Timo Salmi found in http://www.netikka.net/tsneti/info/tscmd004.htm
rem Writted by 0x0309
rem e-mail: 0x0309@-gmail.com (without dash)
rem version 13-4-2009 v1.1.1
rem Tested succesfully in:
rem  MS-DOS 5.0
rem  MS-DOS 6.0
rem  MS-DOS 6.21
rem  MS-DOS 6.22
rem  MS-DOS 7.10
rem  Windows 95 b
rem  Windows NT 4.0 Workstation
rem  Windows 98 SE
rem  Windows 2000 Server
rem  Windows XP 32 bit
rem  Windows XP 64 bit (2003 version)
rem  Windows Vista
rem  Windows 7

set isnt=false
echo.>nul & set isnt=true
if true==%isnt% goto _nt

:_dos9x
set _os_=UNKNOW
echo Test|find "Fail">nul
if errorlevel 0 if not errorlevel 1 set _os_=MSDOS5-621
if not %_os_%==UNKNOW goto _resume
ver | find.exe /i "MS-DOS" >nul
if errorlevel 0 if not errorlevel 1 set _os_=MSDOS622-710
ver | find.exe /i "Windows 95" >nul
if errorlevel 0 if not errorlevel 1 set _os_=95
ver | find.exe /i "Windows 98" >nul
if errorlevel 0 if not errorlevel 1 set _os_=98
ver | find.exe /i "Windows Millennium" >nul
if errorlevel 0 if not errorlevel 1 set _os_=ME
goto _resume

:_nt
net.exe config workstation <nul 1>&0 2>&1
if not errorlevel 0 goto _vermode
if errorlevel 1 goto _vermode
goto _nt_
:_vermode
for /f "tokens=* eol=" %%a in ('ver') do (set _os_=%%a)
goto _eval_
:_nt_
for /f "skip=4 tokens=* eol=" %%a in ('net.exe config workstation') do (
echo.%%a | find.exe /i "Windows" >nul
if errorlevel 0 if not errorlevel 1 set "_line=%%a"&goto _n_t_
)
:_n_t_
set _arg=%_line:"=%&set /a _tk=1
call :_cut %_arg%
for /f "tokens=%_tk%,* eol=" %%a in ("%_line%") do (set _os_=%%a %%b)
set "_arg="&set "_tk="&set "_line="
:_eval_
find.exe 1>nul 2>&1
if errorlevel 9009 goto _unknow
set _os_ | find.exe /i " NT"  >nul 2>&1
if errorlevel 0 if not errorlevel 1 set _os_=NT&goto _resume
set _os_ | find.exe /i " 2000"  >nul 2>&1
if errorlevel 0 if not errorlevel 1 set _os_=2000&goto _resume
set _os_ | find.exe /i " 2002"  >nul 2>&1
if errorlevel 0 if not errorlevel 1 set _os_=XP&goto _resume
set _os_ | find.exe /i " XP"  >nul 2>&1
if errorlevel 0 if not errorlevel 1 set _os_=XP&goto _resume
set _os_ | find.exe /i " 5.1"  >nul 2>&1
if errorlevel 0 if not errorlevel 1 set _os_=XP&goto _resume
set _os_ | find.exe /i " 5.2"  >nul 2>&1
if errorlevel 0 if not errorlevel 1 set _os_=XP64-2003&goto _resume
set _os_ | find.exe /i " 2003"  >nul 2>&1
if errorlevel 0 if not errorlevel 1 set _os_=2003&goto _resume
set _os_ | find.exe /i " 2008"  >nul 2>&1
if errorlevel 0 if not errorlevel 1 set _os_=2008&goto _resume
set _os_ | find.exe /i " 6.0"  >nul 2>&1
if errorlevel 0 if not errorlevel 1 set _os_=2008-VISTA&goto _resume
set _os_ | find.exe /i " Vista"  >nul 2>&1
if errorlevel 0 if not errorlevel 1 set _os_=VISTA&goto _resume
set _os_ | find.exe /i " 6.1"  >nul 2>&1
if errorlevel 0 if not errorlevel 1 set _os_=SEVEN&goto _resume
set _os_ | find.exe /i " 7"  >nul 2>&1
if errorlevel 0 if not errorlevel 1 set _os_=SEVEN&goto _resume
:_unknow
set _os_=UNKNOW
goto _resume

:_cut
set _arg=%1&shift
if /i not [%_arg%]==[Windows] (set /a _tk=%_tk%+1&goto:_cut)
goto :eof

:_resume
echo.%_os_% | find.exe /i "XP" >nul
if not errorlevel 0 goto _resume_
if errorlevel 1 goto _resume_
systeminfo.exe 2>nul | find.exe /i "Microsoft Windows" | find.exe /i "Professional" >nul
if errorlevel 0 if not errorlevel 1 set _os_=XP_PROFESSIONAL&goto _resume_
systeminfo.exe 2>nul | find.exe /i "Microsoft Windows" | find.exe /i "Home" >nul
if errorlevel 0 if not errorlevel 1 set _os_=XP_HOME&goto _resume_

:_resume_
echo.System: %_os_%

pause


94  Programación / Scripting / Re: Sucesión Fibonacci [Batch] en: 10 Abril 2009, 20:14 pm
Hey Leo, considerando que solo debes ir sumando los dos números anteriores, podrías crear una función que trate las dos variables como texto, y vaya sumando cada carácter, así te evitas la aparación de números negativos, y podrías alcanzar números muy grandes, considerando que el tamaño máximo de una línea de órdenes es como 4000 u 8000 aprox.
95  Programación / Scripting / Re: videotuto como obtener el codigo fuente de un bat compilado en: 9 Abril 2009, 22:32 pm
Mira, yo utilizo el siguiente método:

Deshabilito la ejecución de cmd.

Código:
[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System]
"DisableCMD"=dword:00000001

Abro Process Monitor, y filtro todo para que solo muestre el trabajo de archivos en el disco duro. (Aunque esto no es tan necesario, quizás para archivos "compilados" con programas personales). Generalmente los archivos "compilados" se extraen en %TEMP% que equivale a Letra:\Document and Settings\NombreUsuarioActual\Configuración local\Temp  , esto aplica a bat compilados con quick batch file compiler , bat file compiler, programas como exescript extraen los archivos a Letra:\Win[dows][Nt]\Temp

Y generalmente extraen los archivos con atributos de oculto.

Luego se ve el código, y ya está. Yo no necesito cambiar los atributos porque tengo habilitada en opciones de carpeta ver los archivos ocultos , de sistema y carpetas de sistema.

El código no se alcanza a ejecutar porque ha sido deshabilitada la ejecución de archivos bat. (Hay que asegurarse de que realmente sea un bat "compilado" porque sino puedes ejecutar código malicioso en tu máquina).

Finalmente se activa la ejecuón de cmd.

Código:
[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System]
"DisableCMD"=dword:00000000
96  Programación / Scripting / Re: Filtro Anti- BatchInyection en: 5 Abril 2009, 07:41 am
simplemente es para dejar claro la forma de utilizar tu código, ya que no es un filtro propiamente tal, sino una forma de tratar a las variables para que su contenido no se ejecute.
97  Programación / Scripting / Re: Filtro Anti- BatchInyection en: 5 Abril 2009, 02:06 am
Dejo, otro filtro que encontré, que filtra, es decir, quita los carácteres considerados "nocivos".

Código:
@ECHO OFF
SETLOCAL
:INICIO
SET TEXT=
SET /P TEXT=give me your text:
IF DEFINED TEXT (CALL:CLEAN TEXT)
IF DEFINED TEXT (ECHO.%TEXT%)
GOTO:INICIO
ENDLOCAL
GOTO:EOF

:::::::::::::::::::::::::::::::::::::::::::::::::::::::
:CLEAN
:::::::::::::::::::::::::::::::::::::::::::::::::::::::
::Autor Carlos
::version 1.0 more restricted
    SETLOCAL ENABLEDELAYEDEXPANSION
    IF NOT DEFINED %~1 (GOTO:_CLEANE) || (GOTO:_CLEANE)
    SET "CONTENT=!%~1!"
    IF NOT DEFINED CONTENT (GOTO:EOF)
    SET /A COUNT=0
    :_LOOP
        SET "CHAR=!CONTENT:~%COUNT%,1!"
        IF NOT DEFINED CHAR (GOTO:_ENDLOOP)
        SET ADD=FALSE
        FOR %%A IN (0 1 2 3 4 5 6 7 8 9) DO (
            IF [^!CHAR!] EQU [%%A] (SET ADD=TRUE)
        )
        FOR %%A IN (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO (
            IF /I [^!CHAR!] EQU [%%A] (SET ADD=TRUE)
        )
        IF /I [!ADD!] EQU [TRUE] (
            SET "STRING=!STRING!!CHAR!"
        )
        SET /A COUNT +=1
        GOTO:_LOOP
    :_ENDLOOP
        ENDLOCAL&&SET "%~1=%STRING%"
        GOTO:EOF
    :_CLEANE
        ECHO.CLEAN FUNCTION RECEIVE A DEFINED VARIABLE.
        PAUSE
        GOTO:EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::
98  Programación / Scripting / Re: Filtro Anti- BatchInyection en: 4 Abril 2009, 22:11 pm
buen trabajo, lo que yo quise decir, es que lo intentarás sin:
!algo!
sino con:
%algo%

¿filtro?
99  Programación / Scripting / Re: Filtro Anti- BatchInyection en: 4 Abril 2009, 19:40 pm
felicitacione Leo, solo una leve corrección, si tienes otra variable con el prefijo name, como por ejemplo: namespace te mostrará ese también.


Código:
@echo off
:code
set namespace=current
set "name="
set /p "name=Teclee su nombre : "
if not defined name (goto:code)
for /f "tokens=2 delims==" %%_ in ('set name') do (
echo.Has escrito : %%_
)
goto:code

solución:

Código:
@echo off
:code
set namespace=current
set "name="
set /p "name=Teclee su nombre : "
if not defined name (goto:code)
for /f "tokens=2 delims==" %%_ in ('set name') do (
echo.Has escrito : %%_
goto :_123456789:
)
:_123456789:
goto:code

Buen método Leo, yo ya había hecho uno, te desafío a que intentes asignar a una variable el contenido de %%_, si así lo haces, ya no hay filtración.
100  Programación / Scripting / [BATCH] Bug comando for (eol) en: 1 Abril 2009, 11:27 am
El comando for del cmd.exe tiene un bug con la opción /f.

El manual dice que eol es el último carácter  de la línea y en realidad es el primero, por lo que debería llamarse bol (begin of line)

El bug está en la opción eol del comando for /f, la opción por defecto es ';' el manual no dice nada de esto, por lo que si tenemos líneas que comienzen con ; estas serán ignoradas (y creíamos que leíamos todas las líneas de un archivo  :huh:).

Yo pensé que esto se solucionaba sobreescribiendo la opción eol así: eol=
Pero descubrí otro problema, si se ingresa más de una opción, el espacio separador entre la opción eol= y siguienteOpción es considerado por eol además de separador de opción, como carácter de comienzo de línea, por lo que líneas que comienzen con espacio son ignoradas.

Entonces, pensé que la solución era escribir eol= al final para que no hubiera ninguna otra opción a continuación y así realmente sobreescibir la opción por defecto (';') y leer todas las líneas de un archivo, y yo daba el tema por solucionado cuando hoy intentando hacer un script realmente útil para convertir unos textos con otro formato (el batch de utilidad) cuando descubrí que la opción eol es aún más tonta, y considera las comillas de cierre de opciones como carácter por lo que líneas que comienzen con '"' no son leídas.

Ahora ¿cómo leemos todas las líneas de un archivo con for /f?
Aún no le encuentro solución, ni me interesa, solo lo digo para que sepan.

Ejemplo:

archivo.txt
Código:
texto normal
;punto y coma
   con espacio al principio
"entre comillas"

lee.bat
Código:
@echo off
Echo.Contenido del archivo:
Echo.texto normal
Echo.;punto y coma
Echo.   con espacio al principio
Echo."entre comillas"
Echo.

Echo.Ahora las lecturas de for /f.
echo.
echo.Opcion: "tokens=* delims="
for /f "tokens=* delims=" %%a in (archivo.txt) do echo.%%a
echo.

echo.Opcion: "eol= tokens=* delims="
for /f "eol= tokens=* delims=" %%a in (archivo.txt) do echo.%%a
echo.

echo.Opcion: tokens=* delims= eol=
for /f "tokens=* delims= eol=" %%a in (archivo.txt) do echo.%%a
echo.
pause


resultado:
Código:
Opcion: "tokens=* delims="
texto normal
   con espacio al principio
"entre comillas"

Opcion: "eol= tokens=* delims="
texto normal
;punto y coma
"entre comillas"

Opcion: tokens=* delims= eol=
texto normal
;punto y coma
   con espacio al principio


O se pierden las líneas que comienzan con ; o espacio o comillas dobles.

Queda la pregunta de cómo leer todas las líneas. Me molesta el error, porque cmd.exe es un software viejo, desde el windows nt (1995) que existe, y además de que la documentación lo llama eol cuando debería llamarse bof (revisen la documentación, dice carácter de final de línea) no menciona que la opción por defecto es ';' y me molesta más aún cuando perdí tiempo buscando solución al resultado de mi script. Esto lo he probado en windows seven. 14 años cmd.exe con el error del eof, ¿no creen que es mucho?
Páginas: 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16 17
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines