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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Mejor manera de programar una subrutina en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Mejor manera de programar una subrutina en C++  (Leído 5,420 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Mejor manera de programar una subrutina en C++
« en: 20 Mayo 2016, 12:56 pm »

Siguiendo como funcionan las clases en python, sabemos que una clase en python tiene sus atributos propios (self.*) y sus métodos que pueden ser accesibles desde dentro o fuera, pero además tiene un método __init() que se ejecuta automáticamente al llamar a la clase.

Así pues si queremos un thread que realice una determinada tarea este método es muy eficaz, por ejemplo para hacer ARP spoofing, debemos de trabajar con listas de hosts, funciones que afectan sobre ellos, y luego tenemos que permitir acceso externo para poder detenerlo o reiniciarlo.

Así pues creo este hilo para buscar cual es la mejor forma de programar esas subrutinas o módulos que están formados por funciones estáticas, atributos propios, y luego funciones externas que hacen de wrapper de los anteriores para poder controlar el funcionamiento de la subrutina desde otra parte del código externa.

Y bien ¿qué ideas se me han ocurrido?, me gustaría ver cuáles se os ocurrirían a vosotros y debatirlo hasta encontrar la manera más eficaz. La idea es no dar visibilidad en partes donde no se necesita, proteger el código.

1. Crear un namespace, con funciones que hacen de wrapper y pueden ser llamadas por terceros para controlar la subrutina. Y declarar las funciones correspondientes a la subrutina como static fuera del namespace.

spoofing.h

Código
  1. namespace Spoofing
  2. {
  3. Init();
  4. Restart();
  5. Uninit();
  6. };
  7.  
  8. void EscanearRed();
  9. void RealizarSpoofing();
  10. ...
  11.  

spoofing.cpp

Código
  1.  
  2. static BOOL * run = new BOOL();
  3.  
  4. Spoofing::Init()
  5. {
  6.     *run = TRUE;
  7.     hosts
  8.     param1, param2
  9.     //declaramos aqui todas las variables de la subrutina, la lista de hosts...
  10.     //y las inicializamos con las funciones static.
  11.     while(*run)
  12.     {
  13.     EscanerRed();
  14.     if(hosts)
  15.          thread spoof(RealizarSpoofing, param1, param2);...
  16.     }
  17.     ...
  18. }
  19.  
  20. Spoofing::Uninit()
  21. {
  22.     *run = FALSE;
  23. }
  24.  
  25. ...
  26.  
  27. static void EscanearRed(para1, param2)
  28. {
  29.      if(*run)
  30.          ...
  31. }
  32. static void RealizarSpoofing()
  33. {
  34.      while(*run)
  35.          ...
  36. }
  37.  

Utilizo una variable booleana para detener los subthreads que genera la subrutina. De esta manera controlo la subrutina desde el namespace. Al incluir al main.cpp la cabecera spoofing.h no tiene visibilidad a funciones que no son del namespace, no tiene acceso a datos que no le interesan.

Lo malo que hay que pasar parametros del namespace a las funciones static, ¿sería mejor declarar todas las variables fuera de Init() para así  no tener que estar pasandolas como argumento de una funcion a otra?, como ocurre con el BOOL* que gracias a que esta fuera no es necesario pasarlo entre funciones.

2. Crear una clase con todos los atributos, ponerla un método Init(), Uninit(), Restart(). Un constructor que inicialice a NULL los atributos, y tras instanciar la clase pasar a llamar a Init(), Uninit(), etc. Lo malo de esto sería que esa clase para poderla usar desde fuera habría que pasar su dirección de memoria. Por ejemplo si en el main.cpp la instanciamos y llamamos a Init(), y luego en archivox.cpp queremos llamar a Uninit(), debemos de pasarle la dirección de la clase instanciada.

También puede tener funciones estáticas.

De momento pongo estos 2 que son los que más me han hecho dudar, y sí también se puede poner todo con funciones staticas, pero ya que es C++ vamos a aprovechar los namespaces y las clases.

Agradecería críticas constructivas

¿Cual creéis que es la mejor? ¿y cuál usaríais vosotros?.

Saludos!!.



En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Mejor manera de programar una subrutina en C++
« Respuesta #1 en: 21 Mayo 2016, 06:27 am »

Citar
La idea es no dar visibilidad en partes donde no se necesita, proteger el código.

Suena que estas haciendo una biblioteca de funciones privada, no veo problema en ello solo que me da curiosidad el tema.

Que libreria estas usando internante libnet? libpcap?

Realmente tengo poca expriencia con C++ (Orientado a objetos) se leer y escribir el codigo pero como tu dices no he experimentado el sacarle provecho al namespace.

Creo que C++ y también maneja elementos privados y publicos no?

http://stackoverflow.com/questions/860339/difference-between-private-public-and-protected-inheritance

saludos


En línea

kub0x
Enlightenment Seeker
Colaborador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: Mejor manera de programar una subrutina en C++
« Respuesta #2 en: 21 Mayo 2016, 08:18 am »

Buenas Kaxper ;)

Bienvenido al maravillosos mundo de la OOP (prog. orientada a objetos), dónde mínimo hay que leer sobre patrones de diseño, jerarquía y estructura de clases, herencia multiple, clases abstractas, interfaces, overrides, overload, herencia virtual etc

