RTL_USER_PROCESS_PARAMETERS

Iniciado por Vaagish, 22 Julio 2014, 07:02 AM

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

Vaagish

Hi!
Tengo la estructura RTL_USER_PROCESS_PARAMETERS, de la cual quiero sacar la linea de comandos,, eso lo tengo, esta en CommandLine  pero si quisiera sacar la cantidad de argumentos como podría hacerlo?

Código (asm) [Seleccionar]
Structure RTL_USER_PROCESS_PARAMETERS at 002D1528
Address   Hex dump     Decoded data             Comments
002D1528  AC090000     DD 000009AC              ; MaximumLength = 2476.
002D152C  AC090000     DD 000009AC              ; Length = 2476.
002D1530  01000000     DD 00000001              ; Flags = 1
002D1534  00000000     DD 00000000              ; DebugFlags = 0
002D1538  00000000     DD 00000000              ; ConsoleHandle = NULL
002D153C  00000000     DD 00000000              ; ConsoleFlags = 0
002D1540  00000000     DD 00000000              ; StdInputHandle = NULL
002D1544  00000000     DD 00000000              ; StdOutputHandle = NULL
002D1548  00000000     DD 00000000              ; StdErrorHandle = NULL
002D154C  3A00         DW 3A                    ; CurrentDir_Size = 58.
002D154E  0802         DW 208                   ; CurrentDir_Maxsize = 520.
002D1550  C8202D00     DD 002D20C8              ; CurrentDir = "C:\Users\Central\Desktop\MRS\"
002D1554  0C000000     DD 0000000C              ; CurrentDirectoryHandle = 0000000C
002D1558  FC03         DW 3FC                   ; DllPath_Size = 1020.
002D155A  FE03         DW 3FE                   ; DllPath_Maxlen = 1022.
002D155C  C8192D00     DD 002D19C8              ; DllPath = "C:\Users\Central\Desktop\MRS;;C:\Windows\system32;C:\Windows\system;C:\Windows;.;C:\Program Files\PC Connectivity Solution\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\AT"
002D1560  4800         DW 48                    ; ImagePath_Size = 72.
002D1562  4A00         DW 4A                    ; ImagePath_Maxlen = 74.
002D1564  C61D2D00     DD 002D1DC6              ; ImagePath = "C:\Users\Central\Desktop\MRS\MRS.exe"
002D1568  5600         DW 56                    ; CommandLine_Size = 86.
002D156A  5800         DW 58                    ; CommandLine_Maxlen = 88.
002D156C  101E2D00     DD 002D1E10              ; CommandLine = ""C:\Users\Central\Desktop\MRS\MRS.exe" HOLA"
002D1570  10082D00     DD 002D0810              ; Environment = 002D0810
002D1574  00000000     DD 00000000              ; StartPosLeft = 0
002D1578  00000000     DD 00000000              ; StartPosTop = 0
002D157C  00000000     DD 00000000              ; Width = 0
002D1580  00000000     DD 00000000              ; Height = 0
002D1584  00000000     DD 00000000              ; CharWidth = 0
002D1588  00000000     DD 00000000              ; CharHeight = 0
002D158C  00000000     DD 00000000              ; ConsoleTextAttributes = 0
002D1590  81000000     DD 00000081              ; WindowFlags = 81
002D1594  0A000000     DD 0000000A              ; ShowFlags = 0A
002D1598  4800         DW 48                    ; Title_Size = 72.
002D159A  4A00         DW 4A                    ; Title_Maxlen = 74.
002D159C  681E2D00     DD 002D1E68              ; Title = "C:\Users\Central\Desktop\MRS\MRS.exe"
002D15A0  1E00         DW 1E                    ; DesktopName_Size = 30.
002D15A2  2000         DW 20                    ; DesktopName_Maxlen = 32.
002D15A4  B21E2D00     DD 002D1EB2              ; DesktopName = "WinSta0\Default"
002D15A8  0000         DW 0                     ; ShellInfo_Size = 0
002D15AA  0200         DW 2                     ; ShellInfo_Maxlen = 2
002D15AC  D21E2D00     DD 002D1ED2              ; ShellInfo = ""
002D15B0  0000         DW 0                     ; RuntimeData_Size = 0
002D15B2  0000         DW 0                     ; RuntimeData_Maxlen = 0
002D15B4  00000000     DD 00000000              ; RuntimeData = NULL


