ADVERTENCIA
Este es un RAT con errores, no completado, no estable. Sigue siendo una aplicación "en progreso".
Introducción
Proyecto creado para matar algo de mi tiempo libre, no se mantiene activamente.
Hay muchas cosas que mejorar/arreglar, y llevará tiempo alcanzar estabilidad en este proyecto.
Funcionalidades
- Shell inversa
- Listar procesos
- Streaming de escritorio
- Sistema de archivos
- Descargar archivo
Entendiendo el proyecto
IThreadChannels son medios para comunicar dos hilos de forma síncrona.
Los uso como el objeto atómico compartido por dos hilos para comunicación; en esta aplicación
quiero comunicación bidireccional, así que necesito dos canales, por eso creé IDoubleThreadChannel.
Síncrono significa que deben ser llamados por los hilos que se comunican para recibir eventos según sea necesario.
Ejemplo: el hilo de la UI llamará a getFromApp() y se bloqueará allí para recibir eventos de la aplicación.
Los Comunicadores, por otro lado, gestionan su propio hilo y activan callbacks de forma asíncrona.
Tú no los llamas, ellos te llaman a ti.
Directrices
- Los objetos Packet deben ser eliminados por NetServerService
- Los punteros Client deben ser eliminados por Application.
Macros
- SHOW_CONSOLE Si se debe mostrar una consola para propósitos de depuración.
- MANUAL_MEMORY_MANAGEMENT Si es verdadero, intento gestionar la memoria que asigno (para aprender); si es falso,
usaré shared_ptr en su lugar para hacer la gestión de memoria mucho más fácil.
TODOS
- La característica de streaming de escritorio no está terminada (salir del bucle infinito).
- Eliminar errores, principalmente problemas de conversión
- El encabezado del paquete debe enviar 8 bytes para la longitud del paquete, no int32_t, así que cambiarlo a uint64_t
- Usar bloqueos de lectura/escritura https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-acquiresrwlockexclusive
- El campo dataLength en la clase Buffer es incorrecto, debería mejorarse
- El problema de los objetos Event que tienen un void* que no debe ser eliminado mediante delete void*
se puede resolver como lo hice: el consumidor del evento se encarga de convertirlo al valor esperado
y eliminarlo, o usando plantillas de clase como new AppEvent y luego se podría eliminar con delete objeto*
- La clase Buffer debería lanzar excepciones en operaciones ilegales.
- Cifrado
- Streaming de cámara
- Manejo de errores... en todas partes.