Si tienes una clase que es única, por ejemplo con métodos estáticos, lo mejor es que implementes el patrón Singleton en la misma, por lo tanto a la hora de utilizar un método de dicha clase tendrías: Clase.GetMiClase().MétodoStatic() y ya habrías convertido dichos métodos estáticos en el paradigma de OOP.

Si quieres desde un Thread llamar a un método de una clase instanciada puedes referenciar un puntero a un miembro de dicha clase y llamarlo desde la rutina del Thread, sin necesidad de aislar la lógica de una clase, por lo tanto queda mejor estructurado.

Separar tu módelo de programación en múltiples clases, sin escribir código, sólo la lógica (funciones/clases/dependencias), te será de gran ayuda a la hora de visualizar como quedará el proyecto, además solucionará los problemas de herencia que puedas llegar a tener, pues lo mejor de programar es tener una vision temprana del proyecto, sino tocará reescribir o morir programando.

Creo que C++ y también maneja elementos privados y publicos no?

Así es, soporta herencia privada, pública, protected y virtual.

Saludos!
En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Mejor manera de programar una subrutina en C++
« Respuesta #3 en: 21 Mayo 2016, 15:02 pm »

Hola a los 2 gracias por las respuestas.

Suena que estas haciendo una biblioteca de funciones privada, no veo problema en ello solo que me da curiosidad el tema.

Que libreria estas usando internante libnet? libpcap?

Lo que busco es hacer visible para fuera solo lo que haga falta, si quiero hacer arp spoofing, no quiero que desde fuera tengan acceso a las funciones para hacerlo, sino que simplemente tengan acceso a iniciar, detener, reiniciar. Y por eso solo debe ser visible esa parte, la idea hasta ahora es meterlo en un namespace los métodos accesibles desde fuera, y las funciones que no tienen porque ver en static que desarrollan la subrutina.

Uso winpcap es para windows.

La visibilidad sin clases (donde si se puede poner private, protected, public..), hay que hacerla desde metiendo solo lo justo en los archivos de cabecera que incluiremos donde queramos luego acceder a ese módulo.

Separar tu módelo de programación en múltiples clases, sin escribir código, sólo la lógica (funciones/clases/dependencias), te será de gran ayuda a la hora de visualizar como quedará el proyecto, además solucionará los problemas de herencia que puedas llegar a tener, pues lo mejor de programar es tener una vision temprana del proyecto, sino tocará reescribir o morir programando.

Si buen consejo, aunque el proyecto en sí es muy variable en contenido, cada día se me antoja una cosa XD, pero bueno ya están centradas las ideas principales.

En python al llamar una clase te ejecuta su método init() y corre con sus atributos y otros métodos, en c++ ¿como puedo hacer eso?.

...Lo he estado pensando y ya te digo, con singleton una clase puede trabajar como un namespace.
Lo unico que en un namespace no se pueden declarar variables, tienen que ponerse estáticas en su .cpp donde se declaran sus funciones, ambas se pueden hacer.

Saludos!.
« Última modificación: 21 Mayo 2016, 15:18 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Mejor manera de programar una subrutina en C++
« Respuesta #4 en: 21 Mayo 2016, 15:47 pm »

En python al llamar una clase te ejecuta su método init() y corre con sus atributos y otros métodos, en c++ ¿como puedo hacer eso?.

Eso viene siendo el constructor. En C++, Java y otros lenguajes, lo haces con un método con el mismo nombre que la clase, sin tipo de retorno. Sobrecargable para los parámetors que quieras, eso sí.
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Mejor manera de programar una subrutina en C++
« Respuesta #5 en: 21 Mayo 2016, 21:21 pm »

Bueno tiene pinta que eso del Singleton va a dar mucho juego.

Nunca lo había probado no sabía muy bien que función le podía dar cuando lo veía, ahora he buscado unos ejemplos en cpp y tiene pinta de que va a esta bastante entretenido.

Quizás incluso remplace el namespace por una clase Singleton XDD.

Código
  1. class S
  2. {
  3. public:
  4. static S& getInstance()
  5. {
  6. static S    instance;
  7. return instance;
  8. }
  9. void set(int b){a = b;}
  10. void imprime(){cout <<a; }
  11. private:
  12. int a;
  13. S() { a = 22; }
  14. S(S const&);              // Don't Implement.
  15. void operator=(S const&); // Don't implement
  16.  
  17. };
  18.  
  19. S::getInstance().imprime();
  20. S::getInstance().set(6);
  21. S::getInstance().imprime();
  22.  

Saludos!!
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
QUE MANERA BRUTAL DE PROGRAMAR EN ACTIONSCRIPT!
Diseño Gráfico
Snoopyhack 9 3,873 Último mensaje 14 Enero 2006, 15:29 pm
por BenRu
¿Mejor manera de restringir acceso?
PHP
19.5 5 2,166 Último mensaje 18 Diciembre 2007, 08:57 am
por WHK
Mejor manera de formatear « 1 2 »
Software
motocros_elche 19 5,711 Último mensaje 3 Noviembre 2011, 16:08 pm
por motocros_elche
Como programar un Bot que navegade manera automatica
Programación General
javimarin 3 6,936 Último mensaje 21 Junio 2012, 16:48 pm
por oPen syLar
Diferencia entre manera de programar
.NET (C#, VB.NET, ASP)
novalida 7 3,730 Último mensaje 3 Julio 2012, 22:55 pm
por MaLkAvIaN_NeT
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines