# Statická inventura ovladače CFL-605RT 1.60

## Výsledek

- `MMKPLT.dll` je generátor kreslicího proudu. INF jej přiřazuje modelu CFL jako `DriverFile`, binárka načítá `CFLJJ.PCD`, obsahuje příkazové fragmenty MGL a zapisuje přes `WritePrinter`.
- `CFLJJ.PCD` je modelová konfigurace rodiny CFL. Přímo určuje model `11`, příkazovou větev `MGL-IIc`, šest per a inicializaci `IN;`.
- Přibalený `MPMSERV_1.dll` má dvě instalační role. INF jej přiřazuje CFL jako `LanguageMonitor` a samostatný `monitor.inf` jej registruje jako `PortMonitorDll`.
- Dokumentace S02 ručně volí Standard TCP/IP Port Monitor, režim RAW a port 11110. Systémový monitor vytváří TCP spojení pouze pro tuto zvolenou konfiguraci.
- Archiv neprokazuje konkrétní řetězec jedné úlohy, vazbu na zvolený port, životní cyklus spojení ani přesný epilog MGL. Tyto body zůstávají otevřené pro Task 4.

Analýza nespustila žádnou binárku Windows, neinstalovala ovladač a nekontaktovala plotr.

## Vzorek a podpis

| Vlastnost | Hodnota | Důkaz |
| --- | --- | --- |
| Zdroj | `sources/drivers/SetupCFL_160E.exe` | uzamčený archiv Tasku 1 |
| Velikost | 3 055 616 B | `wc -c` |
| SHA-256 | `78e8454208e8d9a05f25dd524f9474bad6df9021cc3b23301db0009fa02b5e44` | `shasum -a 256` |
| Formát | PE32 GUI, Intel 80386 | `file` a `objdump -p` |
| Bezpečnostní adresář PE | offset `0x2e8200`, délka `0x1e00` | `objdump -p` |
| Podepisující subjekt v PKCS#7 | `C=JP, ST=Nagano, L=Tomi, O=Mimaki Engineering CO., LTD., OU=Technology Division, CN=Mimaki Engineering CO., LTD.` | `openssl pkcs7 -print_certs` po oddělení hlavičky `WIN_CERTIFICATE` |

Příkaz `signtool verify` neověřil Authenticode. Lokální program `signtool` je nástroj NSS a přepínač `verify` nezná. Statická kontrola potvrzuje vložený PKCS#7 řetězec a subjekt Mimaki, nikoli aktuální důvěryhodnost celého řetězce.

## Instalační vrstvy

| Vrstva | Obsah | Účel a důkaz |
| --- | --- | --- |
| Vnější PE se ZIP daty | `ReadmeCGCFE.txt`, INF pro x86 a amd64, `Setup.exe` | `bsdtar -tf` vypíše šest položek včetně dvou adresářů. `bsdtar` obsah rozbalí bez spuštění PE. |
| InstallShield launcher | `Setup.exe`, 3 982 648 B, SHA-256 `f355701c993e169d83d2da5f997b634b3b02fc316e9ce6fc4f5e3779e2eb47af` | metadata PE uvádějí InstallShield 20.0.496, produkt `Mimaki CFL Series v160` a verzi 1.60 |
| Připojený InstallShield stream | devět souborů v `installshield/Disk1/` | tabulka UTF-16LE za koncem raw dat všech sekcí PE obsahuje dva CAB soubory, hlavičku CAB, instalační engine a podpůrné soubory |
| InstallShield CAB | 48 souborů v `payload/` | `unshield 1.6.2` přečte `data1.hdr`, `data1.cab` a `data2.cab`; oddělí ovladač tiskárny, monitor portu a instalační podporu |

Skript [`extract-driver-1.60.sh`](../tools/extract-driver-1.60.sh) před vytvořením cílového adresáře ověří velikost 3 055 616 B a přesný SHA-256 archivovaného instalátoru. Jiný soubor proto nepředá programům `bsdtar` ani `unshield`. Tato vazba brání tomu, aby změněný archiv předal externímu extraktoru škodlivou cestu pro průchod adresářů (`path traversal`). Skript není obecným extraktorem jiných instalátorů.

Vložený parser nejprve bez zápisu ověří DOS a PE hlavičky, rozsahy všech sekcí, počet streamů, ukončení a dekódování UTF-16LE, číselné délky, cesty, duplicity a rozsahy všech devíti payloadů. Adresář `installshield/` vytvoří až po validaci celé tabulky. Potom předá pouze identifikovaný `data1.cab` programu `unshield`.

Kompletní inventura obsahuje 61 souborů. [`driver-files.tsv`](driver-files.tsv) má pro každý soubor relativní cestu, velikost, SHA-256 a výsledek `file`. Inventura neobsahuje absolutní cestu.

## Modelová konfigurace

INF vytváří tento přímý řetězec:

```text
[CFL]
CopyFiles=@CFLJJ.PCD,MIMAKI_CF,MIMAKIMON
DataSection=CFL_DATA

[CFL_DATA]
DriverFile=MMKPLT.DLL
ConfigFile=MMK_UI.DLL
DataFile=CFLJJ.PCD
LanguageMonitor="MIMAKI Port Monitor2,MPMSERV_1.dll"
```

