Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
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
apxutil — Una herramienta para manipular archivos de archivo PLC de Schneider Electric. | Kitploit
Herramientas/GitHubGitHub/finngineering/apxutil
Seguridad de Sistemas EmbebidosAnálisis de VulnerabilidadesExplotaciónIngeniería InversaSeguridad SCADA/ICSSeguridad de HardwareAnálisis de BinariosAnálisis de Firmware
GitHubfinngineering/apxutil

apxutil

Una herramienta para manipular archivos de archivo PLC de Schneider Electric.

Ver Repositorio
105hace 6 mesesAún no revisado

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

Una herramienta para manipular archivos de archivo PLC de Schneider Electric

Esta herramienta puede extraer y reensamblar archivos "archive" de PLC, utilizados por varios PLC de Schneider Electric, incluyendo al menos M580, M340 y Quantum. Los archivos de archivo con extensión .sta son en realidad un archivo zip que contiene unos pocos archivos. Dentro del archivo, el archivo verdaderamente importante se llama Station.apx. El contenido de ese archivo es lo que se transfiere hacia/desde el PLC durante una descarga/carga (completa) del programa. Naturalmente, contiene el código ejecutable real del programa PLC. Pero también contiene toda la información necesaria para editar el programa PLC en Control Expert Classic (o Unity Pro). El formato de archivo .apx es propietario, y hay poca información disponible. Un poco de información está disponible en Liras en la red y Team82, pero este trabajo profundiza más de lo que ellos publicaron. Con esta herramienta, las diferentes "secciones" de Station.apx pueden extraerse (y descomprimirse si es necesario) para su examen. La herramienta también puede reensamblar Station.apx a partir de datos de sección y metadatos previamente extraídos (y quizás modificados). Y este archivo reensamblado se abrirá sin errores en Control Expert Classic / Unity Pro, siempre que los cambios realizados no rompan la "lógica de sección".

Motivación

Nunca hubo un gran plan con este proyecto. Utilizo PLC de Schneider Electric de vez en cuando, y estaba interesado en cómo funcionan (o no) a un nivel más fundamental. Resultó que esta investigación era lo suficientemente compleja como para mantenerme entretenido (probablemente como resolver crucigramas para la gente normal), y terminé con esta herramienta.

Advertencia

La herramienta hace todo lo posible para extraer y reensamblar los archivos con los que trabaja. Sin embargo, el usuario debe ser consciente de que la herramienta se desarrolló con:

  • Un conocimiento limitado del formato de archivo .apx (y .sta)
  • Validación de entrada limitada, lo que significa que preferirá fallar o hacer algo incorrecto antes que rendirse sin intentarlo
  • Sobrescribe archivos anteriores sin preguntar
  • Pruebas limitadas de diferentes PLC y versiones de software de programación
  • Pruebas limitadas de la funcionalidad del código

El uso de archivos reensamblados en un PLC real puede causar problemas, especialmente si ha modificado las secciones o los metadatos. Incluso es posible que pueda bloquear el PLC. Por lo tanto, cargue archivos de archivo modificados en el PLC bajo su propio riesgo.

Uso

La herramienta se usa desde la línea de comandos con el intérprete de Python:

root@kitploit:~
python apxutil.py -h

usage: apxutil.py [-h] [-f filaname-apx] [-F filaname-sta] [-e dir] [-E dir] [-a manifestpath] [-A manifestpath] [-d]
                  [-x] [-B] [-r]

Herramienta para manipular archivos .sta y .apx de Schneider Electric

options:
  -h, --help            show this help message and exit
  -f, --apxfile filaname-apx
                        archivo .apx a leer o escribir
  -F, --stafile filaname-sta
                        archivo .sta a leer o escribir
  -e, --extract-apx dir
                        extraer el contenido del archivo Station.apx
  -E, --extract-sta dir
                        extraer el contenido del archivo .sta
  -a, --assemble-apx manifestpath
                        crear el archivo Station.apx basado en apx_manifest.ini
  -A, --assemble-sta manifestpath
                        crear un archivo .sta a partir de archivos en sta_manifest.ini
  -d, --decompress      descomprimir las secciones de Station.apx que están comprimidas
  -x, --hexdump         imprimir un volcado hexadecimal de Station.apx con información de cabecera
  -B, --include-apd     incluir Station.apd al crear el archivo .sta
  -r, --restart-offsets
                        reiniciar los desplazamientos a 0 para cada sección en la impresión del hexdump (útil para comparar diferencias)

La ayuda debería ser bastante autoexplicativa. Generalmente, las opciones abreviadas con letras mayúsculas funcionan en archivos .sta, y las letras minúsculas funcionan en archivos .apx. A continuación se dan algunos ejemplos de uso.

Para extraer el contenido de un archivo .sta al directorio "extracted", usaría:

root@kitploit:~
python apxutil.py -F archive.sta -E extracted

Para extraer el contenido de Station.apx al directorio "contents", usaría:

root@kitploit:~
python apxutil.py -f extracted/BinAppli/Station.apx -e contents -d

La opción "-d" significa que las secciones comprimidas se descomprimirán, pero se puede omitir si se desean los datos de sección sin procesar (todos).

Para reensamblar Station.apx, usaría:

root@kitploit:~
python apxutil.py -f extracted/BinAppli/Station.apx -a contents

Esto ensamblará Station.apx basado en el apx_manifest.ini encontrado en el directorio contents, comprimiendo los datos de sección si se descomprimieron previamente. Los tamaños de sección y CRC se recalcularán y no se leerán de apx_manifest.ini.

Para reensamblar un archivo .sta, usaría:

root@kitploit:~
python apxutil.py -F modified-archive.sta -A extracted

Esto omitirá de forma predeterminada el archivo Station.apd (que parece ser principalmente una comprobación de integridad de la cabecera del archivo Station.apx). Si desea que se incluya, agregue la opción "-B". Pero eso puede significar que Control Expert Classic no pueda abrir el archivo de proyecto.

Para "ver" directamente el contenido del archivo Station.apx, se puede usar el siguiente comando:

root@kitploit:~
python apxutil.py -F modified-archive.sta -x

Esto generará un "volcado hexadecimal canónico" del archivo Station.apx, lo que significa que ve los desplazamientos, datos hexadecimales y datos ASCII, 16 bytes a la vez, incluidos los metadatos. La opción "-d" se puede usar para descomprimir las secciones comprimidas (pero tenga en cuenta que los desplazamientos tienen poco sentido en ese caso). La opción "-r" se puede usar para reiniciar el desplazamiento a 0 para cada sección. Esto es útil si ha realizado cambios y desea poder "compararlos" sin desplazamientos.

Estructura del formato de archivo APX

Si desea comprender el formato de archivo APX (al nivel de mí mismo y de esta herramienta), la mejor manera es realmente mirar el código fuente de apxutil.py. El código no debería ser demasiado difícil de leer incluso con poca experiencia en programación. Pero puede causar náuseas a los programadores reales. En cualquier caso, aquí se ofrece una visión general de alto nivel del formato de archivo. El archivo APX comienza con una cabecera de archivo de 32 bytes. El resto del archivo se divide en diferentes secciones, cada una con una estructura similar. Cada sección comienza con una cabecera de sección, cuya longitud depende del tipo de sección (definido al inicio de la cabecera). La cabecera de sección va seguida de un RTE (cabecera). Después del RTE vienen los datos de la sección (si están presentes). Y después de los datos de la sección comienza la siguiente sección (cabecera). Parece que la cabecera de sección está más relacionada con el formato Station.apx y el RTE está más relacionado con el entorno de ejecución (RunTime Environment o RealTime Environment quizás?), pero no es una distinción clara.

Cabecera del archivo APX

La cabecera del archivo APX tiene 32 bytes de largo y comienza con el texto ASCII "APX", seguido de algunos metadatos. Quizás lo más importante es que define el tipo y tamaño del RTE utilizado. El tipo 0x02 es el que he visto. Parece probable que el tipo 0x01 sea para espacio de direcciones de 16 bits y el tipo 0x02 para espacio de direcciones de 32 bits, pero esto está lejos de ser seguro. Hay algunas incógnitas que probablemente tengan algún significado. Un par de valores de 32 bits y un valor de 16 bits se "repiten" en la sección "SD" 0x0001, pero se desconoce su significado. Los últimos 11 bytes parecen ser siempre ceros. Un ejemplo a continuación (en formato de volcado hexadecimal canónico, con metadatos):

