viernes, 31 de mayo de 2013

Creakear Claves de hasta 16 Caracteres

En marzo, Nate Anderson, subdirector de Ars Technica y subdirector y novato auto-admitido del descifrado de contraseñas, descargó una lista de más de 16.449 contraseñas y a las pocas horas, descifró casi la mitad de ellos. La moraleja de la historia: si un reportero con una formación cero en el arte de descifrado de contraseñas puede lograr tales resultados, imaginen lo que los atacantes más experimentados pueden hacer.
  Se sabe que las contraseñas débiles son terriblemente insegura pero lo ¿qué pasaría si se lograra descifrar cualquier contraseña de hasta 16 caracteres?
Para conocer la respuesta se consultó a tres expertos de craqueo de contraseñas para atacar a la misma lista Anderson y el grupo de hackers ha conseguido descifrar más de 14.800 contraseñas supuestamente aleatorias de la lista de 16.449 Hash MD5 (sin salt), utilizando el Cracking de contraseñas con GPU. 
Mientras que la tasa de éxito de 47% de Anderson fue impresionante, fue minúsculo en comparación con lo que hicieron los crackers ya que el "menos exitoso" del trío, utilizando la menor cantidad de hardware, sólo dedicó una hora para descifrar 62 por ciento de las contraseñas y aquí explicó el proceso completo.

MD5 está defasado, debido a colisiones encontradas hace años por un grupo de hackers chinos, por lo que deberían pasar a otro algoritmo mas potente (claro está)

Saludos. 

FBI mantuvo funcionando sitio web pedófilo para identificar a sus usuarios

Según el periódico estadounidense The San Francisco Chronicle, el FBI decomisó un sitio web dedicado a la difusión de pornografía infantil en noviembre del año pasado, pero que en vez de cerrarlo inmediatamente, lo mantuvieron activo durante dos semanas para así identificar a los pedófilos clientes del servicio.
El periódico afirma que si bien anteriormente agentes del FBI han simulado ser pedófilos, esta sería la primera vez que el FBI ha facilitado activamente el compartir pornografía infantil, siguiendo un método usual entre las agencias del orden cuando permiten que continúen activas redes de narcotráfico o prostitución esperando el momento adecuado para capturar a la mayor cantidad posible de implicados en los hechos delictuales.

Durante esas dos semanas, la agencia intentó identificar a más de 5.600 usuarios, los que fueron responsables de compartir más de 10.000 fotos de niños siendo abusados en el sitio web que contenía más de 24.000 posteos. Hasta el momento, la operación ha permitido capturar al menos a un sospechoso, pues la investigación continúa mientras que se están realizando los trámites para presentar los cargos ante el poder judicial.

¿Qué crees? ¿Debe el FBI o cualquier policía de investigaciones del mundo mantener activos sitios web de pedofilia si posiblemente puede servir para capturar a más involucrados?


Fuente: SeguInfo

Es relativo, no se si será bueno, aunque a veces hay que sacrificar un poco para lograr terminar con algo.

Saludos.

jueves, 30 de mayo de 2013

Twitter ; "La doble autenticación NO es suficiente"

Dick Costolo, CEO de Twitter, ha reconocido públicamente que la autenticación en dos pasos no es suficiente protección contra los hackeos, tan habituales en la red de micromensajes. “Lanzamos la verificación de dos pasos, pero dos pasos no detendrán algunos de estos ataques. Tenemos a un montón de personas trabajando en esto, y estamos invirtiendo en seguridad”, indicó el directivo.
Tales declaraciones se recogen apenas una semana después de que la red social implantará el método de verificación en dos pasos, consistentes en introducir el nombre de usuario y contraseña y una clave adicional y aleatoria que se envía mediante SMS al móvil del usuario, todo para poder entrar en el servicio. Lo utilizan con éxito otros grandes de Internet, es el caso de Google.
Sin embargo, algo hicieron mal en Twitter porque no habían pasado dos días desde el anuncio y la noticia ya era que la doble autenticación de Twitter podía hackearse en menos de 140 caracteres, los típicos de los mensajes en esta red social.
El CEO de Twitter no adelantó nada de los planes que tiene la compañía para mejorar la situación, pero está claro que tienen mucho trabajo por delante, teniendo en cuanta el importantísimo poder mediático que ha adquirido la plataforma en los últimos tiempos.


Fuente: MuySeguridad

"Mouse Recorder" desde .NET

Una manera eficiente de capturar el recorrido de un mouse para luego implementarlo al estilo"Robot" ésta colaboración es de ElecKtro H@cker;

Captura/Guarda cada coordenada en una lista de punteros.
Captura/Guarda cada click en un tipo de diccionario.
Luego, reproduce el contenido de la lista y del diccionario.

Aquí el code para .NET 2012 

