Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: nhaalclkiemr en 21 Mayo 2007, 22:07 pm



Título: Problema con "tokens"
Publicado por: nhaalclkiemr en 21 Mayo 2007, 22:07 pm
Weno, este es un BATCH de SirDarkCat de hace un tiempo para extraer el PID de los procesos:

Código:
@echo off
FOR /F "tokens=1,2" %%i IN ('tasklist') DO (
IF "%%i"=="cmd.exe.exe" (
SET pid1=%%j
)
IF "%%i"=="wmplayer.exe" (
SET pid2=%%j
)
IF "%%i"=="MessengerDiscovery Live.exe" (
SET pid3=%%j
)
)
echo %pid1%
echo %pid2%
echo %pid3%

Pues tiene un problema k necesito solucionar...funciona siempre bien, excepto en el caso de k el .exe tenga un espacio en el nombre...

Por ejemplo en el ejemplo k puse arrivano se extraera bien el %pid3% de "MessengerDiscovery Live.exe"

El problema viene en que la variable %%i es la linea de caracteres asta k encuentrta un espacio, la variabl %%f es la siguiente, por eso cuando el proceso tiene un espacio en el medio coje como el PID "Live.exe" en este caso, ya k %%f será "Live.exe"

La salida de tasklist es así:

Código:
Nombre de imagen             PID Nombre de sesión Núm. de  Uso de memor
========================= ====== ================ ======== ============
System Idle Process            0 Console                 0        16 KB
System                         4 Console                 0       220 KB
smss.exe                     904 Console                 0       392 KB
csrss.exe                    972 Console                 0    10.608 KB
winlogon.exe                 996 Console                 0     1.620 KB
services.exe                1040 Console                 0     7.268 KB
lsass.exe                   1052 Console                 0     1.480 KB
svchost.exe                 1216 Console                 0     6.904 KB
svchost.exe                 1272 Console                 0     6.744 KB
svchost.exe                 1396 Console                 0    25.504 KB
svchost.exe                 1612 Console                 0     5.572 KB
svchost.exe                 1716 Console                 0     6.612 KB
spoolsv.exe                 1812 Console                 0     7.740 KB
svchost.exe                  504 Console                 0     4.976 KB
nod32krn.exe                 572 Console                 0    22.048 KB
nvsvc32.exe                  620 Console                 0     3.952 KB
svchost.exe                  656 Console                 0     6.676 KB
wdfmgr.exe                   708 Console                 0     1.780 KB
alg.exe                     1892 Console                 0     5.912 KB
explorer.exe                 792 Console                 0    52.800 KB
nod32kui.exe                1672 Console                 0     2.260 KB
TBPANEL.exe                 1692 Console                 0     5.460 KB
ctfmon.exe                  1584 Console                 0     5.836 KB
MessengerDiscovery Live.e    324 Console                 0     9.028 KB
usnsvc.exe                  3636 Console                 0     2.596 KB
LVCOMSX.EXE                 3220 Console                 0     4.616 KB
firefox.exe                 2464 Console                 0   111.456 KB
HelpCtr.exe                 3020 Console                 0     2.992 KB
HelpSvc.exe                 3984 Console                 0    13.948 KB
HelpHost.exe                2936 Console                 0    10.792 KB
cmd.exe                     3096 Console                 0     4.400 KB
cmd.exe                     1596 Console                 0     1.628 KB
wmplayer.exe                2836 Console                 0     6.128 KB
cmd.exe                     3256 Console                 0     4.396 KB
tasklist.exe                2480 Console                 0     6.620 KB
wmiprvse.exe                1360 Console                 0     7.896 KB


Pues por ejemplo de wmplayer.exe cojerá como PID 2836 por lo k funcionará...pero el de MessengerDiscovery Live.e Solo cojerá MessengerDiscovery como ejecutable en %%i y como PID Live.e que es %%f

Aún por encima de eso me acabo de dar cuenta de otra cosa, si el ejecutable tiene el nombre muy largo no lo cojerá correctamente...supongo k esto se puede aumentar aumentando el bufer de ancho de la consola...tengo k provar...

Weno, el tema k mas me interesa es el del problema k se causa cuando el ejecutable tiene un espacio (o mas) por medio...y weno lo de k si el ejecutable es largo se acorta tambien me imprta...

¿Como areglariais eso?

