Definitivamente sí.
No solo es posible, algunos de los programas que se ejecutan en este momento se realizan en C, por ejemplo, el código fuente de Mirai está disponible en C. No hay mucha diferencia con las posibilidades de los lenguajes entre C y C ++, por lo que todo eso se puede escribir en C ++ también se puede escribir en C.
Sin embargo, algunas cosas posibles en C no se pueden hacer en C ++. Pero virii, gusanos, botnets u otros malwares no son algunos de los cuales.
- ¿Hay juegos como corewars que usen un modelo de memoria y CPU más avanzado / realista?
- ¿Cómo se puede garantizar la privacidad de los datos, como las imágenes guardadas en el Gmail de uno o los archivos almacenados en una infraestructura basada en la nube, a la luz del escándalo NSA PRISM y demás?
- ¿Cuáles son los medios de aprendizaje y los caminos profesionales para la seguridad cibernética?
- ¿Cuál es mejor seguridad cibernética o análisis de datos?
- ¿Cuál es la razón principal por la que la seguridad de la información es diferente de otros temas de investigación?
Verán, un virus no es más que un programa de enlace malicioso, como “ld”, si lo desea, una herramienta que también está naturalmente escrita en C. Manipula algunas estructuras de datos de archivos ejecutables, como el formato ELF o el colgante en Windows. Totalmente posible en algo como C.
Puedes hacer un gusano en C, porque eso es solo un poco de código de red, más o menos. ¿Y las botnets? Solo una variante distribuida de un gusano.
Debido a que estas funciones se han vuelto bastante elaboradas hoy en día, a menudo vemos todo tipo de malwares realizados en C o C ++. E incluso la mayoría de los exploits son factibles en C. Bueno, creo que es más fácil hacerlo en Assembly, para ser honesto, y especialmente si haces desbordamientos de buffer y ataques de explotación de stack, Assembly es realmente útil. Pero no es imposible hacer eso en C. Simplemente no es una fortaleza de un lenguaje de alto nivel hacer tales cosas.
Significa que las cosas típicas de gusanos, virus, troyanos y malware se pueden hacer bien en eso y también es bastante sensato usar C para eso. Porque de hecho es un trabajo de implementación y no tiene que preocuparse demasiado por los ciclos. El tamaño importa, por supuesto, y puede aterrizar en una situación en la que su código C ha explotado su malware de una manera, que ya no es sensible para la implementación fuera del laboratorio.
Pero realmente depende de las circunstancias.
En 1990 más o menos, típicamente programamos malwares en ASM. Pero creo que el gusano Morris fue el primero que recuerdo haber hecho en C. No recuerdo cómo me senté sobre su código fuente para analizarlo. Pero eso fue hace mucho tiempo, así que no estoy muy seguro de si ese fue el gusano Morris o algo más tarde.
Al menos recuerdo que cuando se creó el VTC (Centro de Pruebas de Virus de la Universidad de Hamburgo), yo era uno de los estudiantes que había sido la primera generación. Y teníamos una disputa sobre eso, si se podía hacer malware en HLL. Y todos teníamos la tarea para venir con alguna prueba. La próxima semana tuvimos virii en Forth, Lisp y todo tipo de lenguajes, tuve una solución en C, que era uno de esos lenguajes “imposibles” para eso.
Hasta ese momento había sido la sabiduría reconocida, que esto era solo el dominio de la Asamblea, porque tienes posibilidades limitadas de autorreferencia en HLL. Pero encontré una forma de eludir ese límite cuando mis colegas encontraron sus caminos. Si desea hacer referencia al código en la memoria, tiene una dirección que aparece en C. Y también puede abordar el final de ese código simplemente usando una etiqueta o una función diferente que se coloca detrás de esa función.
Puede copiar los códigos de operación de la memoria a un lugar diferente en la memoria, simplemente accediendo a la dirección y longitud de la función. Entonces, sí, no es ningún problema hacer todas esas cosas en C. Incluso no solo puede escribir máquinas virtuales con ellas, sino que también puede hacer la compilación JIT en un espacio de datos y ejecutar esas cosas también.
No es difícil, solo en ese momento no era de conocimiento común que esto era posible. Pero lo hicimos entonces, puedes hacerlo ahora. Solo con C ++ tenga en cuenta que el concepto de memoria de C ++ es diferente al de C y aterriza en el infierno si comienza a usar “nuevo” u otro tipo de administración de memoria dinámica de ese lenguaje bastardo.
Si haces eso, mejor usa malloc () y free () en su lugar. Eso está mucho más bajo control. Ambas formas son (a menudo no siempre) incompatibles entre sí, así que tenga en cuenta eso.
Entonces, si escribe algo así, mi consejo sería usar C para eso y no C ++. C ++ simplemente no es la herramienta adecuada para eso. Pero no es imposible hacerlo. Es solo que no tienes el tipo de control sobre lo que haces en C ++ como lo tienes en C. C ++ realmente se está volviendo loco y hace algunas cosas que no sabes y no quieres que haga. hazlo, pero lo hace de todos modos y no tienes forma de detenerlo para hacerlo.
Esa es también una de las razones por las que dejé de usar C ++. Muy buen lenguaje, pero tiene algunas desventajas desagradables, que no quiero heredar en mis proyectos. El núcleo de Linux tiene una buena razón para estar escrito en C y no en C ++.
El problema con C ++ es que su código se ejecuta hoy, pero mañana, cuando vuelvan a joder algo en el STL, ya no se ejecutará. Eso es algo que ya se ha comido meses y meses de mi vida, razón por la cual no estoy usando C ++ sino C para todo el trabajo de implementación.
Si tiene un error en su programa, puede encontrarlo mucho más fácil en C que en C ++. Porque si logras dispararte en el pie con C ++, no solo falta el pie, sino también la pierna y una buena parte de tu vientre. Y en esa condición, intente correr para la fecha límite y joder el código.
Prefiero usar idiomas fáciles en todas las circunstancias. Los lenguajes complejos son una mala idea si está en el nivel de implementación. La complejidad en el nivel del script está bien a veces, pero, por favor, no en el nivel de implementación.