`CFLJJ.PCD` je v x86 a amd64 shodný soubor s SHA-256 `15e8fe9037d518f09dee5f12e928def5f3deb04da662731e58cb905ccd723d51`.

| Klíč PCD | Hodnota | Dopad |
| --- | --- | --- |
| `NickName` | `CFL` | váže konfiguraci na modelovou rodinu CFL |
| `MODEL` | `11` | volí modelovou větev sdíleného generátoru |
| `CUTTING` | `1` | zapíná řezací režim vektorového ovladače |
| `PAGEINIT` | `IN;` | potvrzuje první modelový inicializační příkaz a oddělovač `;` |
| `PENNOMAX` | `6` | potvrzuje šest logických pozic pera |
| `COMMAND MGL-IIc` | `1` | volí generátor MGL-IIc; veřejný manuál stroje upřesňuje dialekt MGL-IIc3 |

PCD neobsahuje fyzickou mapu šesti per, převod souřadnic ani serializaci profilových hodnot.

## Relevantní PE moduly

| Modul | Architektura | Velikost | SHA-256 | Protokolový význam |
| --- | --- | ---: | --- | --- |
| `payload/Printer_amd64/MMKPLT.dll` | PE32+, x86-64 | 207 872 B | `611da823f97b5f83afa94c28e8b705c61b7cce44d72ab14478a077e0c1029712` | generátor MGL a vektorový tiskový ovladač |
| `payload/Printer_x86/MMKPLT.dll` | PE32, Intel 80386 | 178 469 B | `6631893114b6c259ccf339c5ad488f97f5b14094d7918af678b849b258ffb8b2` | stejná role pro x86 |
| `payload/Printer_amd64/MMK_UI.dll` | PE32+, x86-64 | 568 832 B | `776a7c85ab85e42b7f5d36387b208d6af71240b0802e58f4129be95ca499bcd6` | UI a uložení řezných podmínek |
| `payload/Printer_x86/MMK_UI.dll` | PE32, Intel 80386 | 530 629 B | `067aa61fe194d4f6cd7410c4cd06644458eab621ae1c8f6c33a885486ce7b3ea` | stejná role pro x86 |
| `payload/PortMonitor_amd64/mpmserv_1.dll` | PE32+, x86-64 | 20 992 B | `3dde1e24123f4803ae66a6315f87fa9ec447a23dcbb0e2432d2b9b5d9038ad1d` | jazykový monitor CFL a vlastní monitor lokálního zařízení |
| `payload/PortMonitor_x86/mpmserv_1.dll` | PE32, Intel 80386 | 13 824 B | `795bb228d6ec537ead6778cff478b31fca1d30ad579f32b74acd3da7ebcc0e33` | stejná role pro x86 |

## Generátor MGL

`MMKPLT.dll` splňuje tři nezávislé podmínky identifikace:

1. `MMKCUT.INF` jej přiřazuje sekci `CFL_DATA` jako `DriverFile`.
2. Exportuje `DrvEnableDriver` a importuje GDI operace vektorové cesty včetně `PATHOBJ_bEnum` a `PATHOBJ_vEnumStart`.
3. Importuje `WritePrinter`, obsahuje text `MGL-IIc`, klíče `MODEL`, `PENNOMAX` a `PAGEINIT` a krátké příkazové řetězce.

| Offset v amd64 souboru | Fragment | Co lze uzavřít |
| ---: | --- | --- |
| `0x0b40` | `PAPU0,0;` | generátor skládá ASCII mnemoniky a číselné parametry zakončené `;` |
| `0x0d00` | `SP0NR;` | sdílený generátor obsahuje výběr pera a další mnemoniky |
| `0x0d08` | `PUSP0;` | sdílený generátor kombinuje zdvih a výběr pera |
| `0x0d14` | `!PG0;` | existuje kandidát proprietárního příkazu |
| `0x0d20` | `;PR;PU0,0;` | existují relativní režim a zdvih nástroje |
| `0x0d2c` až `0x0d44` | `PU;JP`, `PU;JR`, `;JE;`, `PU;;;;` | existují kandidáti ukončení nebo přechodu stavu |

Binárka obsluhuje více modelů. Kromě `IN;` z `CFLJJ.PCD` proto žádný uvedený fragment ještě není prokázanou sekvencí CFL. Task 4 musí najít větev `MODEL=11` a volající funkce.

## Transport

INF tiskárny registruje `MPMSERV_1.dll` jako `LanguageMonitor`. Samostatný `monitor.inf` registruje stejný modul jako `PortMonitorDll`. Modul exportuje `InitializePrintMonitor2` a importuje:

- `SetupDiGetClassDevsW`, `SetupDiEnumDeviceInterfaces` a `SetupDiGetDeviceInterfaceDetailW`;
- `CreateFileW`, `DeviceIoControl`, `WriteFile` a `GetOverlappedResult`;
- `OpenPrinterW`, `SetJobW` a `ClosePrinter`.

