Honderden laptops,
en geen enkele van de hogeschool.
Honderden laptops,
en geen enkele van de hogeschool.

Karel de Grote Hogeschool zocht een manier om tijdens examens de computers van studenten op te volgen. Docenten zagen niet of er verbinding werd gemaakt met een extern netwerk, of er een virtuele machine draaide, of er applicaties werden opgestart die niet mochten.
Het ging tot dan met toezicht op de zaal, en dat schaalt niet in examenzalen met honderden machines, waarvan de meeste de eigen laptop van de student zijn. KDG had iets nodig dat elke machine nakijkt voor het examen start, registreert wat er tijdens het examen gebeurt en dat samen met het examen wordt ingediend. De student ziet alles: hij logt in, de app zegt wat er moet veranderen, en op het einde dient hij het logboek zelf in. De monitoring valt onder de overeenkomst over studiegegevens die hij bij zijn inschrijving tekent.
- 3
- besturingssystemen, één codebase
- 6
- signalen bewaakt tijdens het examen
- 1
- versleutelde log, ingediend bij het werk
- 0
- mensen die hem kunnen lezen zonder de sleutel van de docent
Een desktoptool die systeemactiviteit vastlegt op Windows, macOS en Linux gaat verder dan wat Dart alleen kan. Netwerkpakketten opvangen, virtuele machines herkennen en hardware uitlezen vraagt telkens native code.
Met ons zesstappenkader bouwden we een Flutter-desktopapp in het Nederlands en het Engels die C- en C++-bibliotheken aanspreekt via dart:ffi, versleutelt wat ze registreert op de machine zelf, en docenten een CLI-tool geeft om die logs achteraf te openen.
1. IDENTIFICEREN & VALIDEREN
Samen met de IT-dienst van KDG hebben we bepaald wat examenintegriteit in de praktijk betekent. Daaruit kwamen zes dimensies: netwerkverbindingen, bluetoothstatus, aangesloten adapters, draaiende applicaties, virtuele machines en een hartslag die zegt dat de app nog leeft. Elke dimensie is afgetoetst aan echte examensituaties.
1. IDENTIFICEREN & VALIDEREN
Samen met de IT-dienst van KDG hebben we bepaald wat examenintegriteit in de praktijk betekent. Daaruit kwamen zes dimensies: netwerkverbindingen, bluetoothstatus, aangesloten adapters, draaiende applicaties, virtuele machines en een hartslag die zegt dat de app nog leeft. Elke dimensie is afgetoetst aan echte examensituaties.
2. IMPACT MAPPING
Elke mogelijkheid is gekoppeld aan een resultaat voor de examenintegriteit. Netwerkmonitoring vangt internettoegang op die niet mag. VM-detectie sluit een omgeving in een sandbox uit. Applicatiemonitoring signaleert verboden tools. De volgorde is bepaald door hoe vaak zo'n inbreuk zich echt voordoet.
3. TECHNISCHE AUDIT
We hebben nagegaan of Flutter desktop realtime systeemmonitoring aankan. Uit die audit bleek dat pakketten opvangen en VM-detectie allebei native code nodig hebben. We kozen dart:ffi met gegenereerde bindings in plaats van platform channels, omdat FFI de serialisatie-overhead vermijdt die monitoring op pakketniveau zich niet kan permitteren.
4. INTERACTIEF PROTOTYPE
We bouwden losse FFI-wrapperpakketten rond de C- en C++-bibliotheken, elk met een eigen testsuite, en hebben ze apart nagekeken op Linux, macOS en Windows voor we ze in de Flutter-app staken. Zo kwamen de platformeigen buildproblemen vroeg boven.
5. ONTWIKKELING & LANCERING
De app is een monorepo met de Flutter-UI, twee FFI-wrapperpakketten en een Dart-CLI om te ontsleutelen. Alle monitoringdata gaat versleuteld met AES-GCM naar schijf, en enkel een docent met de juiste sleutel leest ze weer uit. De student logt in met zijn examencode, loopt de checklist af die de app hem voorlegt, en start het examen zodra de machine in orde is.
6. ITEREREN & OPTIMALISEREN
Na de eerste uitrol kwam er adapterdetectie per platform bij, hebben we de hartslag verfijnd zodat pogingen om de app af te sluiten zichtbaar worden, en het versleutelde logformaat sneller doorzoekbaar gemaakt voor docenten.
Het resultaat draait op elke examenmachine, wat er ook op staat en van wie ze ook is. Het loodst de student door een check vooraf, registreert zes soorten systeemactiviteit terwijl het examen loopt, en levert één versleuteld logboek op dat alleen een docent kan openen.
Herkenbaar?
Eerst een checklist, dan zes dingen die het opvolgt
Voor het examen begint, toont de tool wat er nog fout staat en laat het de student pas starten als dat opgelost is. Tijdens het examen kijkt het vanuit zes hoeken naar het systeem, met een tijdstempel op elke gebeurtenis en versleuteling waar ze plaatsvindt.
Realtime inspectie van pakketten via een native bibliotheek: TCP, UDP en ICMP, met bron- en bestemmingsadres, poorten en protocolvlaggen. Draait in een aparte Dart-isolate zodat de interface niet blokkeert.
Herkent VMware, VirtualBox, Hyper-V en andere hypervisors via een C++-bibliotheek achter een FFI-wrapper, en geeft aan hoe zeker de detectie is en welke hypervisor het gevonden heeft.
Somt fysieke en virtuele netwerkadapters op met hun hardwaredetails, en merkt op wanneer er tijdens het examen een adapter bijkomt of wegvalt. Elk platform wordt aangepakt zoals dat platform het toelaat.
Volgt draaiende processen op en signaleert verboden applicaties. Ziet ook wanneer er tijdens de examensessie iets wordt opgestart of afgesloten.
Meldt of bluetooth aanstaat voor het examen begint, en of het er tijdens het examen weer bij komt. Dit is wat studenten het vaakst vergeten, dus de checklist noemt het met naam.
Een vast signaal dat zegt dat de app nog draait. Een gat erin is even interessant als wat er in het logboek staat, want zo ziet het eruit als iemand de tool halverwege afsluit.
Flutter desktop met C- en C++-wrappers, versleutelde opslag en een CLI om te ontsleutelen
De app zit als monorepo in elkaar. De Flutter-UI stuurt zes monitoringservices aan, elk gebouwd op dezelfde MonitoringService-basisklasse. Twee ervan, pakketopvang en VM-detectie, werken via FFI-wrapperpakketten met gegenereerde bindings. Elk logevent passeert de versleutelingslaag voor het op schijf komt.
We schreven het FFI-werk achter deze build uitgebreid uit. Lees het insight-artikel →

Gebouwd met Flutter voor Windows, macOS en Linux vanuit één codebase, in het Nederlands en het Engels. De C- en C++-code wordt per platform gecompileerd met CMake en CocoaPods.
De student logt in met zijn naam, studentennummer en examencode. de tool kijkt de machine na en zegt in gewone taal wat er moet veranderen: zet die wifi-adapter uit, schakel bluetooth uit. Staat alles goed, dan start het examen. Op het einde wijst de app één gezipt logboek aan dat de student samen met zijn werk indient. Docenten openen die met een Dart-CLI, die er per machine een tijdlijn van maakt.
Dezelfde examens op je eigen instelling draaien?
Karel de Grote Hogeschool bouwde dit voor de eigen examenzalen en staat open voor licenties aan andere instellingen. Dezelfde app, je eigen huisstijl, je eigen regels over wat er gecontroleerd wordt, aangepast en geïntegreerd door het team dat het gebouwd heeft. Vertel ons hoe jullie examens vandaag verlopen.


