-[ 0x0A ]------------------------------------------------------------------- -[ Monitorizacion de software ]--------------------------------------------- -[ n3LsOn 2o03 ]----------------------------------------------------SET-28-- _NNNNNNN_ _NNNNNNN_ JNNNNNNNNNL JNNNNNNNNNL (NNN JNNL. NNNN` `NNNN (NNN. JNNN NNNN` `NNNN (NNN JNNL. (NNNNNNNNN. 4NNNNNNL_ `NNNL .NNNF 4NNNNNNL_ (NNNNNNNNN. (NNNF"4NNN) 4NNNNNNNNL `NNNNNNNF 4NNNNNNNNL (NNNF"4NNN) (NNN NNN) .___.`"4NNNN) (NNNNNN .___.`"4NNNN) (NNN NNN) (NNN NNN) (NNNN. JNNN) .NNNNNNNL (NNNN. JNNN) (NNN NNN) (NNN NNN) 4NNNNNNNNNN .NNNN`4NNNL 4NNNNNNNNNN (NNN NNN) (NNN NNN) "NNNNNNNF .NNNF `NNNL "NNNNNNNF (NNN NNN) |Monitorizacion de software |n3LsOn 2o03 |Capitulo I El objetivo primordial que se esconde bajo este titulo es basicamente el aprovechamiento de los programas que disponemos habitualmente a nuestro alcance para implantarnos en nuetros propios proyectos como parte de ellos sin que el usurio final(el que vaya a usar el programa) tenga constacia de ello. Para ello debemos de tener unos conocimientos minimos y basicos de visual basic, que va a ser la herramienta principal de programacion. (tampoco pido mucho, pero almenos que se sepa que se esta haciendo) Que podemos conseguir hacer con monitorizacion de software? Todo depende del fin que queramos dar a nuestro programa, pero basicamente podriamos definir una serie de objetivos interesantes: Podremos recoger informacion de cajas de texto,combos,listas y ventanas, eliminar cualquier tipo de objeto de una ventana, habilitarlo, desabilitarlo, moverlo,cambiarle las medidas.Bloquear ventanas, cambiarlas el titulo o eliminarlas..todo lo que podamos imaginar.. Para explicar este pequeno cursillo de monitorizacion, he dividido el trabajo en objetivos.Cada vez uno mas complicado.He aqui los cuatro proyectos por orden de dificultad: o=============================================================o * - Poder manejar el Winamp desde mi programa ** - Poder descubrir la contrasena del Messenger 5.0 *** - Poder enviar mensajes masivos mediante el Winsms **** - Poder descubrir la contrasena del Messenger 6.0 o=============================================================o Personalmente recomiendo a todo aquel que vaya a seguir este curso, que comienze desde el principio. Se que resultan muy alentadores el segundo y cuarto proyecto, pero es recomendabe que vayamos paso por paso para no perdernos nada. Ya sabeis, cuanto mas hagamos, mas aprenderemos.. \\\\\\\Poder manejar el Winamp desde mi programa/////// El objetivo de este proyecto es, como su nombre indica, conseguir manejar 'remotamente' el winamp. Esto puede ser muy util para aquellos programas que requieran muchas horas delante del ordenador como gestion de datos, programas de empresas, o porque no decirlo, virus.. Bien es cierto que la maquina a de tener instalado y ejecutado el winamp(normalmente se ejecuta en modo 'background'al arrancar windows).Debemos de tener claro desde un principio la magnitud a la que llega la monitorizacion de programas: vamos a mandar al Winamp que haga lo que queramos (Ejecutar cancion, Atras, Adelante, Cargar List, Borrar List, Preferencias, Radio, Poner/Quitar el formulario de la lista, el equalizer, Salir..TODO! Para los que todavia no se acaban de entender, pensar en un pequeno virus que diera constantemente al stop, o que cerrara el winamp al iniciarse.. Tenemos control total sobre el programa, asi que..manos a la obra!! Todos conocemos como funciona el winamp. Como es su menu y como funciona su interface. Un buen programador antes de comenzar su proyecto final, realiza un programilla o esbozo que le ayudara a crear el que usaremos facilmente. Por lo tanto, hagamoslo asi :-) Vamos a crear uno que nos ayude a estudiar el comportamiento del winamp a la monitorizacion, para luego exprimirlos y sacar el proyecto final. Todos sabemos que son las funciones API, y cual es su trabajo primordial: aplicar las posibilidades de windows a nuestros programas. Vamos a aprovechar dichas funciones para cumplir nuestro objetivo. Algunas de las funciones API que todos conocemos, permiten enviar comandos y 'mensajes' con cierta informacion a programas en ejecucion. Todas estas APIS's nos piden como dato inprescindible una variable denominada hwnd(handle). Que es esto? Todo objeto que es ejecutado en windows, es registrado en la memoria del ordenador para poder hacerle una referencia, este valor es denominado hwnd. Por tanto, todos los botones, ventanas, cajas de texto, combos, listas, labels, menus, formularios, mensajes en la pantalla, TODO posee un hwnd. Este es el fundamento basico en el que nos vamos a basar para poder monitorizar cualquier programa.(Muy importante:el programa debe estar en ejecucion, y cada vez que entra en memoria cambian todos sus objetos de valor). Por lo tanto, vamos a necesitar primeramente saber el hwnd de todos los objetos que necesitemos para poder usarlos como nos antoje. Una vez que sepamos el dichoso hwnd(que es un numero as long); podremos hacer de todo: por ejemplo, si se trata de un boton, cambiar su label, presionarlo, eliminarlo, bloquearlo, moverlo..si es una caja de texto podremos ver el texto, selecionarlo, borrarlo, ponerle lo que queramos, bloquearlo..(aqui cada uno que lo aplique a lo que quiera) En primer lugar tenemos que saber el hwnd de la ventana 'padre' que nos dara paso a ver los 'hijos' como textos y botones. Para conseguirlo, haremos uso de la funcion API FindWindow, una vez que sepamos el hwnd de la ventana podremos hacer cosas interesantes sobre ella, como ocultarla, eliminarla, o cambiarla el titulo..Ahora ya podemos empezar. Creamos un formulario con un listbox y un boton,cargamos la funcion PostMessage del visor de texto API.La pegamos publica en nuesto codigo (insertamos un modulo normalito).Hacemos lo mismo con la funcion FindWindow.Creamos una sub llamada MonWinamp, que se encargara primero de buscar la ventabna del winamp, y despues de enviar la informacion que queremos que realice en winamp. Ponemos la variable Menu que guardara el codigo a ejecutar. Le indicamos el hwnd de la ventana del winamp mediante la funcion FindWindow de la siguiente manera (escribo el modulo entero): ''En el module1.bas Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public HWND_WINAMP as Long Public Sub MonWinamp(Menu As String) HWND_WINAMP = FindWindow("Winamp v1.x", vbNullString) If HWND_WINAMP <> 0 Then PostMessage HWND_WINAMP, &H111, Menu, 0 End If End Sub Hemos comprobado que lo he encontrado si el valor HWND_WINAMP es distinto de cero, si no, resulta que el winamp no ha sido ejecutado. Todo perfecto. En la Sub del Command1_Click vamos a llamar a MonWinamp y como variable menu que nos pedira, ponemos List1.Text Private Sub Command1_Click MonWinamp List1.text End Sub Recapitulemos: Hemos creado una funcion llamada MonWinamp que nos enviara la info, una lista que ahora llenaremos, y un boton llamado Command1 que llamara a la sub MonWinamp con la variable Menu igual al texto del List1. Y ahora pensareis..y que narices hay en la lista?? pues sencillo, vamos a crear un bucle que la llene del 40000 al 41000. Con ello nos evitaremos ir escribiendo los valores uno a uno (mira que eres vago..) xD .Os preguntareis porque hemos puesto ese rango tan raro de valores, pues la respuesta es sencilla; normalmente los programas suelen responder en valores cercanos a estos numeros.La sub del Load quedaria asi: Private Sub Form_Load() Dim i as Long For i=40000 to 41000 List1.AddItem i Next i End Sub Por ahora todo perfecto,no? Tenemos el programilla preparado para escanear todos los valores posibles que enviemos al Winamp.Iremos viendo cada vez que demos al Boton el comportamiento que tiene nuestro Winamp. Comenzamos senalando el valor 40000 de nuestra lista..pasa algo? Creo que nop.. Y si ponemos el valor 40001?Siiii! El winamp se nos ha cerrado solito!! jeje.. asi iriamos probando con toda la lista mirando si ocurre algo en el dichoso programa. Yo ya hice el trabajo sucio, y aki os dejo la lista de constantes que cumplen lo dicho :-) Las declarais en el modulo y punto. Public Const WINAMP_CERRAR = 40001 Public Const WINAMP_ABRIR_ARCHIVO = 40029 Public Const WINAMP_OPCIONES = 40040 Public Const WINAMP_ABOUT = 40041 Public Const WINAMP_POPUPMENU = 40043 Public Const WINAMP_PAUSA = 40046 Public Const WINAMP_STOP = 40047 Public Const WINAMP_SIGUIENTE_CANCION = 40048 Public Const WINAMP_SUBE_VOLUMEN = 40058 Public Const WINAMP_BAJA_VOLUMEN = 40059 Public Const WINAMP_ALANTE_5SEG = 40060 Public Const WINAMP_ATRAS_5SEG = 40061 Public Const WINAMP_ABRIR_LOCALIZACION = 40155 Public Const WINAMP_DOBLE_TAMANO = 40165 Public Const WINAMP_ABRIR_DIRECTORIO = 40187 Public Const WINAMP_INFO_ARCHIVO = 40188 Public Const WINAMP_PREFERENCIAS = 40191 Public Const WINAMP_VISUALIZACION = 40192 Public Const WINAMP_ANTERIOR_CANCION = 40198 Ya tenemos todo lo que queremos! Ahora creariamos un proyecto nuevo (que sera nuestro programa final), y aplicamos nuestros conocimientos :) Os pongo un ejemplillo: Para crear un pequenyo virus que inhabilite el winamp, insertamos en un proyecto nuevo un timer (le mandaremos la constante WINAMP_CERRAR), metemos estas constantes en un modulo, junto con la api PostMessage y FindWindow,y programamos en el timer con un intervalo corto que llame a nuestra funcion MonWinamp WINAMP_CERRAR. Creo que queda claro.Os pongo el ejemplo pa que no os canseis.. Private Sub Timer1_timer Timer1.Interval = 1 MonWinamp WINAMP_CERRAR End Sub Y ya esta!!! con esto estamos jodiendolo de arriba a abajo xDDD. Una vez que ya habeis comprendido mas o menos el concepto de la Monitorizacion del software, vamos a dar un pasito mas alla, y crearemos un programilla que no solo obligara a hacer accionesa otro, sino tambien recogera elementos del mismo (variables). Pero antes, advertiros de que lo que hemos aprendido hay, funciona en el 99% de los programas que tenemos a nuestra disposicion (winzip,messenger,...). Aunque os encontrareis un problema, y es como encontrar el hwnd de la ventana principal. Os explico: la API FindWindow tiene dos posibilidades, buscar un programa por su titulo (si por ejemplo estamos en la web de SET, el titulo seria 'SET Saqueadores Edición Técnica - Microsoft Internet Explorer' si usas el explorer claro.. este titulo lo pondrias al llamar a la funcion FindWindow en la variable lpWindowName As String dando la otra adjunta lpClassName As String como VbNullString(nada). Si por lo contrario sabes el nombre del modulo de clase que usa el programa (el winamp usa uno llamado Winamp 1.x, el winzip uno llamado WinZipWClass,etc..) puedes buscar el programa mediante la variable lpClassName dando lpWindowName como nula. Ten en cuenta que ambas variables son sensitive case. De todas formas hay programas que te detectan el titulo y modulo de clase solos, y asi no tienes que andar mirando si te comes las letras y eso xDD ..os recomiendo el WinHack, un programilla bastante cutre que te servira por ahora para lo que queremos. Lo tienes en miles de paginas de source de vb, pero de todas formas os doy un link por si acaso: http://www.moon-soft.com/download/other/index3.htm La web es china (vamos, o de por alli xDDD) pero vienen un webo de proyectos de open source que nos podran venir bien. Si por cualquier motivo la web esta chapada, hacemos lo tradicional, nos metemos en el google y hacemos una de vb+winhack y punto. Pues con esto acabariamos la primera parte del tema..no se si os convence todavia, pero esperaros a nuestro proximo objetivo y vereis. *EOF*