Public Class Form1

    ' BY ELEKTRO H@CKER
    ' Copia este Form en un nuevo proyecto y ejecútalo.

    Dim Coordenates_List As New List(Of Point)
    Dim Clicks_Dictionary As New Dictionary(Of Int64, MouseButton)

    Dim Click_Count As Int32 = 0
    Dim Last_ClickState_Left As Int64 = 999
    Dim Last_ClickState_Right As Int64 = 999

    Dim WithEvents Record_Timer As New Timer

    Dim WithEvents Button_Record As New Button, Button_Stop As New Button, Button_Reproduce As New Button

    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

    Public Declare Sub Mouse_Event Lib "User32" Alias "mouse_event" (ByVal dwFlags As MouseButton, ByVal dx As Integer, ByVal dy As Integer, ByVal dwData As Integer, ByVal dwExtraInfo As Integer)

    Public Thread_is_completed As Boolean = False

    Dim Thread_MousePlay_Var As System.Threading.Thread = New Threading.Thread(AddressOf Thread_MousePlay)

    Public Enum MouseButton

        Left_Down = &H2    ' Left button (hold)
        Left_Up = &H4      ' Left button (release)

        Right_Down = &H8   ' Right button (hold)
        Right_Up = &H10    ' Right button (release)

        Middle_Down = &H20 ' Middle button (hold)
        Middle_Up = &H40   ' Middle button (release)

        Left               ' Left   button (press)
        Right              ' Right  button (press)
        Middle             ' Middle button (press)

    End Enum

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Record_Timer.Interval = 15
        Button_Record.Text = "Record" : Button_Stop.Text = "Stop" : Button_Reproduce.Text = "Reproduce"
        Button_Record.Location = New Point(20, 20) : Button_Stop.Location = New Point(Button_Record.Right + 10, 20) : Button_Reproduce.Location = New Point(Button_Stop.Right + 10, 20)
        Me.Controls.Add(Button_Record) : Me.Controls.Add(Button_Stop) : Me.Controls.Add(Button_Reproduce)
        Me.Size = New Point(300, 100)
    End Sub

    Private Sub Button_Record_Click(sender As Object, e As EventArgs) Handles Button_Record.Click
        Coordenates_List.Clear() : Clicks_Dictionary.Clear() : Click_Count = 0
        Record_Timer.Start()
    End Sub

    Private Sub Button_Stop_Click(sender As Object, e As EventArgs) Handles Button_Stop.Click
        Record_Timer.Stop()
    End Sub

    Private Sub Button_Reproduce_Click(sender As Object, e As EventArgs) Handles Button_Reproduce.Click

        Thread_MousePlay_Var = New Threading.Thread(AddressOf Thread_MousePlay)
        Thread_MousePlay_Var.IsBackground = True
        Thread_MousePlay_Var.Start()

        Thread_is_completed = False
        While Not Thread_is_completed = True : Application.DoEvents() : End While
        MsgBox("Finished")

    End Sub

    Private Sub Record_Timer_Tick(sender As Object, e As EventArgs) Handles Record_Timer.Tick

        Coordenates_List.Add(MousePosition)

        If Not Last_ClickState_Left = GetAsyncKeyState(1) Then
            Last_ClickState_Left = GetAsyncKeyState(1)
            If GetAsyncKeyState(1) = 32768 Then
                Click_Count += 1
                Coordenates_List.Add(Nothing)
                Clicks_Dictionary.Add(Click_Count, MouseButton.Left_Down)
            ElseIf GetAsyncKeyState(1) = 0 Then
                Click_Count += 1
                Coordenates_List.Add(Nothing)
                Clicks_Dictionary.Add(Click_Count, MouseButton.Left_Up)
            End If
        End If

        If Not Last_ClickState_Right = GetAsyncKeyState(2) Then
            Last_ClickState_Right = GetAsyncKeyState(2)
            If GetAsyncKeyState(2) = 32768 Then
                Click_Count += 1
                Coordenates_List.Add(Nothing)
                Clicks_Dictionary.Add(Click_Count, MouseButton.Right_Down)
            ElseIf GetAsyncKeyState(2) = 0 Then
                Click_Count += 1
                Coordenates_List.Add(Nothing)
                Clicks_Dictionary.Add(Click_Count, MouseButton.Right_Up)
            End If
        End If

    End Sub

    Private Sub Mouse_Click(ByVal MouseButton As MouseButton)
        Select Case MouseButton
            Case MouseButton.Left : Mouse_Event(MouseButton.Left_Down, 0, 0, 0, 0) : Mouse_Event(MouseButton.Left_Up, 0, 0, 0, 0)
            Case MouseButton.Right : Mouse_Event(MouseButton.Right_Down, 0, 0, 0, 0) : Mouse_Event(MouseButton.Right_Up, 0, 0, 0, 0)
            Case MouseButton.Middle : Mouse_Event(MouseButton.Middle_Down, 0, 0, 0, 0) : Mouse_Event(MouseButton.Middle_Up, 0, 0, 0, 0)
            Case Else : Mouse_Event(MouseButton, 0, 0, 0, 0)
        End Select
    End Sub

    Sub Thread_MousePlay()

        Click_Count = 0

        For Each Coordenate In Coordenates_List
            Application.DoEvents()
            Threading.Thread.Sleep(15)

            If Coordenate = Nothing Then
                Click_Count += 1
                If Click_Count > 1 Then Mouse_Click(Clicks_Dictionary.Item(Click_Count))
            Else
                System.Windows.Forms.Cursor.Position = Coordenate
            End If

        Next

        Thread_is_completed = True

    End Sub

End Class
Hay otras formas de realizarlo pero a mi criterio esta es mas eficiente que las otras que vi.

Saludos.

miércoles, 29 de mayo de 2013

Ciberespías chinos roban diseños de armas estadounidenses

Piratas informáticos chinos habrían robado una veintena de diseños de armas avanzadas estadounidenses según revela el Washington Post, citando un informe del Comité de Ciencias de la Defensa del país americano.
Entre los diseños comprometidos se encontrarían los cazas F/A-18, el V-22 Osprey, el helicóptero Black Hawk y el avión de combate F-35. También barcos de combate y sistemas de misiles como el Patriot o el sistema de defensa de misiles balísticos Aegis.
El informe, enviado al Congreso a principios de este mes indica que, “China estaba usando el espionaje para modernizar su Ejército y que la piratería informática era un preocupación seria“. Aunque desde China se insistió que el informe no tenía fundamento, los militares aseguran que era “atribuible directamente al Gobierno y el Ejército chino”.
La revelación de este informe coincide con un reporte de la prensa australiana que afirma que piratas informáticos chinos han robado los diseños de la nueva sede australiana de espionaje a través del hackeo de los ordenadores de un subcontratista de la obra.
El edificio está diseñado para formar parte de una red global de inteligencia que incluya a Estados Unidos y Reino Unido y la prensa australiana asegura que se trata de una oleada de ciberataques contra objetivos militares y empresariales en un país aliado de Estados Unidos.
Como sabes, China se encuentra en medio de las críticas de ciberespionaje masivo, supuestamente mediante un auténtico ejército virtual.

Fuente: Muy Seguridad

Vulnerabilidades en Windows 7/8, OSX, SmartPhones y Navegadores

