Red de conocimiento informático - Consumibles informáticos - Guía de expertos: quiero escribir un software de seguridad usando VB.

Guía de expertos: quiero escribir un software de seguridad usando VB.

Principios de desarrollo de VB Firewall 2007-01-08 13:06 Se reproduce el siguiente contenido. No tengo ningún derecho sobre este artículo y no asumo ninguna responsabilidad que surja del mismo. .

Fuente de información: /

El firewall consta principalmente de registros, listas de estado de la red y controles de estado de la red (como la interceptación). Entonces necesitamos tres interfaces, una es la interfaz principal: la lista de estado. Una es la interfaz de registro y la otra es la interfaz de control.

Abra VB para crear un nuevo proyecto y agregar un formulario. A*** para 3 mesas, 2 módulos. Es demasiado complicado. También estoy pensando en cómo escribirlo para que todos puedan entenderlo. El artículo no está bien escrito, por favor inclúyelo. Cuéntame los principios:

Primero, monitorea la conexión TCP

La esencia de un programa hacker o un programa troyano es realizar la transmisión de datos. TCP y UDP (Protocolo de datagramas de usuario) son los dos protocolos de transmisión de datos más utilizados. Ambos utilizan el método de configurar puertos de escucha para completar la transmisión de datos.

El monitoreo en tiempo real de todas las conexiones de los puertos, la advertencia oportuna sobre conexiones anormales y solicitar a los usuarios que eliminen conexiones anormales pueden prevenir eficazmente a los piratas informáticos.

Usar la función de biblioteca del asistente de IP de Microsoft (iphlpapi.dll) es un atajo. La función GetTcpTable puede devolver todas las conexiones TCP válidas en el sistema actual. Se define como:

Función de declaración GetTcpTable Lib "iphlpapi.dll" (ByRef pTcpTable es MIB_TCPTABLE, ByRef pdwSize es Long, ByVal bOrder es Long) es Long

Donde, parámetro 1 Es un puntero al búfer de la tabla de conexiones TCP. El parámetro 2 es el tamaño del búfer (cuando el búfer no es lo suficientemente grande, este parámetro devuelve el tamaño real requerido). El parámetro 3 indica si la tabla de conexiones necesita presionar "IP local" y ". Puerto local" en secuencia.", "IP remota", clasificación "Puerto remoto".

Utilice la función GetUdpTable para monitorear la tabla de conexiones UDP. Dado que su uso es completamente similar, aquí se omite la discusión.

2. Advertencia anormal y eliminación de conexiones

Al comparar periódicamente las dos tablas de conexiones TCP, se pueden descubrir anomalías de inmediato y emitir advertencias. Después de recibir la señal de alerta temprana, primero elimine la conexión sospechosa y luego verifique cuidadosamente si hay agujeros de seguridad o procesos sospechosos funcionando en el sistema. La función SetTcpEntry en la función de biblioteca del asistente de IP puede ayudarnos a eliminar conexiones sospechosas. Se define como:

Función de declaración pública setcpentry Lib "IPhlpAPI" (pTcpRow As MIB _ TCPROW) solamente 'Esto se usa para cerrar un puerto abierto.

Antes de llamar a esta función, el estado de la conexión que se va a eliminar debe establecerse en MIB_TCP_STATE_DELETE_TCB. MIB_TCP_STATE_DELETE_TCB también es el único estado que se puede configurar en tiempo de ejecución.

Bien, con estos ya se conocen los principios y métodos básicos de un firewall, jaja, necesitamos encapsular estas funciones y API. Utilice el siguiente código para crear un módulo de clase llamado modNetstat.

- modNetstat -

La opción explícitamente

define algunos protocolos ICMP.

Exponer MIBICMPSTATS como MIBICMPSTATS

MIBICMPSTATS de tipo público

los dwEchos tienen la misma longitud

los dwEchoReps tienen la misma longitud

Tipo de fin

Mibicminfo público como mibicminfo

Tipo público MIBICMPINFO

icmpOutStats como MIBICMPSTATS

Tipo de fin

Público MIB_ICMP As MIB_ICMP

Tipo público MIB_ICMP

Estadísticas como MIBICMPINFO

Tipo final

La función GetIcmpStatistics le permite ver el estado actual Tráfico de datagramas ICMP.

La función de declaración pública GetIcmpStatistics Lib "iphlpapi. dll "(pStats As mibimpinfo) es larga

Public Last_ICMP_Cnt es un número entero

-

Definir algunos protocolos TCP

Tipo MIB_TCPROW

dwState es Long

dwLocalAddr tiene la misma longitud

dwLocalPort tiene la misma longitud

dwRemoteAddr tiene la misma longitud

