Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
binprotect — ofuscador bin2bin para PE x64 que no añade una sección al binario | Kitploit
Herramientas/GitHubGitHub/noahware/binprotect
Análisis EstáticoAnálisis Dinámico (Sandboxing)Ingeniería InversaAnálisis de MalwareAnálisis de Binarios
GitHubnoahware/binprotect

binprotect

ofuscador bin2bin para PE x64 que no añade una sección al binario

Ver Repositorio
3043611hace 1 mesRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Instrucciones de compilación

Vea 4. Compilación para obtener instrucciones de compilación.

Contenido

  1. Introducción
  2. Reescritor binario
    • 2.1. Seguimiento de direcciones relativas
    • 2.2. Desensamblado
      • 2.2.1. División de bloques básicos
      • 2.2.2. Flujo de control indirecto
        • 2.2.2.1. Tablas de saltos
          • 2.2.2.1.1. Tablas de saltos acotadas
          • 2.2.2.1.2. Tablas de saltos no acotadas
          • 2.2.2.1.3. Diferentes tipos de tablas de saltos
        • 2.2.2.2. Casos límite
      • 2.2.3. Funciones
      • 2.2.4. Manejo de llamadas 'noreturn'
    • 2.3. Soporte de excepciones
      • 2.3.1. Soporte de desenrollado
        • 2.3.1.1. Implementación
      • 2.3.2. Análisis de información de excepciones
        • 2.3.2.1. SEH/C_SCOPE_TABLE
        • 2.3.2.2. FuncInfo3 y FuncInfo4
      • 2.3.3. Análisis de RTTI y ThrowInfo
        • 2.3.3.1. RTTI
        • 2.3.3.2. ThrowInfo
  3. Ofuscación
    • 3.1. Máquina virtual
      • 3.1.1. Soporte de desenrollado
    • 3.2. Bloques de predicados opacos
    • 3.3. Aplanamiento de flujo de control
    • 3.4. Sustitución lineal
    • 3.5. Aritmética booleana mixta
  4. Compilación
  5. Uso
  6. Acrónimos
  7. Créditos

1. Introducción

Este ofuscador es bin2bin, lo que significa que toma un binario ejecutable ya compilado y lo reproduce aplicando los pases de ofuscación. Esto se puede usar para proteger una aplicación sin tener acceso al código fuente original. Por ahora solo se admiten archivos PE x64 (ejecutables portátiles), pero hay planes de agregar soporte para otros formatos binarios (por ejemplo, ELF) en el futuro.

Actualmente, todos los ofuscadores bin2bin conocidos insertan una sección al final del binario para colocar el código o los datos ofuscados en su interior. Esto es para que el diseño original del binario se conserve sin tener que cambiar el contenido de las secciones preexistentes. Esto es mucho más fácil de gestionar ya que mantiene la mayoría de las RVA (direcciones relativas) válidas.

Este proyecto adopta un enfoque único para bin2bin, donde cualquier código o dato ofuscado se inserta dentro de las secciones originales del binario. Esto requiere rastrear cada RVA en la aplicación. Los beneficios de este enfoque son:

  • Menos sospechoso para el análisis de malware ya que no se agregan secciones ejecutables adicionales al binario. Nota: esto se probó únicamente con fines educativos y de investigación.
  • Tamaño reducido del binario ejecutable de salida. Esto se debe a que el código original no ofuscado se puede borrar del binario ya que las secciones pueden redimensionarse.
  • Más difícil de analizar, ya que un ingeniero inverso no podrá separar el código ofuscado y no ofuscado solo por las secciones en las que se encuentran, cada rutina tendría que ser revisada para ver si está ofuscada.

Este documento describirá tanto la reescritura del binario ejecutable como las técnicas de ofuscación implementadas. Se han implementado las siguientes técnicas de ofuscación:

  • Máquina virtual.
  • Predicados opacos.
  • Aplanamiento de flujo de control.
  • Sustitución lineal.
  • Aritmética booleana mixta.

Además, este proyecto también tiene soporte de excepciones (excepciones de C++ y SEH) y es capaz de ofuscar funciones que tienen manejo de excepciones.

Para ayudar con el desensamblado y el descubrimiento de código en el binario, se aceptan opcionalmente archivos de símbolos (tanto PDB como MAP). Proporcionar archivos de símbolos no es obligatorio, pero ayuda con el desensamblado en binarios complejos. Algunas funciones como el soporte de excepciones y el aplanamiento de flujo de control requieren que se proporcione un archivo de símbolos.

