Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#2191
Foro Libre / Re: Empezando a Programar
3 Junio 2017, 23:09 PM
¿Es esto una "DUDA GENERAL"?, yo creo que no.

Gracias por aportar pero las cosas se deben hacer bien, compañero. Los aportes de programación van en el foro correspondiente, y los tutoriales, en el foro de tutoriales.

Y bueno, con respecto al video... he dejado de mirarlo cuando ha dicho "Tipado dinámico". "Tipado" no es una palabra existente en el diccionario y supongo que le habrá parecido bien utilizar esa palabra inventada intentando hacer referencia al verbo "Tipear" el cual si que está registrado en la RAE pero proviene de una invención latinoamericana del Inglés (como suele ocurrir por costumbre). Bien podría haber dicho "Digitación" en su lugar, aunque lo que está diciendo no es una traducción limpia de lo que intenta traducir y explicar.

El problema con los "profesores" autodidactas éstos de Internet y Youtube, sobre todo los de habla Hispana (en realidad solamente los de habla Hispana y concretamente de latinoamérica) es que se expresan como el culo, inventándose palabras y traducciones del Inglés, y así más que enseñar lo que consiguen es desinformar y confundir. No hay más que ver como muchos programadores (y lamentablemente también profesores de profesión) utilizan la traducción de Array -> Arreglo con lo que podemos hacernos una idea de la incultura verbal que sufre la comunidad de habla Hispana (y aquí incluyo también a España) a la hora de expresarse en temas que conciernen a la programación...

Yo por ese motivo al que quiera estudiar con videos solamente le recomendaría instruirse visualizando video-tutoriales de programadores con certificado y que hablen Inglés de forma nativa. Ni videos de españoles ni mucho menos de latinoamericanos, aunque por supuesto hay programadores españoles y latinoamericanos que se expresan y explican bien verbálmente, pero por lo general son pocos.
De hecho, en el pasado visualicé videos de instructores rusos que hablaban inglés y era un poco complicado de tragar por la pronunciación extraña con el acento ruso, pero que me han dejaron ciertos conceptos muchísimo más claros y limpios que si un español o latinoamericano hubiese intentado explicar lo mismo. La diferencia es muy grande entre un individuo aleatorio de Internet que dice saber lo suficiente como para impartir clases en Youtube (por que es que luego se va a expresar verbálmente de forma muy incompetente y confusa), y un programador que tenga un certificado sin importar el idioma que éste hable, quien entiende de lo que está hablando y conoce las palabras/términos correctos que se deben utilizar para enseñar bien.

Saludos!
#2192
Hola.

Creo que mejor deberías tratar de preguntar aquí:

Saludos!
#2193
Scripting / Re: activar una casilla con batch
3 Junio 2017, 21:32 PM
Puedes utilizar la aplicación RegShot (o cualquier otro monitor del registro de Windows) para descubrir facilmente cual es el valor de registro que se modifica al marcar esa casilla y aceptar la ventana de diálogo.

Saludos!
#2194
Disculpa el atrevimiento compañero pero yo intuyo que no te debe ser muy satisfactorio usar VB.NET, me refiero, ¿no te sería de mayor utilidad usar C# por las similitudes sintácticas con Python?.




Por lo que creo haber entendido, estás intentando rellenar los datos de un formulario web de forma "visual" y automatizada mediante el control WebBrowser y no encuentras un identificador que te sirva para identificar un control en específico. Pues bien, en teoría deberías poder utilizar el valor del atributo "name" como identificador (es decir, el string "textfield" en el código que mostraste).

Te muestro un ejemplo completo con la página de login de http://foro.elhacker.net :

Código (html4strict) [Seleccionar]
...
</tr><tr class="windowbg">
<td width="50%" align="right"><b>Usuario:</b></td>
<td><input type="text" name="user" size="20" value=""/></td>
</tr><tr class="windowbg">
<td align="right"><b>Contrase&ntilde;a:</b></td>
<td><input type="password" name="passwrd" value="" size="20"/></td>
...