dwRemotePort tiene la misma longitud

Tipo de fin

Tipo MIB_TCPTABLE

dwNumEntries es la misma longitud

Tabla (100) El formato es MIB_TCPROW

Tipo final

tabla pública MIB _ TCP Como tabla MIB _ TCP

La función GetTcpTable puede devolver todas las conexiones TCP válidas en el sistema actual.

Declare la función GetTcpTable Lib "iphlpapi.dll" (ByRef pTcpTable es MIB_TCPTABLE, ByRef pdwSize es Long, ByVal bOrder es Long) como Long

La función SetTcpEntry puede ayudarnos a eliminar conexiones sospechosas .

Función de declaración pública setcpentry Lib "IPhlpAPI" (pTcpRow As MIB _ TCPROW) solamente 'Esto se usa para cerrar un puerto abierto.

Defina el estado de la conexión en 13.

IP_States públicos(13) en forma de cadena

Privado Last_Tcp_Cnt es un número entero

-

Definir contenido relacionado con winsock

Constante privada AF_INET = 2

Constante privada IP_SUCCESS As Long = 0

Constante privada MAX_WSADescription = 256

Constante privada MAX_WSASYSStatus = 128

Constante privada SOCKET_ERROR As Long = -1

Constante privada WS _ VERSION _ REQD As Long = ampH101

Tipo HOSTENT

h_name As Long 'Host El nombre oficial

h_aliases As Long 'Lista de alias

h_addrtype As Integer 'Tipo de dirección de host

h_length es la longitud de la dirección entera

h_addr_list Lista de direcciones As Long

Tipo final

Tipo de servicio

s_name As Long '(puntero a cadena) nombre de servicio formal

s_aliases As Long '(puntero a cadena) lista de alias (puede estar separado por nulos, terminado en 2null)

s_port As Long ' puerto #

s_proto As Long para usar '(punto a) protocolo

Tipo final

Tipo privado WSADATA

wVersion en formato entero

wHighVersion en formato entero

szDescription (0 a MAX_WSADescription) se expresa en bytes

szSystemStatus (0 a MAX_WSASYSStatus) se expresa en bytes

wMaxSockets tienen la misma longitud

wMaxUDPDG es el misma longitud

dwVendorInfo As Long

Tipo final

Función de declaración pública ntohs Lib "WSOCK32.DLL" (ByVal netshort misma longitud) misma longitud

Inet_addr convierte una dirección IP de formato de punto a un entero largo sin signo.

La función de declaración privada inet_addr Lib "WSOCK32.DLL" (ByVal CP As String) es siempre que

Inet_ntoa convierta la dirección IP del formato de punto a ascii.

La función de declaración privada inet_ntoa Lib "WSOCK32.DLL" (la misma longitud que ByVal inn) tiene la misma longitud

La función de declaración privada gethostbyaddr Lib "WSOCK32.DLL" (Addr es Long, ByVal addr_len es Long, ByVal addr_type es Long) tiene la misma longitud que Long

Función de declaración privada gethostbyname Lib "WSOCK32.DLL" (ByVal host_name como cadena)

Privado función de declaración WSAStartup Lib "WSOCK32.

DLL "(ByVal wVersionRequired As Long, lpWSADATA As WSADATA) as long

Función de declaración privada WSACleanup Lib "WSOCK32. DLL "() tiene la misma longitud

Si el valor de retorno de esta función no es 0, es la dirección de memoria. Debido a que VB no puede operar directamente la dirección, también se debe llamar a la función RtlMoveMemory para escribir la datos a la dirección.

privado Declare Sub RtlMoveMemory Lib " kernel 32 "(HPV dest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)

Convierta datos a una memoria binaria string

<. p>Declarar la biblioteca de memoria de subcopia "kernel32" alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal cb amp)

Declarar la función lstrlen Lib "kernel 32" (ByVal lpString como cualquiera) como entero

Privado bloqueado como booleano

Definir estados de red

SubinitialStates()

IP_States(0) = "Desconocido "

IP_States(1) = "Cerrar"

IP_States(2) = "Escuchar"

IP_States(3) = "Enviar inactivo sincrónico carácter"

IP_States(4) = "Recibir carácter inactivo sincrónico"

IP_States(5) = "Intercambio de datos"

IP_States(6) = "Fin esperar 1 "

IP_States(7) = "Finalizar espera 2"

IP_States(8) = "Cerrar esperando"

IP_States(9) = "Cerrar "

IP_States(10) = "La respuesta del comando es correcta"

IP_States(11) = "Conexión en espera"

IP_States(12) = "Eliminar TCP conexión"

Conector final

Función pública GetAscIP(ByVal inn As Long) en forma de cadena