Como podrán ver, hay un argumento: "HOLA", la cadena es Unicode, así que no me sirve buscar '\0', aunque también esta CommandLine_Size y  CommandLine_Maxlen, yo preciso saber si se recibió al menos un argumento..

Gracias! Saludos!  ;D

PD: Ya que estamos, si alguien resuelve como sacar solo el argumento que tire el dato, aclaro por las dudas.. en el dump muestra
Citar"C0:0\0U0s0e0r0s0\0C0e0n0t0r0a0l0\0D0e0s0k0t0o0p0\0M0R0S0\0M0R0S0.0e0x0e0"0H0O0L0A"
, por eso pido consejo..

Eternal Idol

Podes usar CommandLineToArgvW.

Si es Unicode el fin de la cadena es un doble 0  ;D
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

Bien! Eso funciono.. solo que me seria mucho mejor sin apis.. (no aclare de entrada, mal yo)

Saludos!  ;D

Eternal Idol

#3
Bueno, tenes el codigo en assembly  ::) Lo unico que hace es trabajar con una ristra de bytes mas conocidos como cadenas  ;D

PD. Ahi tenes un UNICODE_STRING, asi que usa siempre el campo de tamaño correspondiente, no tiene que ser una cadena terminada en 0 a la fuerza.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

CitarBueno, tenes el codigo en assembly  ::) Lo unico que hace es trabajar con una ristra de bytes mas conocidos como cadenas  ;D

PD. Ahi tenes un UNICODE_STRING, asi que usa siempre el campo de tamaño correspondiente, no tiene que ser una cadena terminada en 0 a la fuerza.

O sea... a manoplas  :xD
Pero.. el campo CommandLine_Size = 86. No corresponde con la información, a menos que cuente todos los 0's entre letra y letra, ahí es mas parecido si.. :huh:

Saludos! Gracias!

Eternal Idol

¿Y que queres? O API o a mano, otra no queda  ;D Capaz alguien ya lo hizo, busca por ahi, alguna RTL ...

El campo coincide exactamente, es el tamaño en BYTEs y en Unicode cada caracter ocupa dos BYTEs, son 43 caracteres y 86 bytes (no incluye 0 terminador).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

Citar¿Y que queres? O API o a mano, otra no queda  ;D Capaz alguien ya lo hizo, busca por ahi, alguna RTL ...
Ok.. ok :xD Pense que a lo mejor podía usar alguno de esos campos y llegar a la "cadena" argumento.. Solo el "HOLA"

CitarEl campo coincide exactamente, es el tamaño en BYTEs y en Unicode cada caracter ocupa dos BYTEs, son 43 caracteres y 86 bytes (no incluye 0 terminador).
Ha,,, por eso los 0's  :P

Gracias!  ;)

Eternal Idol

Cita de: Vaagish en 22 Julio 2014, 22:25 PM
Ok.. ok :xD Pense que a lo mejor podía usar alguno de esos campos y llegar a la "cadena" argumento.. Solo el "HOLA"

Tal vez podrias comparar con ImagePath ... igual podrian haber mas parametros ... asi que mejor usa la API o implementala  :silbar:
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

CitarTal vez podrias comparar con ImagePath ... igual podrian haber mas parametros ... asi que mejor usa la API o implementala  :silbar:

Justo,, justo entre para preguntar eso.. estaba viendo que con ImagePath, ImagePath_Size, CommandLine y CommandLine_Size se puede resolver todo.. unas restas y listo.. pero.. es confiable el metodo? Mas allá que el dia de mañana cambie el PEB.. Me refiero a si es 100% seguro en todas las pc's?

Yo espero recibir un argumento o ninguno..  :rolleyes:

Saludos!

Eternal Idol

Creo que por las vias normales el ejecutable siempre es el primer parametro (argv[0]) pero es posible llamar a CreateProcess y que no sea el caso ... igual podes comparar y si la linea de comandos no contiene a la imagen asumir que desde el primer caracter es argv[1] ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón