En JavaScript, ¿qué es la ingeniería inversa?

Ingeniería inversa con JavaScript

He estado haciendo una gran cantidad de ingeniería inversa y muy a menudo surge algo común: realmente me gustaría tener una herramienta para esto porque necesito mirar esta API en particular, o ver qué sucedería si hago esto vs eso , etc.

¿Es realista?

Es bastante trabajo construir una herramienta desde cero, y las herramientas existentes no son realmente adecuadas para el tipo de caso de uso de inversión iterativa. También me gustaría tener un ciclo de retroalimentación realmente corto al hacer esto, porque como inversión, mi comprensión del problema tiende a evolucionar a medida que avanzo, lo que significa que necesito retroceder para adaptar la herramienta. Si luego tengo un ciclo de retroalimentación largo, entonces voy a perder mucho tiempo, y al final podría ser mejor hacer las cosas a mano y pasar por el minucioso proceso utilizando herramientas convencionales.

También me gustaría tener solo un juego de herramientas, de modo que, independientemente de la plataforma en la que me encuentre, solo hay un juego de herramientas que necesito aprender una vez. Por supuesto, hay partes específicas de la plataforma involucradas, pero al menos no tengo que volver a aprender lo básico cada vez.

oSpy

En 2004 estaba haciendo una gran cantidad de ingeniería inversa de protocolos. En ese momento, me estaba centrando en Windows Live Messenger, ya que estaba usando Linux y quería una paridad de características razonable con mis amigos que usaban la versión de Windows. Más tarde, también obtuve un Windows Phone, y resultó que solo los modelos más antiguos eran compatibles con el software de sincronización disponible para usuarios de Linux. Mientras hacía la inversión de ActiveSync, terminé creando una herramienta llamada oSpy que se ve así:

Es algo así como Wireshark, pero funciona en el nivel API, lo que significa que puede ver las comunicaciones encriptadas y casi cualquier cosa que desee. Esto se escribió en C #, e inyecté código en el proceso de destino para instrumentarlo, y ese código se escribió en C. Esto fue muy poderoso ya que podía rastrear cualquier función que quisiera.

Con gran poder vino una gran complejidad

Desarrollar el código inyectado fue un proceso largo y tedioso. Para cada función rastreada, tendría que escribir un poco de repetitivo. Luego tuvo que compilarlo, reiniciar la aplicación de destino en caso de que la dejó en un estado inestable la última vez, implementar su carga útil, inyectarla y finalmente esperar a que la aplicación de destino llame a esa API. Bueno, el ciclo de retroalimentación fue bastante horrible. oSpy ayudó enormemente para los desafíos que enfrentaba en ese momento, pero fue algo muy lento para evolucionar, y no fue muy portátil.

Intentando otra vez

Más tarde, tuve nuevos proyectos de inversión y me encontré agregando hacks temporales a la base de código de oSpy. Tan poderoso como era el rastreo de funciones de bajo nivel, no podía dejar que oSpy se convirtiera en el fregadero de la cocina, y no era realmente posible seguir escribiendo esos bits en C. Esto me llevó a crear oSpy2, donde intenté saque C de la ecuación permitiéndole definir funciones para rastrear declarativamente a través de un archivo de configuración:

Artículo completo: Ingeniería inversa con JavaScript

Y las fuentes adicionales:

Resumen Tradicionalmente, se llevaron a cabo una gran cantidad de aplicaciones sin la intervención de redes globales como Internet. Pero ahora, a medida que la era de la Web 2.0 está emergiendo a un ritmo cada vez más rápido hoy y llegó para quedarse, estas aplicaciones se están volviendo cada vez más dependientes de Internet como plataforma base. A medida que el dominio de la aplicación aumenta en todo el mundo, la variedad en el tipo de contenido web también aumenta y supera el mero HTML tradicional. El tipo de mejoras generadas en las páginas HTML, tal como las ve un cliente, son introducidas por tecnologías como JavaScript, Flash y Silverlight. Dado que estas aplicaciones están creciendo ampliamente y se están volviendo cruciales, aquí la intención es arrojar luz sobre los métodos para buscar lagunas de seguridad como XSS (Cross-Site Scripting) en JavaScript, específicas para las implementaciones de la Web 2.0 que consumen información de fuentes no confiables. Los métodos descritos se refieren tanto al análisis estático como al dinámico. Las herramientas que se han empleado en este documento están aquí en un archivo PDF: http://www.net-security.org/dl/a…

Ingeniería inversa Una función de cifrado para eliminar direcciones de correo electrónico

La ingeniería inversa no se limita a JavaScript de ninguna manera. Este proceso implica encontrar algo que ya funciona, desgarrarlo para aprender sobre su funcionamiento interno, y luego descubrir cómo volver a armarlo y recrearlo usted mismo.

En términos de JavaScript y otras tecnologías relacionadas con el desarrollo web, soy un gran defensor de la ingeniería inversa; de hecho, es cómo aprendí a codificar (y hacer casi todo lo demás en mi vida). La forma más sencilla de comenzar es encontrar un tutorial bien escrito que ofrezca el código fuente en GitHub, clonar el repositorio y ejecutarlo localmente (quizás siguiendo sus instrucciones de inicio si no tiene experiencia con esto).

Antes de pasar por el tutorial en sí, busque el código y vea cómo funciona. “No tengo idea de qué es esto … ¿qué sucede si borro esta línea?” Encuentre dónde se inicializa la aplicación y siga la ruta lógica que la hace funcionar. ¿Por qué el autor hace las cosas de esa manera?

Haz preguntas y luego respóndelas por ti mismo. Encuentra formas de mejorar el código. Si se atasca, consulte el tutorial y / o el autor y aproveche el poder de la comunidad en StackOverflow.

revertir la ingeniería es revertir algo que no sabes nada al respecto

revertir el código de JavaScript tal vez se llamará “Desobfuscating”

entonces puedes usar muchas herramientas como:

  1. Codificación implacable JSDetox
  2. JavaScript Deobfuscator
  3. Wepawet “Inicio
  4. JavaScript Deobfuscator (extensión para firefox)
  5. Depurador de Rhino
  6. etc …

La ingeniería inversa es cuando desarmas algo, ves cómo funciona y lo vuelves a armar. En software, las personas usan el término para significar recrear un producto web / software, como Pinterest o Twitter, desde cero.

Esto no se limita a JavaScript, pero ciertamente está incluido.