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

#5571
Hay muchas, pero muchísimas cosas inapropiadas en el código fuente que has compartido.






1.
El textbox de tu aplicación está limitado a 32.767 caracteres (Int16), no sirve de mucho si intentas cargar una lista de passwords personalizada.

De hecho no es ninguna buena idea intentar mostrar una lista entera de passwords en el layout de un control, por que se hace muy pesado con listas largas, y esto limitará mucho tu aplicación, pero bueno, puedes aumentar el límite al máximo permitido de esta manera:
Código (vbnet) [Seleccionar]
Me.TextBox1.MaxLength = Integer.MaxValue






2.
Citar
Código (vbnet) [Seleccionar]
   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       Dim fic As String = System.AppDomain.CurrentDomain.BaseDirectory.ToString & "diccionario.lst"
       Dim sr1 As New System.IO.StreamReader(fic)
       Dim texto As String

       TextBox3.Text = fic
       Label1.Text = ""
       texto = sr1.ReadToEnd()
       sr1.Close()
       TextBox1.Text = texto

   End Sub

Primero lees el archivo que almacena las combinaciones en la variable texto, luego pasas el valor de la variable a la lógica de un textbox, y por último, en otra parte del código, interactuas con el texto contenido en el TextBox para procesar cada linea de passwords.

¿te das cuenta de lo inapropiado que resulta hacer todo eso, si por ejemplo la lista de passwords fuese de +100.000?, supone una disminuición de rendimiento tanto por la sobre-carga/saturación del textbox como por el tiempo de ejecución que consumes al partir el texto del textbox por cada uno de los passwords que haya escrito, no hay necesidad de realizar tantas operaciones ni hacerlo de esa manera.

He modificado el código para estructuarlo mejor y otras mejoras de rendimiento:

Código (vbnet) [Seleccionar]
   Private passFilepath As String = Path.Combine(Application.StartupPath, "diccionario.lst")
   Private passwordList As IEnumerable(Of String)

   Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
   Handles MyBase.Load

       Me.LoadDefaults()

   End Sub

   Private Sub LoadDefaults()

       Me.Label1.ResetText()
       Me.tb_PassFilepath.Text = Me.passFilepath

       Try
           Me.passwordList = Me.GetPasswordList(Me.passFilepath)

       Catch ex As Exception
           Throw

       End Try

       With Me.tb_PasswordList
           .MaxLength = Integer.MaxValue
           .SuspendLayout()
           .Text = String.Join(ControlChars.NewLine, Me.passwordList)
           .ResumeLayout()
       End With

   End Sub

   ''' <summary>
   ''' Gets the password list.
   ''' </summary>
   ''' <param name="passFilepath">The passwords filepath.</param>
   ''' <returns>IEnumerable(Of System.String).</returns>
   Private Iterator Function GetPasswordList(ByVal passFilepath As String) As IEnumerable(Of String)

       Using sr As New StreamReader(passFilepath, Encoding.Default)

           Do Until sr.EndOfStream
               Yield sr.ReadLine
           Loop

       End Using

   End Function


Nota: te recuerdo que el textbox está LIMITADO, así que en la práctica real no sirve con niguna lista de passwords de las que se suelen utilizar para un ataque de este tipo, utiliza la variable de la colección de passwords, que tiene una muy mayor capacidad.






3.
El método Application.DoEvents() no cumple la misma funcionalidad que en VB6, y en VB.Net se suele utilizar (o mejor dicho se suele recurrir cómo último recurso a su utilización) para evitar cuelgues (detenciones) en el hilo del Form debido a un mal diseño de la aplicación por parte del programador, pero en tu caso ni siquiera necesitas recurrir a su utilización por que no estás desarrollando una aplicación multi-threading, ¿por qué lo utilizas?, no lo hagas, sea por el motivo que sea, puedes solucionarlo debidamente.






4.
Saca todas las requests fuera de los event-handlers, TODAS, sacalas, y añadelas en distintos métodos que cumplan sus distintas funcionalidades, es horrible tal y cómo está.
Además estás accediendo continuamente a las propiedades .Text de los contorles, no lo hagas, inicializa las variables necesarias para asignar esos valores y usa esas variables.

Hay que intentar separar los Datos, de la UI, pero los programadores de WinForms no solemos hacernos una idea muy clara de este concepto debido a la propia naturaleza de la tecnología WinForms y los malos hábitos de programación que ello supone.






5.
Elimina las importaciones de estos namespaces, no los estás utilizando:
Código (vbnet) [Seleccionar]
Imports System.ComponentModel
Imports System.Data






6.
Cita de: Source-code
Código (vbnet) [Seleccionar]
   Public Sub button1_Click(sender As Object, e As EventArgs) Handles button1.Click

       If File.Exists(tb_PassFilepath.Text) Then
           ' ...
           sText = Split(tb_PasswordList.Text, vbCrLf)
           textBox_pass.Text = sText(i)
           ' ...
           Dim request As HttpWebRequest = DirectCast(WebRequest.Create(URL), HttpWebRequest)
           ' ...
           If DirectCast(response, HttpWebResponse).StatusCode = HttpStatusCode.Redirect Then
               ' ...
           Else
               i += 1
               ' ...
               button1.PerformClick()
           End If

       Else
           ' ...
       End If

   End Sub

Esa es la parte más problemática del código y por la que has formulado tu duda.

Al leer y analizar esa parte del código simplemente no podia creerme lo que estaba viendo, si no recuerdo mal vienes de VB6 y eso significa que sabes perfectamente como desarrollar un búcle normal y corriente para iterar la colección de passwords, pero en lugar de eso has preferido recurrir a la manera más rebuscada que yo he visto para llevar a cabo una operación repetitiva, interactuando innecesariamente con la UI (con el botón) y partiendo el texto del textbox de manera continua, ¡muy mal!.

Realmente tienes que tratar de modificar (mejorar) toda la lógica que estás empleando en el desarrollo de la aplicación, de todo el código.

Te muestro un ejemplo de cómo podrías estructurarlo:

Código (vbnet) [Seleccionar]
   Public Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
   Handles button1.Click

       Me.TestPasswordList(Me.passwordList)

   End Sub

   Private Sub TestPasswordList(ByVal passwordList As IEnumerable(Of String))

       Dim cookies As CookieContainer = Nothing

       For Each password As String In passwordList

           If Me.TestPassword(password, cookies) Then
               Me.ReportSuccessPassword(password)
               Exit Sub
           End If

       Next password

       Me.ReportFailedPassword()

   End Sub

   ''' <summary>
   ''' Tests the current password.
   ''' </summary>
   ''' <param name="password">The password.</param>
   ''' <param name="cookies">The byreferred cookie container.</param>
   ''' <returns><c>true</c> if password successful, <c>false</c> otherwise.</returns>
   Private Function TestPassword(ByVal password As String,
                                 ByRef cookies As CookieContainer) As Boolean

       ' tus llamadas a los métodos de las querys para testear el password actual, aquí.
       Me.SetCookies(cookies)
       Dim response As HttpWebResponse = Me.GetLoginResponse(cookies)
       ' etc...

       Return (response.StatusCode = HttpStatusCode.Redirect)

   End Function

   Private Sub SetCookies(ByRef cookies As CookieContainer)

       If cookies Is Nothing Then
           cookies = New CookieContainer
           ' tu query para setear el contenedor de cookies aquí.
       Else
           ' salgo, dando por hecho que la sesión de la cookie no haya expirado.
           Exit Sub
       End If

   End Sub

   Private Function GetLoginResponse(ByVal cookies As CookieContainer) As HttpWebResponse

       ' tu query POST de login aquí.
       Return DirectCast(response, HttpWebResponse)

   End Function

   Private Sub ReportSuccessPassword(ByVal password As String)

       MessageBox.Show(String.Format("Contraseña aceptada: ""{0}""", password), Me.Text,
                       MessageBoxButtons.OK, MessageBoxIcon.Information)

   End Sub

   Private Sub ReportFailedPassword()

       MessageBox.Show("Ninguna contraseña aceptada.", Me.Text,
                       MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

   End Sub







7.
Me pregunto si las peticiones que haces realmente servirán para algo puesto que FaceBook, al igual que cualquier otro servicio tan popular, tiene un límite de intentos de login y suelen hacer bloqueos del usuario (no basados en la ip que efectua el intento).

Por ende, si no me equivoco, yo imagino (no lo he testeado) que en algún momento el "ataque" no servirá practicamente para nada, puesto que a partir de aquí, desgraciadamente todo dejaría de ser útil tras llegar al límite de intentos del servicio:
Código (vbnet) [Seleccionar]
Dim loginURL As String = "https://www.facebook.com/login.php?login_attempt=1"
request...
response...


PD: Hay bastantes cosas más en el source que necesitarían un arreglo, pero me ahorro los comentarios porque no quiero abusar xD y también por que son fallos menos relevantes que no afectan al core.

Saludos!
#5572
El error es self-explanatory, se explica por si mismo, no puedes convertir un ListItem (es decir, el Item seleccionado de un DropDownList) a un Control de tipo DropDownList, no tiene sentido.

No manejo ASP.Net, pero el problema es sencillo de entender y corregir, prueba así:
Código (csharp) [Seleccionar]
ListItem currentItem = ((DropDownList)sender).SelectedItem;

ViewState["idNombre"] = Convert.ToInt32(currentItem);


PD: La próxima vez trata de publicar bien el código... la mitad de los keywords estaban pegados los unos a los otros y no se entendia.

Saludos
#5574
Estoy deacuerdo con WHK, pero por otro lado creo que los usuarios son más que conscientes de que la ayuda ofrecida en un chat, en la mayoría de los casos no será tan cualificada cómo el hecho de crear un post y que lo puedan ver cientos de personas para poder darte distintos enfoques al problema que tengas, además, hay que tener en cuenta que el foro también está para publicar aportes, etc, no solo para pedir y pedir aunque muchos no se hayan enterado todavía de ese pequeño detalle (lo digo por los usuarios que se limiten a pedir).

Creo que para evitar lo que comenta WHK, simplemente se podrían imponer una especie de normas (ej: 'Usar el chat para divertirse, y el foro para formular dudas'), y banear del chat a aquellos que las incumpliesen, no entiendo de SMF pero creo que se podrá hacer algo así y ya me imagino que los baneos no serían muy efectivos pero se banearía sin cesar a cualquier reincidente, ¿no os parece bien?.

Al menos se podría probar la idea, para ver que tal funciona y si aporta beneficios o todo lo contrario, tampoco sería un cambio muy grande en el que te la juegas a todo o nada... siempre se puede recular xD.

Saludos!
#5575
Para llevar a cabo querys complejas y muy selectivas en las que, literalmente te pierdes, puedes hecharle mano a ciertas extensiones que se integran en la IDE de VisualStudio y te hacen practicamente todo el trabajo sucio, este tipo de característica se conoce con el intuitivo nombre de SQL Query Builder.

Una aplicación opensource:
SQLeo Visual Query Builder

Una aplicación comercial excelente:
Active Query Builder .NET WinForms Edition

Y otra aplicación comercial en la que es facil encontrar el crack (solo añado el dato, ya que no está permitido pedir o publicar cracks en el foro):
DbSchema
http://www.youtube.com/watch?v=fXPAC9l5ZPo

Espero que te sirva de algo,
Saludos
#5576
Sigue este consejo: Olvida completamente Batch, y también el uso de aplicaciones externas commandline en la medida de lo posible, jeje.

Con el ejemplo que te he mostrado, primero deberás comprobar si el formato que le dí a las cadenas es la correcta para tí, y podrás leer la salida del proceso 'pgdump.exe', ya a apartir de ahí implementar una ProgressBar es cosa tuya, por que para llevarlo a cabo se requiere leer la salida estándar del proceso (en el event-handler 'PGprocess_OutputDataReceived') y realizar las estimaciones necesarias teniendo en cuenta que dicho programa muestre algún indicador de progreso, claro está, ya sea un porcentaje o la cantidad de archivos copiados y restantes.

Si el proceso no muestra ese tipo de información entonces solo puedes crear una barra de progreso con progreso indeterminado, y esperar a que el la instancia del proceso envie el evento de terminación del proceso (event-handler 'PGprocess_Exited')

Código (vbnet) [Seleccionar]
       With Me.ProgressBar1
           .Style = ProgressBarStyle.Marquee
           .MarqueeAnimationSpeed = 50
       End With


EDITO: Se me ocurre una cosa viable, si conoces la cantidad de archivos a copiar y su ubicación, entonces podrías calcular el porcentaje de la barra de progreso leyendo los bytes totales de los archivos de origen, y los bytes que se han copiado en el directorio destino.
Puedes utilizar la class FileInfo para leer el tamaño de bytes de un archivo.

Saludos
#5577
¿y donde está el código de VB.Net?, aquí no hacemos tareas.

Además desconocemos la salida de dicho proceso "pgdump", y se te han dado indicaciones de lo que debes hacer.

De todas formas te muestro un extenso ejemplo sobre cómo traducir ese batch-script a VB.Net, y cómo leer la salida normal/error de dicho proceso, de forma asíncrona:

Código (vbnet) [Seleccionar]
Imports System.Globalization
Imports System.IO
Imports System.Text

Public Class TestForm

   ReadOnly backupDirDateFormat As String =
       Date.Today.ToString("yyyy\\MM\\ddMMyyyy", CultureInfo.InvariantCulture)

   ReadOnly dbFilenameDateFormat As String =
       Date.Now.ToString("ddMMyyyy_HH\H\Hmm\M\M", CultureInfo.InvariantCulture)

   ReadOnly sourceDir As String = "D:\ruta\backup"
   ReadOnly backupDir As String = Path.Combine(Me.sourceDir, Me.backupDirDateFormat)
   ReadOnly dbSrcFilepath As String = Path.Combine(Me.backupDir, String.Format("basede datos-{0}.backup", Me.dbFilenameDateFormat))
   ReadOnly dbDstFilepath As String = Path.Combine(Application.StartupPath, "Nombre del backup")

   ReadOnly pgFilepath As String = "C:\Archivos de programa\PostgreSQL\9.3\bin\pg_dump.exe"
   ReadOnly pgPassword As String = String.Empty
   ReadOnly pgArgsFormat As String =
       <a>--host "localhost" --port "5432" --username "siscolsi" --format "custom" --blobs --verbose --file "{0}" "{1}"</a>.Value

   Private WithEvents pgProcess As New Process With
       {
           .EnableRaisingEvents = True,
           .StartInfo = New ProcessStartInfo With
                        {
                            .FileName = Me.pgFilepath,
                            .Arguments = String.Format(Me.pgArgsFormat, Me.dbSrcFilepath, Me.dbDstFilepath),
                            .CreateNoWindow = False,
                            .RedirectStandardError = True,
                            .RedirectStandardOutput = True,
                            .StandardErrorEncoding = Encoding.Default,
                            .StandardOutputEncoding = Encoding.Default,
                            .UseShellExecute = False,
                            .WindowStyle = ProcessWindowStyle.Hidden,
                            .WorkingDirectory = Application.StartupPath
                        }
       }

   Private Sub TestForm_Load() _
   Handles MyBase.Load

       If Not Directory.Exists(Me.sourceDir) Then
           Try
               Directory.CreateDirectory(Me.sourceDir)

           Catch ex As Exception
               Throw

           End Try
       End If

       With Me.pgProcess
           .Start()
           .BeginOutputReadLine()
           .BeginErrorReadLine()
           ' .WaitForExit(milliseconds:=0)
           .WaitForExit()
       End With

   End Sub

   Private Sub PGprocess_OutputDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs) _
   Handles pgProcess.OutputDataReceived

       If Not String.IsNullOrEmpty(e.Data) Then
           Debug.WriteLine(String.Format("out: {0}", e.Data))
       End If

   End Sub

   Private Sub PGprocess_ErrorDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs) _
   Handles pgProcess.ErrorDataReceived

       If Not String.IsNullOrEmpty(e.Data) Then
           Debug.WriteLine(String.Format("err: {0}", e.Data))
       End If

   End Sub

   Private Sub PGprocess_Exited(ByVal sender As Object, ByVal e As EventArgs) _
   Handles pgProcess.Exited

       Debug.Print(String.Format("Process exited at {0}", Date.Now.ToShortTimeString))

   End Sub

End Class


Lee un poco sobre la class Process, y técnicas de IPC en .Net.

Saludos.
#5578
Buenas

El planteamiento de la aplicación es incorrecta, ya que estás utilizando una herramienta simple de procesamiento por lotes desde un lenguaje de alto nivel.

1. Puedes hacer TODO lo que puedas hacer en Batch, utilizando puro código .Net.

2. Para implementar una barra de progreso a un proceso externo, en este caso CMD, debes utilizar técnicas de IPC (inter-process comunication) para leer el stream de salida de la CMD y tomar como referencia algún indicador que sirva para estimar el porcentaje de progresión.

El caso es que formulas una duda donde está implicado un código Batch pero ni siquiera muestras el contenido del Batch-Script ¿?,
Si en la consola no se muestra ningún tipo de indicador (1%...100% / 1 de 100) entonces olvídate de poder implementar una barra de progreso en tu aplicación de escritorio, a menos que no te importe utilizar una barra de progreso de estado indeterminado (sin mínimo, ni máximo).

Saludos
#5580
Windows / Re: Exportar maquina virtual.
2 Marzo 2015, 04:50 AM
Cita de: potagero en  2 Marzo 2015, 00:25 AMMi pregunta es: Para que sirve el "exportar una maquina" si copiando la carpeta donde esta la maquina virtual es mas rapido y eficaz?

¿Por qué CCleaner tiene una opción para vacíar la papelera, si podemos eliminar la carpeta de la papelera y es más rápido?.

VMWare/VBox son aplicaciones para administrar máquinas virtuales, ¿cómo esperas que no tengan características de importación/exportación?, usemos un poco más la lógica, la pregunta que has formulado no tiene ningún sentido en mi opinión,
simplemente las aplicaciones profesionales ofrecen características para automatizar tareas, además, estás aplicaciones están pensadas para usuarios de todos los niveles, no todos van a conocer la ubicación del directorio de las VM, ni darán por hecho que puedan copiar/pegar la carpeta de una VM directamente, recurriran a la aplicación para que les haga dicha tarea, ya que cómo ya he dicho, es una característica de automatización.

Yo también siempre copio las VM directamente, pero si dices que la característica de exportar tarda más (considerablemente más, me imagino) entonces puede ser algo muy comprensible, ya que probablemente VVMWare/VBox hagan un análisis del estado de la VM antes o durante el copiado/exportación, pero si quieres conocer más detalles en profundidad sobre dicha operación de exportación... ¿por que no le formulas esa misma pregunta al soporte de VMWare/VBox?.

Saludos!