Código (vbnet) [Seleccionar]
Public NotInheritable Class Form1 : Inherits Form

   Private ReadOnly uri As New Uri("http://foro.elhacker.net/login.html")

   Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
       Me.WebBrowser1.Navigate(uri)
   End Sub

   Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

       Dim wb As WebBrowser = DirectCast(sender, WebBrowser)

       If (wb.Document.Forms.Count = 0) OrElse (wb.Url <> Me.uri) Then
           Exit Sub
       End If

       Dim doc As HtmlDocument = wb.Document
       Dim form As HtmlElement = doc.Forms(0)
       Dim user As HtmlElement = doc.GetElementById("user")
       Dim passwrd As HtmlElement = doc.GetElementById("passwrd")

       user?.SetAttribute("value", "My Username")
       passwrd?.SetAttribute("value", "My Password")
       form.InvokeMember("Submit")

   End Sub

End Class


Y para obtener el valor de un attributo puedes hacerlo de la siguiente manera siguiendo el ejemplo de arriba:

Código (vbnet) [Seleccionar]
Dim attribSize As String = user.GetAttribute("size") ' 20
Dim attribType As String = user.GetAttribute("type") ' text


Si quieres algo más sofisticado a la hora de parsear, entonces es MUY recomendable utilizar la librería de terceros HtmlAgilityPack para .NET.
...O en su defecto puedes importar la librería MSHTML y usar sus interfaces (las clases System.Windows.Forms.HtmlDocument / HtmlDomDocument / HtmlElement y etcétera son wrappers de los miembros/interfaces expuestos en MSHTML) pero estos miembros no están muy documentados en la referencia online de la MSDN, así que dependiendo de para qué, sería un poco ir a ciegas.

Saludos!
#2195
Cita de: RevolucionVegana en  2 Junio 2017, 21:19 PM
Hola a todos tengo un programa que permite al usuario introducir datos y estos deben ser almacenados en structs, vale hasta aquí no hay problema si se la cantidad de structs que va a utilizar el usuario por ejemplo 3 structs los declaro y después solo tendría que ir asignando la cuestión está en que no sabré cuantos struct introducirá el usuario entonces mi duda viene en que como puedo crear los struct en tiempo de ejecución con el nombre que introduzca el usuario es decir, no se como puedo hacer para darle nombre a un struct o a una variable en tiempo de ejecución y que sea un nombre que por ejemplo haya sido recogido en una variable (por poner un ejemplo), no se si es con eso del preprocesador ese o creando una clase y crear instancias y jugar con eso, en fin cuál sería la forma correcta de hacer esto? Gracias y un saludo es en C#

Estás contando la forma en la que has decidido resolver un problema, es decir estás explicando la solución que tienes pensada, pero no has mencionado cual es el problema que te ha llevado a enfocarte en esa solución...

A mi no me cuentes eso, da detalles claros y específicos. :P Cuéntanos el propósito que hay detrás de lo que estás intentando hacer, es decir, ¿con que intención quieres hacer eso, que es lo que quieres resolver haciendo eso y de esa manera en específico?, y no me digas que el motivo es "para poder introducir datos"  :P. Más que nada si insisto en que des esta información (por que nunca la das) es por que puede que explicándonos el problema podamos hallar una solución más...óptima a las circunstancias y a tus necesidades reales.

De todas formas, respondiendo a tus dudas y extendiendo la respuesta del compañero @NEBIRE:

Para declarar un array de estructuras de tamaño "indeterminado" cuyo tamaño lo determinas en tiempo de ejecución, pues tan solo tienes que declararlo e inicializarlo de la siguiente manera:
Código (csharp) [Seleccionar]
int structSize = 10;
ValueType[] structs = new ValueType[structSize];

...Donde el valor de la variable structSize lo proveería el usuario en tiempo de ejecución mediante tu interfáz gráfica o como sea, y ya te encargarías de controlarlo como sea que lo tengas pensado hacer.