Muchos pueden creer que no es importante estos datos, pero sinceramente al menos para mí, no como aficionado a la materia sino como usuario diario de estos software es de suma importancia, lo suficiente muchas veces como para ver si uso el software correcto, o a la hora de aconsejar a otros sobre que productos decantarse. Es algo que siempre me ha sorprendido enormemente, cualquier persona se escandaliza si ve una pantalla de publicidad con un mensaje extraño, pero nadie se escandaliza cuando le dicen que su dispositivo o su equipo se encuentra en serias deficiencia en cuanto a seguridad, y que cualquier Hacker inteligente podría tomar el control de su dispositivo. Cuando intentas contarle esto a las personas te miran raro, o te dicen eso de: “Total para lo que tengo…”. En cambio, es cuando a esa persona le sucede algo por culpa de ello, es ya siempre tarde, y no son uno ni dos ni tres los casos al año, raro es el mes que no leo en mi correo o por cualquier otro medio alguien que tiene un problema, y no precisamente por que el navegador no deja de reenviarle a webs pornográficas.
Es por todo ello, que el principal problema de seguridad que existe a día de hoy es la ignorancia, el creer que nadie puede estar interesado en nuestros datos (cuando son oro puro para muchos), el creer por pura fe lo que le dicen otros, que posiblemente tienen aun más problemas que él, aunque no lo sepa. La mejor forma de enseñar, no es con miedo, no es con críticas baratas, es simplemente mostrando datos, enseñando que hay, que no hay, y que cada cual sea por tanto quien saque sus propias conclusiones.

Bien, el objetivo de este post es ver el número de fallos de seguridad (vulnerabilidades) acumulado durante este año pasado 2012 en sistemas operativos de escritorio, de dispositivos portátiles y de navegadores web. Eso no quiere decir que no existan otros problemas de seguridad ni mucho menos, los datos que puedo mostrar son datos PÚBLICOS que cualquiera puede tener acceso, en concreto mis datos recogidos son simplemente los CVE registrados. CVE son los reportes (un identificador) que asigna un organismo internacional a vulnerabilidades/fallos de seguridad. Hay que tener en cuenta ciertas cosas a la hora de interpretar los datos
Primero, un CVE no implica de modo alguno que un hacker podría hacerse con el control total de tu dispositivo a través de él, un CVE es un problema potencial de seguridad que puede ser explotado con fines malignos o no, y que por supuesto su peligrosidad varía enormemente en relación con el tipo de fallo descubierto. De este modo, tenemos problemas de seguridad menos peligrosos como los que “simplemente” exponen datos de nuestro sistema o datos sensibles al exterior sin nuestro consentimiento, pasando por fallos de seguridad que permiten el Spoofing, el Cracking, escaladas de privilegios, ataques de denegación de servicio… y por supuesto hasta llegar al peor de los males, como es el acceso al sistema, que son vulnerabilidades que se pueden aprovechar para la ejecución de código remoto (digamos, el santo grial siempre del Hacker).
 Segundo, hacer una tabla con el número de fallos de seguridad sin tener en cuenta otros datos sería totalmente demagogo, hay que entender muchas veces como se recogen dichos datos, si puede existir una explicación “decente” a dichos números… de lo contrario entraríamos de nuevo en escribir artículos partidistas en los que el redactor siempre haría que ganasen unos y otros en función de sus intereses. Aquí no se trata de ganar o perder, se trata de exponer datos y explicar lo que puede explicarse con las razones que puedan darse. A partir de ahí, cada cual tendrá que pensar un poco por si mismo y sacar sus conclusiones, no creerse los datos expuestos y fijarse simplemente en una tabla de datos.