root@kitploit:~
00000000  41 50 58 00 00 01 02 01 10 01 10 60 f6 c3 30 00  |APX........`..0.| ApxFileHeader(magic=0x00585041, version_maybe=0x0100, rte_type=0x02, header_count_maybe=0x01, sdsection_total_size=0x0110, rte_size=0x10, sdsection_39_4=0x30c3f660, sdsection_35_4=0x0b926500, sesection_8_2=0x0106, zero_pad_21_11=0000000000000000000000)
00000010  65 92 0b 06 01 00 00 00 00 00 00 00 00 00 00 00  |e...............|

Cabecera de sección APX

La cabecera de sección APX comienza con un valor de 16 bits que define su tipo. Los tipos 0x0001 - 0x0004 parecen ser válidos, pero solo he visto los tipos 0x0000, 0x0001 y 0x0002. La longitud de la cabecera de sección depende del tipo. Para 0x0000 la longitud es de 8 bytes, para 0x0001 - 0x0002 es de 16 bytes y para los tipos 0x0003 - 0x0004 debería ser de 24 bytes. El número de sección se da mediante un valor de 16 bits en el desplazamiento de byte 4. Para los tipos de sección 0x0000 y 0x0001, eso es todo lo que sé, y no tienen datos de sección. Para el tipo de sección 0x0002, el valor de 32 bits en el desplazamiento de byte 10 especifica el tamaño de los datos de sección, tal como están presentes en el archivo Station.apx.

RTE APX

La cabecera RTE que sigue a la cabecera de sección tiene 16 bytes de largo (al menos para el tipo 0x02). Se desconoce el significado del primer valor de 32 bits (pero aquí se denomina "block_count"). El valor de 32 bits que comienza en el desplazamiento 4 es el tamaño de los datos de sección (de la cabecera de sección) menos 1, en caso de que la sección tenga datos. Si la sección no tiene datos, se desconoce el significado (y la sección 0x0011 rompe esta regla). El valor de 32 bits que comienza en el desplazamiento de byte 8 son atributos/banderas, la mayoría de los cuales tienen un significado desconocido. Algunas reflexiones se enumeran al final de apxutil.py. El valor de 16 bits que comienza en el desplazamiento de byte 12 es la suma de comprobación CRC16/Kermit de los datos de la sección (y nuevamente, la sección 0x0011 rompe esta regla). Los 3 bits altos del byte 14 definen el área de memoria y los 5 bits bajos el folio de memoria. Es probable que el último byte 15 no se utilice.

Datos de sección APX

Los datos de sección son generalmente datos "sin procesar", que pueden contener código ejecutable, información del proyecto, datos comprimidos, etc. Parece que si el bit 13 de los atributos RTE está establecido, entonces los datos de la sección están comprimidos. Los tipos de compresión vistos son zip/"pk", zlib con cabecera no estándar y "raw deflate".

Secciones destacables

Si bien todas las secciones tienen su propio significado, parece que las secciones 0x0001 "RT" y 0x0011 "SD" son más fundamentales que el resto. Parecen estar relacionadas con los RTE y la disposición real de la memoria del entorno de ejecución del PLC. Hacia el final de apxutil.py se incluye una decodificación parcial de estas secciones, pero actualmente no es utilizada por la propia herramienta.

Misterios restantes

Hay muchas "frutas maduras" en caso de que alguien quiera investigar. Algunas preguntas abiertas:

  • ¿Dónde se almacenan los datos ejecutables? ¿En una sección o en varias?
  • ¿Dónde se almacenan las contraseñas y cómo funciona la protección/cifrado por contraseña?
  • ¿Cuál es el significado detallado de las partes más opacas de la cabecera de sección APX y los campos RTE?
  • ¿Qué datos contienen las diferentes secciones?
  • ¿Qué significa el número de sección? Parece que algunos números están "codificados de forma rígida" mientras que otros son dinámicos. En caso de que esté interesado en trabajar en esto, siéntase libre de bifurcar el repositorio y continuar, o quizás enviar un PR.
Descargar herramienta