Guía de expertos: quiero escribir un software de seguridad usando VB.
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 p>
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.