Por el segundo punto, voy por ello a recalcar con mucho énfasis la gran importancia de esos “atenuantes” o “detonantes” de este número de vulnerabilidades. De echo en mi humilde opinión, que un producto haya obtenido el mayor número de vulnerabilidades a lo largo del año no implica que sea un producto inseguro per sé, eso hace solo un 50%, el otro 50% reside (de nuevo en mi opinión) en las políticas de actualizaciones/distribuciones de los desarrolladores, y del índice de penetración del mercado que posee cada producto. Las políticas de actualizaciones/distribución es esencial para tener nuestros sistemas dispositivos siempre al día, y la penetración del mercado es esencial para entender que plataformas están mucho más expuestas a todo tipo de ataques, a fin de cuenta nadie quiere encontrar un fallo de seguridad que afecte a un 1% de la población, lo intentan buscar en productos que afecte a un 50%, aunque sea 100 veces más complicado el hacerlo.
Las versiones usadas en cada caso, correspondería con las versiones que dicho producto ha tenido durante estos pasados 365 días. Por ejemplo en el caso de Windows, se han sumado los fallos de seguridad de Windows 7 de TODO el año conjuntamente con los de Windows 8 de TODO el año (desde que se terminó la versión de oro en Agosto. Lo mismo para cada producto. El índice de penetración de mercado se calcula simplemente tomando el porcentaje global de cada producto, y este a su vez se divide en función del índice de penetración que posee dicha versión dentro de dicho producto, si posee más de una versión ese producto en el período a tratar (2012), se suma dicho porcentaje. Es  decir, que si Windows posee por ejemplo un 90% de cuota de mercado y fuésemos a tratar SOLO windows XP, y que este fuese un 50% de todos los Windows instalados, el porcentaje real de Windows XP sería por tanto de un 45%, el 50% de ese 90%. Es simple.

Seguir leyendo desde la fuente

lunes, 27 de mayo de 2013

MP3Crank Leecher By EleKtro H@cker [.NET]

Trabajo de un colega de elhacker.net;

Una aplicación que descarga todas las urls de los últimos albums de la página :
                                                      http://www.mp3crank.com/ 

las urls se almacenan en un archivo de texto para copiarlas en Jdownloader (por ejemplo), también se pueden copiar desde el menú contextual de la aplicación.

La aplicación guarda las urls copiadas en un archivo log para no volver a descargarlas en el próximo uso de la aplicación.

...Y las urls se pueden filtrar por estilos de música.

                 Versión 1.1 :






Link de Descarga que incluye Código fuente, versión instalable y portable:

Descargar desde Electro Studios 




Gracias a Electro por su colaboración.


Saludos.

sábado, 25 de mayo de 2013

Google Anuncia Cambio de Certificados SSL a 2048 Bits

Google ha anunciado la próxima actualización de sus claves de cifrado Secure Sockets Layer (SSL) a una longitud de 2048 bits, con el objetivo de fortalecer la seguridad de sus servicios.
La actualización comenzará el 1 de agosto y espera completarse a finales de 2013 “garantizando el tiempo necesario para una implementación cuidadosa antes de fin de año”, explican, ya que puede existir algún conflicto potencial de software con la nueva clave.
Google también actualizará a 2048 bits el certificado raíz que firma todos sus certificados SSL y que utiliza ahora una clave de 1024 bits.
SSL ofrece autenticación y privacidad de la información entre cliente y servidor mediante protocolos criptográficos que proporcionan comunicaciones seguras en Internet, y de ahí la importancia del aumento de longitud de las claves de los certificados SSL de Google a 2048 bits.
SSL se utiliza en una gran variedad de aplicaciones, incluyendo la banca on-line, compras y otras transacciones financieras, pero también se usa para proteger las conexiones en actividades sensibles como el correo electrónico.


Fuente: MuySeguridad.net

Nueva vulnerabilidad 0-Day para Windows (Acceso Físico)

Tavis Ormandy, el investigador de Google conocido por el descubrimiento de una serie de vulnerabilidades en Windows, Java y Flash Player y, sobre todo por su su actitud combativa con respecto a la política de "divulgación responsable", ha estado trabajando en la explotación de una vulnerailidad 0-Day Windows y ha pedido ayuda en la lista de correo Full Disclosure.
Él ha estado trabajando en la vulnerabilidad durante meses y ahora tiene un exploit funcional sobre todas las versiones de Windows.

Según Computerworld, Gregg Keizer de Microsoft ha confirmado el problema, y en la actualidad lo están investigándolo. Por suerte, no está siendo explotada activamente hasta el momento.
Según Secunia, se trata de una vulnerabilidad de elevación de privilegios que permitiría ejecutar código arbitrario en el sistema o un DoS, y afecta a todos Windows, incluídos 7 y 8. Aclaran que la vulnerabilidad sólo puede ser aprovechada por atacantes que tienen acceso físico a la máquina.

Fuente: Segu-Info


Viva nuestro gran Windows (?)

jueves, 23 de mayo de 2013

Calculadora Sencilla en Visual 6

A petición de un colega desarrollé este código sencillo pero efectivo para una calculadora con las operaciones básicas, se trabaja con 2 matrices de controles (para los botones numéricos y para las operaciones)

la primer matriz (de numeros) tiene 10 botones
la segunda son 4, las operaciones básicas.

Luego un botón para la terminación de la cuenta.

un TextBox para los resultados y para visualizar la cuenta en todo su proceso.

Option Explicit
Dim Operacion As String
Dim xlong As Long
Dim Resultado As Long
'----------------------------------------
Private Sub cmdigual_Click()
If Operacion = "+" Then
   Resultado = xlong + Val(display.Text)
   display.Text = Resultado
End If
If Operacion = "-" Then
   Resultado = xlong - Val(display.Text)
   display.Text = Resultado
End If
If Operacion = "*" Then
   Resultado = xlong * Val(display.Text)
   display.Text = Resultado
End If
If Operacion = "/" Then
   If CompruebaDiv(Val(display.Text)) = False Then
      MsgBox "No se puede dividir entre 0", vbOKOnly + vbCritical, "Atencion:Error"
      Exit Sub
   End If
   Resultado = xlong / Val(display.Text)
   display.Text = Resultado
End If
End Sub
Private Sub cmdN_Click(Index As Integer)
display.Text = display.Text & Index
End Sub
Private Sub cmdOperacion_Click(Index As Integer)
Select Case Index
        Case Is = 0
            Operacion = "*"
            xlong = Val(display.Text)
            display.Text = ""
        Case Is = 1
            Operacion = "-"
            xlong = Val(display.Text)
            display.Text = ""
        Case Is = 2
            Operacion = "/"
            xlong = Val(display.Text)
            display.Text = ""
        Case Is = 3
            Operacion = "+"
            xlong = Val(display.Text)
            display.Text = ""
End Select
End Sub
Public Function CompruebaDiv(Valor As Integer) As Boolean
If Valor = 0 Then
   CompruebaDiv = False
Else
   CompruebaDiv = True
End If
End Function




La misma tiene una comprobación para la división que si se divide por 0 bloquea al usuario y no le permite continuar con la ejecución del procedimiento y lo tira del mismo.
La instrucción Val es fundamental para el manejo de los valores correctos y evitar problemas de tipos de dato.


Saludos.

miércoles, 22 de mayo de 2013

Cronómetro inverso en .NET

Por así decirlo, realiza acciones contrarias a la de un cronómetro, este ultimo lo usamos cuando queremos controlar un tiempo pasado, es decir la duración de algúna acción o un monton de cosas mas.

En este caso será al reves, daremos un tiempo y el mismo comenzará a contar hacia atras.

Es a pedido de un colega del foro www.elhacker.net el cual lo pedia pero en la red se encontraban ejemplos de cronometros siempre y cuando se estableciera en un label (se mostraban resultados en el mismo) y no permitía que el usuario tratara con dichos tiempos.

Para ello hemos utilizado unos Control TextBox, ya que queria permitir que el usuario interactue con el tiempo a descontar;

Usamos 1 Timer, 3 cajas de Texto y 2 botones de comando.

Public Class frmMain
    Dim Hora As Integer
    Dim Segundo As Integer
    Dim Minutos As Integer
    'variable para asemejar el segundo
    Dim Mx As Integer
    Private Sub CalcularyMostrar()
        txtHoras.Text = Hora.ToString.PadLeft(2, "0") 'para rellenar en caso que sea menor que dos digitos
        txtMinutos.Text = Minutos.ToString.PadLeft(2, "0")
        txtSegundos.Text = Segundo.ToString.PadLeft(2, "0")
    End Sub
    Private Sub cmdIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdIniciar.Click
        If txtSegundos.Text = "" Then
            MsgBox("debe indicar un tiempo para iniciar retroceso")
            Exit Sub
        End If
        Segundo = txtSegundos.Text
        Minutos = txtMinutos.Text
        Hora = txtHoras.Text
        tmrKonteo.Enabled = True
    End Sub
    Private Sub tmrKonteo_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrKonteo.Tick
        'tick es como el timer_timer en visual 6
        Mx = Mx - 1
        If Mx = 0 Or Mx = -1 Then
            Mx = 9
            Segundo = Segundo - 1
            If Segundo = -1 Then
                Segundo = 59
                Minutos = Minutos - 1
                If Minutos = 0 Then
                    Minutos = 59
                    Hora = Hora - 1
                End If
            End If
            CalcularyMostrar()
        End If
    End Sub
    Private Sub cmdDetiene_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDetiene.Click
        tmrKonteo.Enabled = False
    End Sub
End Class



La sentencia de comparación sobre los segundos que devuelve un mensaje de error, es a modo de ejemplo, sencillamente se muestra como podemos bloquear el inicio si el usuario no ha establecido algún tipo de tiempo a descontar.

Faltaria implementar que al llegar a 0 realize determinadas acciones, que no lo hemos realizado pero el ejemplo lleva a todo lo demas.


Saludos.

viernes, 17 de mayo de 2013

SEGURIDAD [Al menos cuatro detenidos y varios registros]

Operación contra Anonymous en Italia tras una ola de 'ciberataques'



SEGURIDAD | Al menos cuatro detenidos y varios registros

Operación contra Anonymous en Italia tras una ola de 'ciberataques'

La policía postal italiana ha puesto en marcha una importante operación contra el grupo de 'ciberintrusos' Anonymous, que se ha saldado con varias detenciones y registros.
Cuatro supuestos miembros de la red fueron puestos bajo arresto y han tenido lugar una docena de registros, como parte de una investigación iniciada después de 'ciberataques' contra el Gobierno y el Vaticano, según informa Cnaipic, el centro nacional contra los crímenes informáticos y para la protección de infraestructuras críticas.
Según los investigadores, los detenidos son responsables italianos del movimiento internacional Anonymous, incluso -reconoce la policía- si el grupo tiene una estructura "anárquica".
Así, los detenidos son sospechosos de los ataques contra infraestructuras críticas de instituciones (gobierno, el parlamento y el Vaticano) y grandes empresas, según la acusación realizada por la Fiscalía de Roma.


Ojo al gol xD


Saludos.

domingo, 12 de mayo de 2013

Videos "Anti-Google" por Microsoft

"Office es un jugador de equipo, dijo Microsoft apuntando a algunas declaraciones hechas por el gigante de las búsquedas de Mountain View, alegando que Google Docs realmente está detrás de su propia suite de productividad.

"Las brechas de Google no son sólo características avanzadas utilizadas por unas pocas personas. Muchas características básicas están ausentes en Google Docs, como por ejemplo la revisión gramatical, el soporte para columnas, los formatos de fecha personalizados, los números de diapositivas y la combinación de correos. A esto se añaden las capacidades mucho más avanzadas que faltan de Google Docs como Power Pivot, SmartArt, marcas de agua, diapositivas maestras, edición de imágenes, cortadoras y gestión de los derechos de información – lo que demuestra que vuestra productividad comenzará a declinar", 

En el enlace  estan los videos.
Da a pensar mucho, en lo personal creo que si tuvieron tiempo y dedicacion a realizar esos videos con fines serios... estamos jodidos xD
No me parece un buen numero para la empresa, algo debe de esconder.

Saludos. 

Videos "Anti-Google" por Microsoft 

viernes, 10 de mayo de 2013

Consultas SQL Básicas

SQL (Lenguaje estructurado de consultas) Según la Wiki:

  • Lenguaje de definición de datos: El LDD de SQL proporciona comandos para la definición de esquemas de relación, borrado de relaciones y modificaciones de los esquemas de relación.
  • Lenguaje interactivo de manipulación de datos: El LMD de SQL incluye lenguajes de consultas basado tanto en álgebra relacional como en cálculo relacional de tuplas.
  • Integridad: El LDD de SQL incluye comandos para especificar las restricciones de integridad que deben cumplir los datos almacenados en la base de datos.
  • Definición de vistas: El LDD incluye comandos para definir las vistas.
  • Control de transacciones: SQL tiene comandos para especificar el comienzo y el final de una transacción.
  • SQL incorporado y dinámico: Esto quiere decir que se pueden incorporar instrucciones de SQL en lenguajes de programación como: C++, C, Java, Cobol, Pascal y Fortran.
  • Autorización: El LDD incluye comandos para especificar los derechos de acceso a las relaciones y a las vistas.
Una de las sentencias básicas que vamos a ver es la de insertas nuevos datos 
hacia una tabla ya creada.
 
Inserción(Insert Into)
Insert Into NombreTabla (Dato1,Dato2,Dato3) 
Values (Valor1,Valor2,Valor3)
 
Siempre debe de coincidir la cantidad de registros tanto para los datos como valores, de lo contrario
la consulta nos devolvería error.
También es obligación respetar los parámetros establecidos en la base de datos
de acuerdo al tipo de dato de cada registro, es decir, no podemos insertar datos
de tipo Boolean (Sí/No) en un registro de tipo Integer (numérico)
Actualización(UpDate)
UpDate NombreTabla Set Registro1 = NuevoValor Where Registro2 = DatoEspecifico;
 
Tenemos que tener en cuenta que el valor del registro 1 es el que vamos a cambiar
siempre y cuando el valor del registro2 (en general es una clave principal definida
al diseñar la base de datos) sea la correcta, para eso tenemos el Where(Condición). 

Eliminación(Delete)
Delete From NombreTabla Where Columna = RegistroaEliminar ;

Sin mas detalle está todo muy claro, se eliminará de la tabla especificada, aquel
registro que esté en la columna que le indiquemos con el valor dado.
 
Un tema que trataremos mas adelante será el SQL Injection.
 
 
Saludos. 

Modificación, Inserción, Eliminación de datos en Txt Desde Visual Basic 6

Hace unos años hice este code para el manejo parcial de las cuentas Vip de un juego, el sistema utilizaba un Txt como intermediario para comprobar las cuentas existentes y permitir el acceso si las mismas coincidian.

El código se basa en estructuras simples y concretas, sin módulos.

Para ingresar una cuenta era necesario en dos Textbox ingresar obligatoriamente el nombre de la cuenta y una fecha válida de finalización.

Option Explicit
Dim RepCuenta As Boolean
Private Sub cmdActivar_Click()
Dim Kuenta As String
Dim FechaExp As String 'maneja la fecha de expiración de la membresía vip
If Trim(txtAcc.Text) = "" Or Trim(txtDate.Text) = "" Then 'verificamos que no esten vacios los textbox
   MsgBox "Caja de texto vacía, no es posible dejarla asi", vbOKOnly + vbCritical, "Error: Atención!"
   Exit Sub
End If
If IsDate(txtDate.Text) Then 'verificamos que la fecha sea válida
   FechaExp = Trim(txtDate.Text)
   Kuenta = Trim(txtAcc.Text)
Else
   MsgBox "Fecha Invalida"
Exit Sub
End If
ListaAcc listAcc, Trim(Kuenta) 'funcion detallada mas abajo
If RepCuenta = True Then 'si la cuenta esta en la lista avisa del error
   MsgBox "Ésta cuenta ya tiene acceso Vip, Verifique", vbOKOnly + vbCritical, "Atención: Datos ambiguos"
   Exit Sub
Else
   'agrega vip ya que la cuenta no está ingresada
   RepCuenta = False
   Open App.Path & "\Connectmember.txt" For Append As #1 'abrimos txt
   Write #1, Trim(Kuenta), Trim(FechaExp) 'printeamos linea
   listAcc.AddItem xDD.Text & Kuenta & xDD.Text 'valores por sesion
   listDate.AddItem xDD.Text & FechaExp & xDD.Text
   Close #1
   MsgBox "Agregado con éxito", vbOKOnly + vbCritical, "xd"
End If
End Sub



Procedimiento que busca y compara cuentas, si encuentra coincidencia impide la ejecución del código
ya que la cuenta es existente y no es posible duplicar datos

Private Sub ListaAcc(unListado As ListBox, unaKuenta As String)
Dim x As Integer
For x = 0 To unListado.ListCount
    If Trim(unListado.List(x)) = Trim(xDD.Text) & Trim(unaKuenta) & Trim(xDD.Text) Then
       RepCuenta = True
       Exit Sub
    End If
Next x
End Sub


Private Sub cmdAK_Click()
Dim Cuenta As Integer
Open App.Path & "\ConnectMember.txt" For Output As #1
Print #1, "//Usuario"
Print #1, "// Vencimiento Vip formato dd/mm/aaaa"
Print #1, "//Txt Comando Acceso de servidor Vip"
For Cuenta = 0 To listAcc.ListCount - 1
   Print #1, listAcc.List(Cuenta) & "," & listDate.List(Cuenta)
Next Cuenta
Close #1
End Sub
Private Sub cmdCancelar_Click()
Label5.Visible = False
txtFechaAct.Visible = False
listAcc.Enabled = True
listDate.Enabled = True
cmdConf.Visible = False
cmdCancelar.Visible = False
End Sub
Private Sub cmdConf_Click()
Dim FechaAct As Date
If Trim(txtFechaAct.Text) = "" Then
   MsgBox "Caja de texto vacía, no es posible dejarla asi", vbOKOnly + vbCritical, "Error: Atención!"
   Exit Sub
End If
If IsDate(txtFechaAct.Text) Then
   FechaAct = Trim(txtFechaAct.Text)
Else
   MsgBox "Fecha Inválida"
Exit Sub
End If
listDate.List(Actual) = xDD.Text & FechaAct & xDD.Text
'cmdListar.Visible = True
Label5.Visible = False
txtFechaAct.Visible = False
listAcc.Enabled = True
listDate.Enabled = True
cmdConf.Visible = False
cmdCancelar.Visible = False
End Sub


Private Sub cmdListar_Click() 'devuelve una cadena con cuentas actuales en el archivo
Dim Linea As String
Dim EkisDe As Variant
Dim Kontrol As Integer
Dim CuentaLinea As Integer
listAcc.Clear
listDate.Clear
CuentaLinea = 0
Open App.Path & "\ConnectMember.txt" For Input As 1
Do While Not EOF(1)
    CuentaLinea = CuentaLinea + 1
    Line Input #1, Linea
    Kontrol = 1
    If CuentaLinea < 4 Then GoTo Seguir
       For Each EkisDe In Split(Linea, ",")
           If Kontrol = 1 Then
              listAcc.AddItem Trim(EkisDe)
              Kontrol = 2
           Else
              listDate.AddItem Trim(EkisDe)
           End If
       Next
Seguir:
    Loop
Close
Exit Sub
errSub:
MsgBox "Número de error: " & Err.Number & vbNewLine & _
       "Descripción del error: " & Err.Description, vbCritical, "Atención: Error!"
End Sub



Private Sub Form_Load()
RepCuenta = False
cmdListar_Click
Actual = -1
End Sub
Private Sub Form_Unload(Cancel As Integer)
If frmMenu.mnuChk.Checked = True Then
   cmdAK_Click
End If
End
End Sub


Private Sub listAcc_Click()
On Error Resume Next
listDate.ListIndex = (listAcc.ListIndex)
End Sub
Private Sub listAcc_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single)
If listAcc.ListCount = 0 Or listAcc.ListIndex = -1 Then Exit Sub
If Button = 2 Then
   Actual = listAcc.ListIndex
   frmMenu.PopupMenu frmMenu.mnuIni