Saludos ;) ;)


Título: Re: Problema con "tokens"
Publicado por: sirdarckcat en 22 Mayo 2007, 04:21 am
:P que interesante xD
se me ocurren muchas soluciones.. muy muy largas xD
implementar un split por tamaño es una de ellas.. es decir que tome los primeros 25 caracteres, y despues el que sigue, y asi.. pero creo que lo mejor seria.. trabajar hacia atras..
esto consistiria en 2 pasos..
primero hacer un programa que imprima todo alrevez jaja
y despues uno que con ese output alreves, haga lo mismo que mi primer programa..

aunque talves sea mejor usar debug..

en todo caso, una solucion rapida, seria..
Código:
@echo off
FOR /F "tokens=1,2,3" %%i IN ('tasklist') DO (
IF "%%i"=="cmd.exe.exe" (
SET pid1=%%j
)
IF "%%i"=="wmplayer.exe" (
SET pid2=%%j
)
IF "%%i"=="MessengerDiscovery" (
SET pid3=%%k
)
)
echo %pid1%
echo %pid2%
echo %pid3%


Título: Re: Problema con "tokens"
Publicado por: nhaalclkiemr en 23 Mayo 2007, 21:55 pm
Weno, eso serviría si conoces que aplicacion tiene espacio...pero es k mira...realmente yo lo k quiero hacer es guardar en varias variables el nombre de los procesos en ejecución...y en otra variable el PID de la variable.

Mi idea es ejecutar un tasklist /NH que tendrá esta salida:

Código:
System Idle Process            0 Console                 0        16 KB
System                         4 Console                 0       220 KB
smss.exe                     904 Console                 0       392 KB
csrss.exe                    972 Console                 0     6.412 KB
winlogon.exe                 996 Console                 0     1.080 KB
services.exe                1040 Console                 0     7.320 KB
lsass.exe                   1052 Console                 0     2.808 KB
svchost.exe                 1212 Console                 0     6.904 KB
svchost.exe                 1264 Console                 0     6.920 KB
svchost.exe                 1388 Console                 0    22.568 KB
svchost.exe                 1572 Console                 0     5.784 KB
svchost.exe                 1652 Console                 0     6.604 KB
spoolsv.exe                 1792 Console                 0     9.172 KB
svchost.exe                  732 Console                 0     5.000 KB
nod32krn.exe                 780 Console                 0    22.200 KB
explorer.exe                 812 Console                 0    12.920 KB
nvsvc32.exe                  804 Console                 0     3.812 KB
svchost.exe                  940 Console                 0     6.864 KB
wdfmgr.exe                   544 Console                 0     1.800 KB
nod32kui.exe                1972 Console                 0     1.264 KB
TBPANEL.exe                  228 Console                 0       896 KB
ctfmon.exe                   352 Console                 0     1.904 KB
wmplayer.exe                 360 Console                 0     5.312 KB
alg.exe                     2440 Console                 0     6.024 KB
usnsvc.exe                  2876 Console                 0     2.704 KB
Virtual PC.exe              2320 Console                 0     5.668 KB
msnmsgr.exe                 1512 Console                 0    22.292 KB
MessengerDiscovery Live.e   4044 Console                 0     4.900 KB
firefox.exe                 2956 Console                 0    67.508 KB
wmiprvse.exe                3100 Console                 0     8.104 KB
cmd.exe                     2128 Console                 0     4.408 KB
tasklist.exe                2132 Console                 0     6.628 KB

Pues yo lo que quiero es almacenar en una variable pro1 el valor de uno de los procesos y en una variable pid1 el PID de este proceso.
Despues serían las variables pro2 y pid2 para el siguiente proceso...
Y así sucesivamente asta reunir todos los procesos con su PID...

El problema es sobre todo el tema de los espacios, tu aki no sabes en k kaso el ejecutable tiene espacio...despues el problema de que se acorten los procesos con nombre muy largos weno, supongo k no tendrá solución...

¿Como sería entonces para lo k yo quiero?


Título: Re: Problema con "tokens"
Publicado por: sirdarckcat en 24 Mayo 2007, 02:11 am
fuera de lo que te dije de hacer un programa que invierta una linea, creo que no se puede.
en debug se puede hacer.. con la interrupcion 21 y las funciones a y 9h

Saludos!!