Dim nStr amp

Dim lpStr As Long

Atenuar retString como cadena

retString = String(32,0)

lpStr = inet_ntoa(inn)

Si lpStr Entonces

nStr = lstrlen(lpStr)

Si nStr gt32 entonces nStr = 32

Copiar memoria ByVal retString, ByVal lpStr, nStr

retString = Left(retString, nStr)

GetAscIP = retString

Otro

GetAscIP = "No se puede obtener IP"

Si. .. Finalizará

Finalizar función

Bueno, el registro es crear un archivo de registro, por lo que encapsulamos las funciones requeridas en un módulo de clase. Crea un módulo público.

El código es el siguiente

Definición de registro

Registro de función pública (RemA es una cadena, RemP es una cadena, LocP es una cadena, Txt es una cadena)

Dim ff As Long

ff = Free File

Abrir archivo de registro

Abre la aplicación. Caminos y caminos. " \log.log "Agregar como #ff

Escribir datos en el archivo de registro

Escribir #ff, hora amp "-" fecha, RemA, RemP, LocP, Txt

Mostrar datos en la ventana de registro.

ListItems.Add, Hora y "-" y Fecha

frm log . listitems(frm log . lstlog . listitems . count). niño(1) = RemA

frm log . lstlog . listitems(frm log . lstlog . listitems . count). Elemento(2) = RemP

frm log . lstlog . listitems(frm log . lstlog . listitems . count). Elemento(3) = LocP

frm log . lstlog . listitems(frm log . lstlog . listitems . count). Subelemento (4) = Txt

Finalizar operación de registro

Cerrar #ff

Finalizar función

Bien, función y base de datos API encapsuladas. La siguiente es la interfaz de diseño y la combinación de funciones:)

Primero cree el formulario principal y cambie el nombre a frmMain aquí. No quiero sofocar tu creatividad, pero por favor no la cambies por el éxito de la prueba final del código :)

Haz clic en la sección Proyecto - e inserta el archivo Microsoft Windows. Controles comunes 6.0 (SP4) como se muestra en la Figura 1:

Coloque un pequeño gancho al frente, asegúrese:)

Vuelva al escritorio, haga doble clic en la barra de herramientas, agregue y haga clic derecho en Propiedades arriba.

Inserte los botones en secuencia, como se muestra en la Figura 2:

Imagen de estilo de título de índice

1, deje de interceptar temporalmente 1-tbrcheck.

2 Actualizar valor predeterminado de 0-tbr

3 (vacío) Separador de 3-tbr

4 Ver registro 0-tbrdefault

Insertar dos espacios ImageList llamados imgHot e imgCold.

Inserta imágenes en secuencia, que en realidad son las imágenes que se muestran en los botones "Dejar de bloquear" y otros.

Haga clic derecho en la barra de herramientas, como se muestra en la Figura 3:

Modifique la lista de imágenes a imgcold y la lista de imágenes térmicas a imghot.

Bueno, en la Figura 2, vemos el número detrás de la imagen, que es el número de la lista de imágenes imgcold :)

Agregar control ListView

Derecha -Haga clic en el título de la columna de atributos

Ancho del texto del índice

1 IP remota que puede ajustar usted mismo :)

2 puertos remotos

3 Puertos locales

4 estados

Bien, agregue un control de temporizador llamado tmrRefresh para actualizar la lista de estado de la red.

Establece el intervalo al máximo de 250.

La interfaz final es como se muestra a continuación:

Agregue el siguiente código:

Defina algunas constantes

LC privado como un número entero

Bloque público en forma de cadena

Privado a_RemA(1000) como cadena

Privado a_LocP(1000) como cadena

Privado a_RemP( 1000 ) como cadena

Privado a_Count As Long

La siguiente es la función para actualizar el estado de la red.

Función pública RefreshTable (opcional forzada a Boolean = False)

Continuar con el siguiente paso cuando ocurre un error

Dim tcpt es MIB_TCPTABLE, l es Long

Dim x es un número entero, I es un número entero

Dim RemA como una cadena, LocP como una cadena, RemP como una cadena

l = Len(MIB_TCPTABLE )

GetTcpTable tcpt, l, 0

x = tcpt.dwNumEntries

Si x ltlC o x gt entonces use carta de crédito o fuerza

lC = x

Vista de lista 1. Listar elementos. Borrar

Para i = 0 a x - 1

RemA = geta scip(TCP . table(I)). dwRemoteAddr)

RemP = ntohs(tcpt.table(i)). dwRemotePort)

LocP = ntohs(tcpt.table(i)). dwLocalPort)

Vista de lista 1. Listar elementos. Añadir. Yo, Reema

Vista de lista 1. Lista de elementos (ListView1.ListItems.Count). Niño(1) = RemP

ListView1. Lista de elementos (ListView1.ListItems.Count). Elemento(2) = LocP

Vista de lista 1. Lista de elementos (ListView1.ListItems.Count). subclave(3) = modNetstat. IP_States(estado)

Siguiente yo

Terminará si...

Finalizar función

Privado subform_Load()

Llame a la función de estado de la red

modNetstat. Estado inicial

Comience a actualizar la lista de estado de la red.

Actualizable

Conector final

Vista de lista secundaria secundaria 1 _ MouseUp (el botón es un número entero, Shift es un número entero, x es único, y es único)

Determinar si se presiona el botón derecho del mouse.

Si Botón = 2 y ListView1. ListItems. Count gtthen 0

Llame al botón de control, que se mencionará a continuación.

Furman. PopupMenu frmMenu.mnuConn

Finaliza si...

Finalizar conector

Private Sub tmrRefresh_Timer()

Actualiza periódicamente la lista de estado de la red .

Actualizable

Conector final

Subbarra de herramientas pública 1 _ Clic en el botón (botón ByVal como botón MSComctlLib.)

Botón Seleccionar caso . Índice

Caso 1

Botón de función de parada

Botón If. Caption="Detener"

Botón. Caption="Continuar"

Botón. ToolTipText = "Continuar trabajando"

tmrRefresh. enable=false

Deja de actualizar la lista de estado de la red y viceversa. Botón

Otro

. Caption="Detener"

Botón. ToolTipText = "Dejar de funcionar"

tmrRefresh. Habilitado=Verdadero

Terminará si...

Caso 2

Función del botón Actualizar

Actualizable

Caso 4

Mostrar registro

Frmlog. Mostrar

Finalizar selección

Finalizar conector

Bien, definamos el botón de control :) Es decir, haga clic derecho en la conexión de intercepción que se muestra en el estado de la red.

Crea un nuevo formulario, llamado frmMenu, que solo necesita tener un menú, como se muestra en la figura:

Modifica las propiedades del menú:

Nombre del título

Mnukanmnukan

Intercepta la conexión mnuDis

Como se muestra en la figura:

Bien, agrega el siguiente código:

Private Sub mnuDis_Click()

Atenuar tcpt como MIB_TCPTABLE

Atenuar l mientras

Atenuar l mientras

Atenuar RemA como cadena de caracteres, RemP como cadena, LocP como cadena

i = Right(frmMain. Vista de lista 1. SelectedItem. Key, Len(frmMain. List view 1. SelectedItem. Key)-1) 1

RemA = frmPrincipal. Vista de lista 1. Elemento de lista (1)

RemP = frmMain. Vista de lista 1. Listar elementos (1). Subelemento(1)

LocP = frmMain. Vista de lista 1. Listar elementos (1). Artículo(2)

l = Len(MIB_TCPTABLE)

GetTcpTable tcpt, l, 0

TCP tabla (I-1). dwState = 12

Desconecta la conexión TCP ¿Recuerdas la función mencionada al principio?

tabla settpentry TCP .(I-1)

Múltiples actividades

Escribir registro

Registro RemA, RemP, LocP, "Interceptación conexión"

Conector final

Bien, finalmente hay un formulario de operación de registro y se crea un formulario llamado Frmlog.

Se utilizan controles de comando y vista de lista y se ajusta la posición como se muestra en la figura.

Propiedades de la vista de lista

Lista de nombres

Usted puede ajustar el tamaño del texto del índice de los títulos de las columnas.

1 vez

2 IPs

3 puertos remotos

4 puertos locales

5 descripciones

p>

Agregue el siguiente código

Subcomando privado 1_Click()

Marque r como una cadena

R = MsgBox("El el registro del firewall está marcado ¡Medios efectivos de piratería "" ampvbCrLf amp; vbCrLf amp clear log ", vbQuestion ampVbYesNo, ")

Si presiona "Sí", entonces

Si r = vbSí, entonces

Dim ff As Long

ff =Liberar archivo

Abra el registro y escriba datos vacíos, es decir, borre el registro.

Abre la aplicación. Caminos y caminos. " \log.log "Salida como #ff

Cerrar #ff

Borrar la lista

lstLog. Listar elementos. Borrar

Terminará si...

Finalizar conector

Después de ejecutar el programa, intercepté con éxito un troyano que desarrollé antes y que roba contraseñas de acceso telefónico. , de la siguiente manera Como se muestra en la imagen:

La primera vez que obtuve la contraseña, no hubo intercepción. Después de la interceptación, indica que no se puede establecer la conexión.