End If
End Sub


Private Sub listDate_Click()
On Error Resume Next
listAcc.ListIndex = (listDate.ListIndex)
End Sub
Private Sub listDate_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single)
If listAcc.ListCount = 0 Or listAcc.ListIndex = -1 Then Exit Sub
If Button = 2 Then
   Actual = listAcc.ListIndex
   frmMenu.PopupMenu frmMenu.mnuIni
End If
End Sub


Es una muestra del manejo del txt en base a determinadas necesidades, se puede modificar perfectamente para extraer info de cualquier archivo de texto plano.


Saludos.

jueves, 9 de mayo de 2013

Evadiendo Ataques DDOS "Metodo de espejos" Por KOLESIAS123

El texto mostrado en TodoXp es extraído del enlace original que luego colocaré para que puedan ver la fuente, la idea de evadir estos ataques al parecer es efectiva pero no tengo la manera de comprobarlo.

"Hace algún tiempo un usuario de KM menciono sobre esto, y bien hoy tenia tiempo libre y me puse a hacer el video.

Para los que no lo conocían es un método en el cual se basa en redireccionar a los atacantes a localhost.
En este caso se uso D-GUARD (Modificado por KOLESIAS123) Que es la que cumple la funcion de espejos.

es decir que el ataque llega pero cuando es detectado los redirecciona,
No quiero decir que es una  especie de intermediario que redirecciona.
Estoy diciendo que cuando detecta IP maliciosa NO la bloquea sino que cambia la IP de destino a a Localhost, una vez que es bloqueda
el ataque NUNCA volvera a pasar por el host

Es un metodo que el propio HABBO.ES usa, cuando haces ping, no te lleva  a la direccion IP original del host.
Sin embargo cuando navegas entraras directamente a la web."


Fuente: Video Evadir Ataques Ddos

Iniciar evento de x Control mediante la tecla enter [ Visual Basic 6 ]

Cuando manejamos cantidades significativas de datos, y a la vez necesitamos ingresar texto hacia otro lado mediante un copy/paste o bien los saltos de líneas instantáneos que No siempre podemos tener, tengo un código simple que detecta la presión de la tecla enter para realizar determinadas acciones.

Si se le da un uso lógico  puede tener resultados significativos.

Private Sub RichTextBox1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
    'Acciones requeridas
    KeyAscii = 0

End If
End Sub



Por ejemplo acá se maneja la presión del enter cuando la misma es detectada, el código se maneja dentro del bloque If.
Donde KeyAscii nos devuelve el número y si es 13 (Enter) determina las acciones solicitadas.
Devolver a su posición = 0 del KeyAscii es opcional, ya que si queremos sencillamente que realize una accion determinada, no necesitamos quitarle el valor, sino podemos salir con Exit Sub.
Si de una función se trata con End Function.

NOTA: el evento KeyPress salta automáticamente al presionar cualquier tecla cuando el control tiene el foco, por lo que es el método inicial a futuros eventos.

miércoles, 8 de mayo de 2013

Indexar Listview's Visual Basic 2010 .NET

Cuando hablo de indexar, me refiero a seleccionar el mismo elemento, en ambos controles, estuve un largo rato para poder detectar esta forma, ya que mi idea es la creación de un reproductor, el cual muestra 1 listview y esconde otro, uno tiene la Ruta de las canciones(el que está oculto) y el otro muestra el nombre solo, cuando el usuario selecciona el nombre de la canción, automáticamente yo quería que se seleccionara el mismo para la ruta, para luego así con un simple Reproductor.Url = ListView1.Items(x).Text Obtenía la ruta del mismo para reproducirlo.

En fin por la red hay diversas formas que a mi entender son excesivas para algo tan "sencillo"

Private Sub ListView1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cancionesLista.Click
ListView2.Items(ListView1.FocusedItem.Index).Selected = True
End Sub



Donde ListView 2 tiene la ruta de mis canciones.
También en base a este code es posible detectar qué ítem está seleccionado.

Ojala les sirva, Saludos.

"Juego" en C# simple

La idea de postear esto no es porque sea divertido el juego, sino porque cuando comenzé con este lenguaje me sirvió este ejemplo muchísimo para luego generar mi propia experiencia y el manejo del lenguaje, tengan en cuenta que para que el código funcione correctamente, hay que colocarlo sobre una aplicación de consola manejando el lenguaje C#.

Sencillamente un número dado, vamos colocando y realiza una comparación, si acertamos lo muestra y fin del juego, de lo contrario despliega un mensaje indicando el fallo y vuelve a su estado original (esperando introducción de numero para realizar comparación)
En lo personal me ha sido de mucha utilidad espero les sirve.

NOTA: Este ejemplo utiliza el ciclo do While para su utilización, si son muy nuevos en el lenguaje les costará entenderlo.


int numeroSecreto = 3;


Console.WriteLine("Bienvenidos al Juego: Adivina el numero secreto");
Console.WriteLine("Favor de introducir un numero del 1 al 10 para adivinar el numero secreto: ");
int numero = Convert.ToInt32(Console.ReadLine());


do
       {
           Console.WriteLine("Fallaste!, intenta de nuevo: ");
           numero = Convert.ToInt32(Console.ReadLine());
       }
while (numero != numeroSecreto);
                        
Console.WriteLine("Felicidades, acertaste de numero secreto");    
            
Console.ReadKey();


Saludos!


Conectar Base de datos (Access 2003) con Visual .NET 2010 (VB)

Conectar .NET con Access 2003 es eficiente de esta forma:

Antes del code del botón que conecta y comprueba nustra conexión hay que declarar lo siguiente
Imports System.Data.OleDb
Imports System.Data




Agregamos un DataGridView y lo llamamos dtGrid o como gusten.
Un boton llamado cmdIni
Luego no olviden tener una base de datos con al menos una tabla con algunos datos asi comprobaremos mostrandolos en el DataGrid, por ejemplo en el disco C:\ o donde quieran, dependerá eso de la ruta que establezcan.

Private Sub cmdIni_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdIni.Click
Dim Conexion As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb;User Id=admin;Password=;")
Dim Konsulta As New OleDbDataAdapter("SELECT * FROM Pais", Conexion)
Dim DatosNuevos As New DataSet
Konsulta.Fill(DatosNuevos)
dtGrid.DataSource = DatosNuevos.Tables(0)
End Sub



Como vemos la conexión no es para nada complicada, si hay que tener en cuenta los parámetros de ubicación de la base  de datos porque de lo contrario suele dar mucho problema.

Si todo va correctamente en nuestro Datagrid veremos los registros actuales en la tabla, pueden añadir filtros modificando la consulta es algo "general" para sencillamente mostrar la conexión exitosa.

3 cosas fundamentales que deben cambiarle a este código:
Ruta de base de datos al momento de declarar la conexión
Nombre de Tabla en este caso es "Pais"
Nombres de los componentes "dtGrid", "cmdIni" etc.

Saludos.

martes, 7 de mayo de 2013

Latincim, Fuente reparada por NovatoXp

Los clientes de latinchat han dejado de funcionar en su totalidad hasta donde se, poco se sabe de nuevos accesos externos desde la web ni tampoco los hemos investigado, por acá quiero dejar una fuente reparada por NovatoXp (En su momento) de su primer autor (Gemu)

Con ninguno hace años no tengo ningún tipo de contacto, ambos se han perdido.

Este codigo es el inicio del resto de los clientes Magma, lo cual tiene una conexión muy interesante en cuanto a trabajo sobre Visual basic 6 se refiere, la utilización del componente creado por gemu le hacia una conexión extremadamente rápida.

En su tiempo había diversos clientes funcionando, Gemu fue el único que decidió librerar su fuente como medios educativos a mi entender, en su tiempo hice 3 clientes los cuales perdí con el correr del tiempo por eso carezco de las fuentes(basadas en esta misma), pero que me han dejado una experiencia mayor en el lenguaje y a la sintáxis de la programación en si, por lo que recomiendo utilizar esta fuente si es que quieren saber mas sobre el lenguaje y su funcionamiento.