Modul nemá statické importy `socket`, `connect`, `send`, `recv`, `shutdown`, `closesocket` ani knihovny Winsock. Neobsahuje řetězce `11110`, `TCP`, `UDP`, `RAW` ani `SNMP`. Tento nález neprokazuje absenci dynamicky vyvolané síťové operace, handshake ani transformace proudu přes callbacky monitoru.

Pro Ethernet dokumentace Mimaki na S02 ručně vybírá Standard TCP/IP Port Monitor, režim RAW a port 11110. Microsoft na S06 potvrzuje, že právě takto zvolený systémový monitor posílá tisková data přes TCP na nastavený port. Archiv ovladače neobsahuje konfiguraci konkrétní tiskárny a neprokazuje, že každá úloha používá tento port.

`InitializePrintMonitor2` vrací tabulku callbacků monitoru a jazykový monitor může volat podřízený monitor přes ukazatele funkcí. Task 4 musí určit callbacky `StartDocPort`, `WritePort`, `ReadPort`, `EndDocPort` a `ClosePort` a jejich vazbu na zvolený port. Teprve potom může určit řetězec úlohy a případnou transformaci nebo handshake.

## Vazba na otevřené otázky

| ID | Přímý nález | Stav po Tasku 3 |
| --- | --- | --- |
| Q01 | S02 ručně volí Standard TCP/IP Port Monitor; INF současně dokládají obě role `MPMSERV_1.dll` | konkrétní řetězec jedné úlohy, zvolený port, počet spojení a okamžik zavření zůstávají neověřené |
| Q02 | `MMKPLT.dll` končí na `WritePrinter`; `MPMSERV_1.dll` nemá statické síťové importy, ale může volat podřízený monitor | první callback, handshake, transformace a první skutečný síťový bajt zůstávají neověřené |
| Q03 | CFL přímo používá `IN;`; středník je přímý oddělovač příkazů | epilog a jeho volající větev zůstávají neověřené |
| Q04 | sdílený generátor obsahuje `PU`, `PA` a `PR`; tisková cesta enumeruje `PATHOBJ` | pohyb s nástrojem dole a formát bodu zůstávají neověřené |
| Q05 | PCD volí model `11`; generátor používá GDI transformace a `MulDiv` | konstanty jednotek, osy a znaménka zůstávají neověřené |
| Q06 | PCD dovoluje šest per; sdílený generátor obsahuje `SP1` a `SP0` | fyzická mapa nástrojů CFL zůstává neověřená |
| Q07 | UI a nápověda potvrzují rychlost, tlak, offset a nulovou hodnotu s prioritou stroje | bajtový formát, jednotky a zaokrouhlení zůstávají neověřené |
| Q08 | UI obsahuje volby `Pass`, `Auto` a číslo nástroje | opakování geometrie nebo samostatný příkaz zůstávají neověřené |
| Q09 | `MPMSERV_1.dll` neimportuje `ReadFile`, ale jeho tabulka může obsahovat `ReadPort`; S02 vypíná SNMP jen pro ručně zvolený standardní port | čtecí callbacky, vazba na zvolený port, RAW odpovědi a SNMP zůstávají neověřené |
| Q10 | UI obsahuje registrační značky a mapu hledání 1 až 4 bodů na hodnoty 0 až 4 | MGL sekvence a očekávaný stav zůstávají neověřené |

Žádná otázka `Qxx` ještě nesplnila svou úplnou podmínku uzavření. Task 3 proto žádnou otázku neodstraňuje.

## Moduly vyřazené z další protokolové analýzy

- `Setup.exe`, `ISSetup.dll`, `isrt.dll`, `_isres_*.dll`, `MmkSetup.dll`, `dotnetinstaller.exe` a `ISBEW64.exe` patří instalačnímu enginu.
- `MPMUI_1.dll`, `MBrowse.dll` a `mploc*.ini` obsluhují dialog monitoru a výběr adresáře. `MBrowse.dll` exportuje pouze `ChangeFolder`.
- `MCF*.chm`, `CLocalize*.ini`, licence, tabulky řetězců a paleta popisují UI. Nápověda zpřesnila význam hodnoty nula, ale neobsahuje bajtový protokol.
- `MMK_UI.dll` zůstává pouze podpůrným zdrojem názvů a rozsahů. Nemá důkaz, že zapisuje MGL proud.

Task 4 má dále analyzovat `MMKPLT.dll`, větev modelu `11`, tabulku callbacků `MPMSERV_1.dll` a vazbu callbacků na zvolený port. Systémový Standard TCP/IP Port Monitor je relevantní pouze pro ručně zvolenou konfiguraci S02.

## Reprodukční prostředí

- `bsdtar 3.5.3`, libarchive 3.7.4;
- Python 3.14.6, pouze standardní knihovna;
- `unshield 1.6.2`;
- `file 5.41`;
- Apple LLVM `objdump` 17.0.0.

Pracovní výpisy `objdump`, ASCII řetězce, výpisy PE prostředků a rozbalená nápověda zůstávají v ignorovaném adresáři `extracted/`.