Y con respecto a la asignación de nombres dinámicos a variables, eso no es algo posible en C#, sin embargo puedes utilizar cualquiera de los tipos de estructuras de datos en .NET que implementan los principios de un Array Asociativo, una estructura de datos de tipo key/value. por ejemplo una colección que implemente la interfáz IDictionary o ICollection<KeyValuePair<TKey, TValue>> para permitirte asignarle identificadores/keys cuyos nombres sean creados de forma dinámica en tiempo de ejecución. Por ejemplo puedes usar el tipo SortedDictionary<TKey, TValue>:

Código (csharp) [Seleccionar]
int structSize = 10;

int keyIndex = 1;
string keyName = string.Format("Key{0}", keyIndex); // "Key1"

Dictionary<string, ValueType[]> dict = new SortedDictionary<string, ValueType[]>(StringComparer.Ordinal);
dict.Add(keyName, new ValueType[structSize]);
// ...

ValueType[] structs = dict(keyName);

...Donde las variables structSize y keyIndex y/o keyName tendrian un valor dinámico cuando adaptases el código a tus necesidades.

Saludos!
#2196
Las opiniones que se te han dado no me resultan negativas, más bien son críticas constructivas que dan a conocer cierta información u otras alternativas (excepto el comentario de Rando, QUE NUNCA SE SABE QUE COÑO ESTÁ DICIENDO XDDD :P), y en fin, que no creo que debamos empezar una discusión por un motivo así, más cuando todo es por que tú fuiste quien hizo un mal uso de la palabra "gratis", así que no lo pagues con nosotros.

Lo que intento decr es que yo creo que tu aporte ha sido bien recibido (aunque en realidad no sea gratis), y no debes pensar lo contrario ni ponerte a la defensiva...

Saludos!
#2198
Hola.

Cita de: Apollo en  2 Junio 2017, 22:03 PMAhora mismo estoy bloqueado ya que el Ctrl + Alt + Supr no se puede bloquear y el administrador de tareas no puedo pararlo

Eso son dos cosas bien distintas. Deberías haber empezado por explicar cual es tu intención real: deshabiltar la ejecución del taskmanager, no la secuencia CTRL+ALT+DEL.

Dicho esto, ten en cuenta que deshabilitar el taskmanager de Windows de poco o nada te servirá para impedir que un usuario con un mínimo de conocimientos informáticos pueda hallar la forma de matar el proceso puesto que ese usuario puede coger y utilizar cualquier otro administrador de tareas de los miles que hay por Internet para finalizar la ejecución de tu proceso (ej. AutoRuns, System Explorer o Anvir TaskManager). Así que más bien lo que te convendría hacer para añadir una capa adicional de seguridad sería asígnarle el estado de 'proceso crítico del sistema' a tu proceso, el cual, si finaliza su ejecución de forma anómala entonces Windows responderá automaticamente mostrando un BSOD.

Como norma general normálmente no le doy a nadie el trabajo regalado, sino las herramientas para poder hacerlo (y más cuando ni siquiera me agradecen la ayuda), sin embargo la idea de bloquear el administrador de tareas me pareció interesante para desarrollar un snippet rehutilizable, y en fin, aquí lo tienes:


Y para activar el estado de 'proceso crítico' puedes utilizar la función SetCurrentProcessIsCritical de la API de Windows, pero primero conviene asignarle ciertos privilegios al proceso. Aquí mostré un ejemplo completo:


De nada.

Saludos.
#2199
¿Cómo bloquear la ejecución del administrador de tareas de Windows?

Este código lo he desarrollado para darle solución al siguiente problema: bloquear la ejecución del administrador de tareas de Windows (taskmgr.exe)

Además de eso, el código también bloquea la ejecución del hijack/sustituto del admiinstrador de tareas... suponiendo que el usuario haya definido tal hijack en el registro de Windows, claro está.

La metodología que he usado es la más sencilla (y por ende también la más eludible): abrir el stream del archivo para mantenerlo en uso y prohibir la compartición del archivo.
De esta manera, y mientras tengamos abierto el stream en nuestra aplicación, evitaremos una ejecución a demanda del administrador de tareas, incluyendo el intento de ejecución desde el diálogo de Logon de Windows.