Actalmente latinchat modificó su protocolo y no se puede acceder mediante esta conexión, no esperen que conecte cuando lo ejecuten, se podría intentar reparar (cosa que revisé por arribita nomas y me parece muy dificil)
Al fin que si comparamos tiempo y resultados no sería rentable repararlo, sino mas bien iniciar algo totalmente nuevo.

A mi gusto con respecto a esta fuente gemu trabajaba de manera prolija y ordenada, y se molestaba mucho por los comentarios (cosa que yo no hago)
Es bueno por si en algun momento dejamos de lado un tiempo x proyecto, retomarlo nos refrescaría la memoria fácilmente.
El manejo de errores a mi parecer es efectivo.

Quiero destacar este code:

Function Bin(deci As Long) As String
On Error Resume Next
Dim tmp As String
Dim res As Long
Dim sob As Long
res = deci

    Do While Val(res) > 0
        sob = res Mod 2
        res = res \ 2
        tmp = tmp & Trim(Str(sob))
    Loop
    If Len(tmp) < 4 Then tmp = tmp & String(4 - Len(tmp), "0")
    Bin = StrReverse(tmp)
End Function


Al dar un string el mismo se transforma de Decimal a Binario, pero hay que tener en cuenta que no es la manera estándar de esta función.

Bien en fin quiero dejarles la descarga

Descargar Latincim Source desde MultiUpload


Destacar el trabajo de NovatoXp en su momento con la fuente sirvio a muchos programadores orientarse y basarse para poder crear otros clientes.

Saludos.

domingo, 5 de mayo de 2013

Mostrar MsgBox en donde queramos

Por defecto nuestros MsgBox inician  centrados en la pantalla de manera modal, lo que veremos es como manejar ese funcionamiento y así cambiarle la posición a nuestro gusto.
Hay que añadir a nuestro proyecto un módulo y declaramos:

Option Explicit
Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type
Public Declare Function UnhookWindowsHookEx Lib "user32" _
    (ByVal hHook As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
    (ByVal idHook As Long, ByVal lpfn As Long, _
    ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Public Declare Function SetWindowPos Lib "user32" _
    (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
    ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
    ByVal cy As Long, ByVal wFlags As Long) As Long
Public Declare Function GetWindowRect Lib "user32" _
    (ByVal hwnd As Long, lpRect As RECT) As Long
Public Const GWL_HINSTANCE = (-6)
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOZORDER = &H4
Public Const SWP_NOACTIVATE = &H10
Public Const HCBT_ACTIVATE = 5
Public Const WH_CBT = 5
Public hHook As Long


 Las declaraciones de Apis, constantes y tipos de datos las colocamos en un mismo lugar para no generar entreveros, les recomiendo incluir este código en un módulo solo para el, por si hay algún error al cambiar valores, fácilmente podrán detectarlos depurandolo.

Primer proceso (dentro de módulo) para obtener el mensaje y determinar la posición de la caja de mensaje:

Function ProcesoUbicUser(ByVal lMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If lMsg = HCBT_ACTIVATE Then
   SetWindowPos wParam, 4, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE
   UnhookWindowsHookEx hHook
End If
ProcesoUbicUser = False
End Function

Segundo proceso, ubicación predeterminada (centrado al formulario)

Function ProcesoCentrado(ByVal lMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim rectForm As RECT, rectMsg As RECT
Dim x As Long, y As Long
If lMsg = HCBT_ACTIVATE Then
   GetWindowRect Form1.hwnd, rectForm
   GetWindowRect wParam, rectMsg
   x = (rectForm.Left + (rectForm.Right - rectForm.Left) / 2) - ((rectMsg.Right - rectMsg.Left) / 2)
   y = (rectForm.Top + (rectForm.Bottom - rectForm.Top) / 2) - ((rectMsg.Bottom - rectMsg.Top) / 2)
   SetWindowPos wParam, 0, x, y, 0, 0, _
   SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE
   UnhookWindowsHookEx hHook
End If
ProcesoCentrado = False
End Function

Donde x,y determinan el posicionamiento del mensaje, en este caso, el centrado.

Código en Formulario (luego de añadir 2 botones de comando, uno muestra el msgbox centrado al formulario, esté donde esté y el otro donde le digamos luego de establecer algunos parámetros)

Option Explicit
Private Sub Command1_Click()
Dim hInst As Long
Dim Thread As Long
hInst = GetWindowLong(Me.hwnd, GWL_HINSTANCE)
Thread = GetCurrentThreadId()
hHook = SetWindowsHookEx(WH_CBT, AddressOf ProcesoUbicUser, hInst, Thread)
MsgBox "msgbox en posición determinada por el usuario"
End Sub

Private Sub Command2_Click()
Dim hInst As Long
Dim Thread As Long
hInst = GetWindowLong(Me.hwnd, GWL_HINSTANCE)
Thread = GetCurrentThreadId()
hHook = SetWindowsHookEx(WH_CBT, AddressOf ProcesoCentrado, hInst, Thread)
MsgBox "msgbox centrado al form"
End Sub

Cualquier duda consulten por aca o via mail.

Saludos.



jueves, 2 de mayo de 2013

Comprobar Fecha Válida

Ejemplo en Visual basic 6, del manejo de la instrucción "DateSerial" enviado por J.I. Moratiel.

Necesitaremos 1 Command1 y un Textbox1.

'Programador: J.I. Moratiel
Option Explicit
Private Sub Command1_Click()
'Ejecutamos la sentencia siguiente.
Text1_LostFocus
End Sub
Private Sub Text1_LostFocus()
'Al perder el foco comprueba que la fecha sea válida.
Dim AlgunaFecha, días
If IsDate(Text1.Text) Then
   AlgunaFecha = CDate(Text1.Text)
   días = DateSerial(Year(AlgunaFecha) + 1, 1, 1) - AlgunaFecha
   Label1.Caption = "Quedan " & días & " días en el año."
   Else
   MsgBox Text1.Text & " NO es una fecha válida."
   'Ponemos el foco de nuevo en Text1
   Text1.SetFocus
   'Limpiamos Text1
   '    Text1.Text = ""
End If
End Sub


El código funciona correctamente y es bastante sencillo, de todas maneras es una buena opción para interactuar con el lenguaje  e intentar algunas variantes.

NOTA: recomiendo personalmente no utilizar acentos en variables, por la experiencia entendemos que a la larga uno pierde la costumbre de hacerlo, no es una mala programación solo que complica la sintáxis sin necesidad.

Saludos.