Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
apxutil — Инструмент для манипуляции архивными файлами PLC Schneider Electric | Kitploit
Инструменты/GitHubGitHub/finngineering/apxutil
Безопасность встроенных системАнализ уязвимостейЭксплуатацияОбратная инженерияБезопасность SCADA/ICSАппаратная БезопасностьАнализ Бинарных ФайловАнализ Прошивок
GitHubfinngineering/apxutil

apxutil

Инструмент для манипуляции архивными файлами PLC Schneider Electric

Репозиторий
105218 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Инструмент для работы с архивными файлами ПЛК Schneider Electric

Данный инструмент может извлекать и собирать заново архивные файлы ПЛК, используемые несколькими ПЛК Schneider Electric, включая как минимум M580, M340 и Quantum. Архивные файлы с расширением .sta на самом деле являются zip-архивами, содержащими несколько файлов. Внутри архива самым важным файлом является Station.apx. Содержимое этого файла передается в/из ПЛК во время (полной) загрузки/выгрузки программы. Естественно, он содержит фактический исполняемый код программы ПЛК. Но он также содержит всю информацию, необходимую для редактирования программы ПЛК в Control Expert Classic (или Unity Pro). Формат файлов .apx является проприетарным, и о нем доступно мало информации. Немного информации можно найти на Liras en la red и Team82, но эта работа идет глубже, чем их публикации. С помощью этого инструмента различные "разделы" из Station.apx могут быть извлечены (и при необходимости распакованы) для изучения. Инструмент также может собрать Station.apx из ранее извлеченных — и, возможно, измененных — данных разделов и метаданных. И этот собранный файл откроется без ошибок в Control Expert Classic / Unity Pro, если внесенные изменения не нарушают "логику разделов".

Мотивация

У этого проекта никогда не было грандиозного плана. Время от времени я использую ПЛК Schneider Electric, и мне было интересно, как они работают (или не работают) на более фундаментальном уровне. Как оказалось, это исследование было достаточно сложным, чтобы развлекать меня (вероятно, как решение кроссвордов для обычных людей), и в итоге я создал этот инструмент.

Предупреждение

Инструмент делает все возможное для извлечения и сборки файлов, с которыми он работает. Однако пользователь должен знать, что инструмент разрабатывался с:

  • Ограниченным пониманием формата файлов .apx (и .sta)
  • Ограниченной проверкой входных данных, то есть он скорее вызовет сбой или сделает что-то неправильно, чем откажется без попытки
  • Перезаписью предыдущих файлов без запроса
  • Ограниченным тестированием различных ПЛК и версий программного обеспечения
  • Ограниченным тестированием функциональности кода

Использование собранных файлов на реальном ПЛК может вызвать проблемы, особенно если вы изменили разделы или метаданные. Возможно даже, что это может привести к выходу ПЛК из строя. Поэтому загружайте измененные архивные файлы в ПЛК на свой страх и риск.

Использование

Инструмент используется из командной строки с интерпретатором python:

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]

Tool to manipulate Schneider Electric .sta and .apx files

options:
  -h, --help            show this help message and exit
  -f, --apxfile filaname-apx
                        .apx file to read or write
  -F, --stafile filaname-sta
                        .sta file to read or write
  -e, --extract-apx dir
                        extract contents of the Station.apx file
  -E, --extract-sta dir
                        extract contents of the .sta file
  -a, --assemble-apx manifestpath
                        create Station.apx file based on apx_manifest.ini
  -A, --assemble-sta manifestpath
                        create a .sta file from files in sta_manifest.ini
  -d, --decompress      decompress Station.apx sections that are compressed
  -x, --hexdump         print hexdump of Station.apx with header information
  -B, --include-apd     include Station.apd when creating .sta archive
  -r, --restart-offsets
                        restart offsets at 0 for each section in hexdump print (useful for diffing)

Справка должна быть достаточно понятной. Как правило, краткие опции с заглавными буквами работают с файлами .sta, а строчные — с файлами .apx. Несколько примеров использования приведены ниже.

Чтобы извлечь содержимое файла .sta в каталог "extracted", используйте:

python apxutil.py -F archive.sta -E extracted

Чтобы извлечь содержимое Station.apx в каталог "contents", используйте:

python apxutil.py -f extracted/BinAppli/Station.apx -e contents -d

Опция "-d" означает, что сжатые разделы будут распакованы, но ее можно опустить, если нужны (все) необработанные данные разделов.

Чтобы собрать Station.apx, используйте:

python apxutil.py -f extracted/BinAppli/Station.apx -a contents

Это соберет Station.apx на основе apx_manifest.ini, найденного в каталоге contents, сжимая данные разделов, если они были предварительно распакованы. Размеры разделов и CRC будут пересчитаны, а не считаны из apx_manifest.ini.

Чтобы собрать файл .sta, используйте:

python apxutil.py -F modified-archive.sta -A extracted

По умолчанию при этом будет опущен файл Station.apd (который, по-видимому, в основном служит для проверки целостности заголовка файла Station.apx). Если вы хотите его включить, добавьте опцию "-B". Но это может привести к тому, что Control Expert Classic не сможет открыть файл архива проекта.

Чтобы напрямую "просмотреть" содержимое файла Station.apx, можно использовать следующую команду:

python apxutil.py -F modified-archive.sta -x

Это выведет "канонический hexdump" файла Station.apx: вы увидите смещения, шестнадцатеричные данные и ASCII-данные по 16 байт за раз, включая метаданные. Опция "-d" может использоваться для распаковки сжатых разделов (но учтите, что смещения в этом случае теряют смысл). Опция "-r" позволяет перезапускать смещение с 0 для каждого раздела. Это полезно, если вы внесли изменения и хотите иметь возможность "сравнить" их без смещений.

Структура формата файла APX

Если вы хотите понять формат файла APX (на том уровне, на котором понимаю его я и этот инструмент), лучше всего посмотреть исходный код apxutil.py. Код не должен быть слишком сложным для чтения даже при небольшом опыте программирования. Но он может вызвать тошноту у настоящих программистов. В любом случае, здесь дается общий обзор формата файла. Файл APX начинается с 32-байтового заголовка файла. Остальная часть файла разделена на различные разделы, каждый со схожей структурой. Каждый раздел начинается с заголовка раздела, длина которого зависит от типа раздела (определяется в начале заголовка). За заголовком раздела следует RTE (заголовок). После RTE идут данные раздела (если они присутствуют). А после данных раздела начинается следующий раздел (заголовок). Похоже, что заголовок раздела больше связан с форматом Station.apx, а RTE больше связан со средой выполнения (RunTime Environment или RealTime Environment?), но это нечеткое различие.

Заголовок файла APX

Заголовок файла APX имеет длину 32 байта и начинается с текста ASCII "APX", за которым следуют некоторые метаданные. Возможно, самое важное: он определяет тип и размер используемого RTE. Тип 0x02 — это то, что я видел. Вероятно, тип 0x01 предназначен для 16-битного адресного пространства, а тип 0x02 — для 32-битного, но это далеко не точно. Есть несколько неизвестных полей, которые, вероятно, имеют некоторое значение. Пара 32-битных значений и одно 16-битное значение "повторяются" в разделе "SD" 0x0001, но их значение неизвестно. Последние 11 байт, по-видимому, всегда равны нулю. Пример ниже (в каноническом формате hexdump с метаданными):

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...............|
Скачать инструмент