2. Reescritor binario

Un reescritor binario toma un binario ejecutable y cambia el código o los datos en su interior para producir un binario de salida con los cambios aplicados.

2.1. Seguimiento de direcciones relativas

A medida que el código ofuscado se inserta directamente en las secciones originales del binario, se deben rastrear las direcciones relativas en el programa para que todas las referencias a ellas puedan ajustarse. Esto es para que las referencias sigan apuntando a la misma ubicación después de que se haya insertado el código y los datos. De lo contrario, se accedería a datos o código en la ubicación incorrecta, lo que cambiaría el comportamiento del binario de salida y causaría una inestabilidad grave.

Cada vez que se encuentra una referencia a una dirección relativa (por ejemplo, instrucciones que contienen operandos relativos a rip o directorios de datos PE), se agrega a una lista de seguimiento para actualizarla al final de la reescritura. Se rastrea la RVA donde ocurre la referencia (para saber dónde actualizar la referencia) así como la RVA a la que se hace referencia (para saber con qué RVA actualizar la referencia).

Cada vez que el desensamblador encuentra una instrucción relativa a rip, la agrega a una lista de referencias para actualizar al final de la ofuscación. Esto asegura que todas esas instrucciones sigan apuntando a la ubicación que tenían originalmente. Otros casos de instrucciones relativas, como las tablas de saltos, también se agregan como referencias a actualizar.

Todas las RVA rastreadas deben ajustarse cada vez que se insertan o eliminan bytes del binario. Por ejemplo, aquí está el manejador de inserción de bytes:```cpp
void binwrite::binary_t::insert(const rva_t rva, const std::span data, const bool inclusive)
{
buffer_.insert_range(buffer_.begin() + rva.value(), data);

update_rvas(rva, static_cast<rva_t::size_type>(data.size()), inclusive);  

}

`update_rvas` es donde se actualiza cada RVA rastreado para reflejar el cambio que ocurrió en el binario. Aquí hay un diagrama de este proceso:

![](https://assets.kitploit.com/production/public/readmes/8091/12aaec3746c267c932ab3804b13df50c08a463c403417bf6ba4a52f39d12f48a.png)

Figura 1. Seguimiento de direcciones relativas.

Los datos insertados (azul) desplazan los datos actuales (gris). El RVA referenciado por la instrucción (naranja) se actualiza para apuntar a la misma memoria, teniendo en cuenta los datos insertados (azul).

## 2.2. Desensamblaje

Todas las entradas de código potenciales (exportaciones, punto de entrada, reubicaciones que apuntan a la sección de código, etc.) se añaden a una cola de desensamblaje. Si hay un archivo de símbolos, todas las funciones descritas por dicho archivo también se añaden a la cola de desensamblaje. Cada entrada en la cola se trata como un bloque básico individual.

Un bloque básico es un grupo de instrucciones sin bifurcaciones; esto significa que termina en instrucciones de flujo de control (por ejemplo, salto, ret, int). Los bloques básicos no terminan en llamadas, ya que se espera que retornen en la mayoría de los casos. Algunas funciones no retornan (por ejemplo, _CxxThrowException) y se denominarán llamadas 'noreturn' en adelante.

Cuando se procesa un bloque básico de la cola de desensamblaje, cada instrucción se desensambla comenzando desde el inicio hasta que ocurre una de las siguientes condiciones:

- Se alcanza otro bloque básico ya analizado, lo que provoca una superposición. Consulte "División de bloques básicos".  
- Se encuentra una instrucción de terminación (salto, retorno, int).  
- El desensamblaje de la instrucción ha fallado.  
- Se ha encontrado relleno de código.

A continuación se muestra un diagrama del desensamblaje y la entrada de la cola de desensamblaje (la verificación de relleno de código se omite en el diagrama). Esto se repite hasta que la cola de desensamblaje esté vacía.

![](https://assets.kitploit.com/production/public/readmes/8091/7fe76b27e9f1f6ef620bc3aca182b85f9075c1dd31441e565099c05cfa396098.png)

Figura 2. Procesamiento de desensamblaje.

### 2.2.1 División de bloques básicos
Descargar herramienta