Por supuesto el efecto no es permanente, tan solo perdurará hasta que nuestra aplicación finalice su ejecución o hasta que por el motivo que sea decidamos liberar el stream manualmente.

He usado esta metodología basicamente por que la intención de esto no es el desarrollo de malware (y para ser sincero no he querido complicarme más la vida puesto que el diseño de Malware y la ing. inversa no es mi fuerte), sino una simple utilidad a la que darle un uso ético, como por ejemplo podría ser poner impedimentos para intentar evitar que el usuario pueda matar nuestro proceso mientras estamos realizando una operación crítica e irreversible que podria dañar el sistema operativo si se detiene de forma anómala.

Código (vbnet) [Seleccionar]
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Prevents any attempt for the current user from reading and running the 'taskmgr.exe' file
''' and any defined hijack in the system (if any)
''' <para></para>
''' Note that the file blocking is not permanent.
''' <para></para>
''' This function will return a <see cref="FileStream"/> Array that contains the 'taskmgr.exe' file stream(s)
''' opened with <see cref="FileAccess.Read"/> access and <see cref="FileShare.None"/> sharing.
''' <para></para>
''' So in order to unblock the access to the file(s), just dispose the opened stream(s) or terminate the calling aplication.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <returns>
''' A <see cref="FileStream"/> Array that contains the 'taskmgr.exe' file stream(s)
''' opened with <see cref="FileAccess.Read"/> access and <see cref="FileShare.None"/> sharing.
''' </returns>
''' ----------------------------------------------------------------------------------------------------
Public Shared Function BlockWindowsTaskManager() As FileStream()

   ' Build a list with the legit tskmgr.exe file(s).
   Dim tkmgrFiles As New List(Of FileInfo) From { ' C:\Windows\System32\taskmgr.exe
       New FileInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "taskmgr.exe"))
   }
   If (Environment.Is64BitOperatingSystem) AndAlso (Environment.Is64BitProcess) Then ' C:\Windows\SysWOW64\taskmgr.exe
       tkmgrFiles.Add(New FileInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.SystemX86), "taskmgr.exe")))
   End If

   ' Add to the list the taskmgr.exe hijacked file, if any.
   Dim hijackValue As String = GetTaskManagerHijack()
   If Not String.IsNullOrWhiteSpace(hijackValue) Then
       tkmgrFiles.Add(New FileInfo(hijackValue))
   End If

   ' Build a list where to add the open file streams.
   Dim tkmgrStreams As New List(Of FileStream)

   tkmgrFiles.ForEach(
       Sub(ByVal file As FileInfo)
           ' Ensure that any instance of the taskmgr processes are running; otherwise, we must terminate them.
           Dim processName As String = Path.GetFileNameWithoutExtension(file.Name)
           For Each p As Process In Process.GetProcessesByName(processName)
               Using p
                   Try
                       If Not (p.HasExited) Then
                           p.Kill()
                           ' Wait a reasonable time interval if stuck/hanged process.
                           p.WaitForExit(CInt(TimeSpan.FromSeconds(10).TotalMilliseconds))
                       End If
                   Catch ex As Exception ' Failed to terminate the process
                       ' Since we can still block an open file (if it was open with read sharing) but
                       ' we can't terminate the current running/unblocked instance,
                       ' so we conclude the overall operation failed and rollback previous blocks then finish here.
                       tkmgrStreams.ForEach(Sub(sr As Stream) sr.Dispose())
                       Throw
                   End Try
               End Using ' p
           Next p

           If (file.Exists()) Then
               Dim fs As FileStream
               Try
                   fs = file.Open(FileMode.Open, FileAccess.Read, FileShare.None)
                   tkmgrStreams.Add(fs)

                   ' Catch ex As IOException When (ex.HResult = -2147024864) ' File its being used by this or another process.
                   ' This exception can occur if calling this function twice without disposing the returned stream(s) before the second call.

               Catch ex As Exception ' File can't be opened for whatever reason.
                   ' Since we can't open/block all the required files,
                   ' we conclude the overall operation failed and rollback previous blocks then finish here.
                   tkmgrStreams.ForEach(Sub(sr As Stream) sr.Dispose())
                   Throw

               End Try
           End If

       End Sub)

   Return tkmgrStreams.ToArray()

End Function


+

Código (vbnet) [Seleccionar]
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Determines whether the legit 'taskmgr.exe' file has a hijack defined in the Windows registry,
''' then returns the registry value that points to the hijack file path.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <returns>
''' The resulting hijack registry value,
''' or <see langword="Nothing"/> (null) if a 'taskmgr.exe' hijack doesn't exist.
''' </returns>
''' ----------------------------------------------------------------------------------------------------
Public Shared Function GetTaskManagerHijack() As String

   Dim hijackSubkey As String = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskmgr.exe"

   Using regKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default)

       Return DirectCast(regKey.OpenSubKey(hijackSubkey, RegistryRights.ReadKey)?.
                                GetValue("Debugger", Nothing, RegistryValueOptions.None), String)

   End Using

End Function


Ejemplo de uso:
Código (vbnet) [Seleccionar]
Dim tskmgrFiles As FileStream() = BlockWindowsTaskManager()
For Each fs As FileStream In tskmgrFiles
   Debug.WriteLine(fs.Name)
   ' fs.Close() ' Call this to unblock file access.
Next fs


Resultado de ejecución en mi equipo de 64-Bits con Windows 10 instalado donde tengo asignado un hijack para correr el administrador de tareas de Windows 7 en lugar del de Windows 10:
Cita de: Visual Studio Debug Output WindowC:\Windows\system32\taskmgr.exe
C:\Windows\SysWOW64\taskmgr.exe
C:\Windows\system32\taskmgr7.exe

Hasta donde yo he probado, funciona.

Nótese que para optimizar los resultados el executable que llame a la función BlockWindowsTaskManager() debe ser de la misma arquitectura que el sistema operativo donde éste sea ejecutado, pues si Windows es de 64-Bit y nuestro executable es de 32, entonces Windows automáticamente hará redirección WOW64, o dicho de otra forma si estamos en Win64 y llamamos a la función BlockWindowsTaskManager() desde un WinExe32 entonces tan solo podremos bloquear 1 taskmgr.exe de los 2 taskmgr.exe legítimos en Windows x64. Y lo mismo sucederá con el hijack puesto que un executable de 32 bits no puede acceder al visor de registro de 64 bits.

Saludos!
#2200
Cita de: Orubatosu en  2 Junio 2017, 22:41 PMSiento si te parece repetitivo o molesto.

Para decir frases vagas y que no sientes, mejor no digas nada. Por supuesto que no lo sientes cuando lo haces una y otra vez, y no solo conmigo (o con el resto de "insolentes" e "insensatos" usuarios que se sientan aludidos por que alguna vez se hayan atrevido a poner en entredicho tus creencias científicas por cuestionarse por un solo segundo que la Ciencia pueda estar equivocada con la forma de La Tierra), sino también a otro usuario que me ha ido advirtiendo con el tiempo de que a él le parece que sueles lanzar indirectas en ciertos mensajes, y yo también me he fijado que a mi me lanzas alguna que otra o al menos eso es lo que me transmites por que me parece que esa es tu intención, colar de vez en cuando alguna gilipollez ofensiva pra intentar "picar" y burlarte de la gente que se cuestiona ciertas cosas con las que tu no compartes la misma opinión, pero es que prefiero no hacerte ni caso cuando veo que haces ese tipo de comentarios por que si esa es la manera que tu tienes de entrar a debatir pues resulta muy decepcionante que ese comportamiento provenga de alguien que sabe muchas cosas de Ciencia en general, sinceramente. Pero es que con ese comentario que hiciste de la conspiración de los pílotos aereos y etc ya me he hartado definitivamente de ver tanto de lo mismo una y otra vez, no pareces tener límites en eso.

No te preocupes, te voy a dar la alegria de cerrar este debate de la tierra plana que tanta inquietud te genera.

Tema Cerrado

Saludos.