Torna agli aggiornamenti
UpdatedAug 20, 2026

ft9201-libfprint — Updated!

Driver Linux libfprint per il lettore di impronte digitali USB Focal-systems FT9201 (2808:93a9) — esegue il motore di corrispondenza Windows di FocalTech nativamente su Linux, senza Wine. Include un metodo per portare altri lettori solo Windows Hello.

Condividi

ft9201-libfprint

Supporto per impronte digitali su Linux per il lettore USB Focal-systems FT9201 (2808:93a9, venduto come dongle standalone per Windows Hello), come driver libfprint.

Lettore di impronte digitali USB Focal-systems FT9201

Il sensore è un minuscolo lettore ottico 96×96. Il matcher integrato di libfprint lavora male su un'immagine così piccola, quindi questo driver riutilizza invece il motore di riconoscimento di FocalTech — il ftWbioEngineAdapter.dll del loro driver Windows firmato — eseguendolo nativamente su Linux con un piccolo caricatore PE in-process. Niente Wine, niente Windows, niente cloud.

Questa repo è anche un metodo riutilizzabile, non solo un driver. La tecnica — eseguire il motore di riconoscimento Windows di un vendor nativamente su Linux, senza Wine — si generalizza ad altri lettori "solo Windows Hello", inclusi quelli che forniscono un canale sicuro SDCP (i sensori crittografici classe Synaptics/Goodix/ELAN/EgisTec), tramite il modulo opzionale src/crypto_shims.c. Il FT9201 è l'esempio pratico; il caricatore in-process, il bridge WinBio e il livello di bypass crittografico sono trasferibili al prossimo dispositivo. Vedi PORTING.md per il metodo passo-passo e cosa riutilizzare così com'è.

Stato

Funzionante end-to-end su hardware reale: enroll e verify tramite fprintd / strumenti da riga di comando, e in KDE/GNOME dopo l'installazione. Riconosce il dito usando il vero algoritmo del vendor.

Sviluppato e testato con questo esatto lettore (ASIN B0DK7LQZGH) — la variante FT9348W del 2808:93a9.

Avvertenze:

  • Testato solo su quella variante FT9348W del dispositivo 2808:93a9.
  • Il matcher è un blob proprietario che chiamiamo; non possiamo correggere bug al suo interno.
  • Solo x86-64 (la DLL e il caricatore sono a 64 bit).

Come funziona (versione breve)

  • La sequenza di init USB + avvio firmware è stata reverse-engineered dai driver stessi di FocalTech; il firmware MCU 8051 viene caricato, poi una specifica sequenza di configurazione registri lo avvia.
  • Ogni acquisizione (96×96) viene ritagliata al centro a 64×80, come richiesto dal motore.
  • ft_engine.c è un caricatore di ~450 righe che mappa ftWbioEngineAdapter.dll in memoria, fornisce le ~90 funzioni kernel32 che importa, imposta un falso TEB Windows, e chiama l'interfaccia WinBio del motore per enroll/verify.
  • Il caricatore mappa il codice come read-execute e i dati come read-write da un file in memoria, quindi nessuna pagina è mai scrivibile ed eseguibile. Ciò significa che funziona sotto l'hardening predefinito MemoryDenyWriteExecute di fprintd — non devi disabilitare alcuna impostazione di sicurezza.

Vedi docs/how-it-works.md per la documentazione tecnica completa.

Requisiti

Strumenti di build + dipendenze di build di libfprint. Su Fedora/Nobara:

sudo dnf install git meson ninja-build gcc cabextract python3 \
     glib2-devel gusb-devel nss-devel pixman-devel gobject-introspection-devel \
     libgudev-devel systemd-devel

(Debian/Ubuntu: gli equivalenti — libglib2.0-dev libgusb-dev libnss3-dev libpixman-1-dev libgudev-1.0-dev libsystemd-dev, più cabextract.)

Build e installazione

git clone https://github.com/OMGrant/ft9201-libfprint
cd ft9201-libfprint
scripts/fetch-blobs.sh     # scarica la DLL del vendor + firmware MCU (vedi nota sotto)
scripts/build.sh           # clona libfprint fissato, innesta il driver, compila

Prova senza installare nulla:

FT9201_ENGINE_DLL=$PWD/blobs/ftWbioEngineAdapter.dll \
LD_LIBRARY_PATH=libfprint/build/libfprint \
libfprint/build/examples/enroll

Installalo per KDE/GNOME/login (affiancato; il libfprint della tua distribuzione viene lasciato intatto, nessun hardening disabilitato):

sudo scripts/install.sh
fprintd-enroll

Annulla tutto: sudo scripts/install.sh --uninstall.

I blob proprietari

Questa repo non contiene binari proprietari. Due file sono di FocalTech e vengono recuperati da fonti pubbliche esistenti al momento della build da scripts/fetch-blobs.sh:

FileCosa èDa dove proviene
ftWbioEngineAdapter.dllil motore di riconoscimentoDriver Windows firmato di FocalTech dal Microsoft Update Catalog
Firmware MCU FT9348W (src/ft9201_fw.h)Firmware 8051 eseguito dal sensoreestratto (simbolo FOCALFP_9348_FW_APP) dal blob pubblico ft9201-static

Recupero manuale dei blob

Se uno degli URL di download è cambiato, ti servono solo questi due file:

  • ftWbioEngineAdapter.dll — cerca nel Microsoft Update Catalog "FocalTech Electronics Biometric" (driver 1.0.3.58, corrisponde all'hardware ID USB\VID_2808&PID_93A9). Scarica il .cab, estrai con cabextract, e metti ftWbioEngineAdapter.dll in blobs/.
  • Firmware MCU — ottieni una copia del blob Linux libfprint di FocalTech che contiene il simbolo FOCALFP_9348_FW_APP (ad es. da ft9201-static) ed esegui python3 scripts/extract-firmware.py <quel-libfprint-2.so> src/ft9201_fw.h.

Poi esegui di nuovo scripts/build.sh.

Crediti

Il metodo riutilizzabile e il percorso per sensori crittografici si basano inoltre sul lavoro di:

  • uunicorn — il cui synaWudfBioUsb-sandbox e fork di wine sono l'infrastruttura per tracciare un driver biometrico Windows di un vendor sotto Wine, che è come si recupera il protocollo di comando di un sensore crittografico senza una macchina Windows.
  • Marco Trevisan (3v1n0), un manutentore di libfprint — che ha indicato la strada a quell'approccio di tracciamento con Wine, e la cui spinta a migliorare il matcher principale di libfprint a monte spiega perché esista la via del matcher del vendor.
  • championswimmer/libfprint-eh577 — lavoro precedente per la famiglia di sensori EgisTec EH577.

Altri modi per eseguire un FT9201 su Linux

Non è l'unico approccio — le alternative differiscono principalmente in come riutilizzano il matcher di FocalTech (lo fanno tutte; il minuscolo sensore esclude il matching generico).

Categorie