Skip to content
milosursulovicPublic

About

Minimalna VNC (RFB 3.8) implementacija za Windows u čistom C-u — server hvata ekran i radi kao Windows servis, viewer je CLI alat sa GUI prikazom uživo.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

Repository files navigation

VNC (Mini)

Minimalna implementacija VNC (RFB) servera i klijenta za Windows, napisana u čistom C-u (bez spoljnih biblioteka, samo Win32 API).

  • vnc-server.exe — hvata sadržaj ekrana (GDI) i servira ga preko RFB protokola. Namenjen je da radi kao Windows servis koji se pokreće sam sa sistemom.
  • vnc-viewer.exe — konzolni alat koji se povezuje na server i prikazuje primljeni ekran u GUI prozoru, u realnom vremenu.

Podržane platforme: Windows 7 i noviji (x64).


Sadržaj


Build

Potrebno:

  • CMake 3.20+
  • MinGW-w64 (GCC) toolchain u PATH-u (testirano sa MinGW-w64 UCRT)
.\build.ps1

Skripta konfiguriše i builduje projekat (MinGW Makefiles generator) u build\ direktorijum. Rezultat:

build\vnc-server.exe
build\vnc-viewer.exe

Ručno, bez skripte:

cmake -S . -B build -G "MinGW Makefiles"
cmake --build build

vnc-server — upotreba

vnc-server.exe install [port]   instalira Windows servis (podrazumevano 5900)
vnc-server.exe uninstall        uklanja servis
vnc-server.exe start            pokreće instaliran servis
vnc-server.exe stop             zaustavlja pokrenut servis
vnc-server.exe console [port]   pokreće server u konzoli, u prednjem planu
                                 (za testiranje; Ctrl+C za izlaz)

install, uninstall, start i stop zahtevaju administratorska prava (pokrenuti konzolu preko "Run as Administrator").

Instalacija kao servis

# iz konzole pokrenute kao Administrator
.\vnc-server.exe install 5900
.\vnc-server.exe start

Servis se od tada pokreće automatski sa Windows-om (SERVICE_AUTO_START). Status i kontrolu je moguće pratiti i standardnim Windows alatima:

sc query MiniVncServer
services.msc

Deinstalacija

.\vnc-server.exe stop
.\vnc-server.exe uninstall

Log

Pošto servis nema konzolu, sve poruke se pišu u fajl:

%ProgramData%\MiniVncServer\service.log

Isti fajl se koristi i u console režimu (uz dodatan ispis na ekran).


vnc-viewer — upotreba

vnc-viewer.exe <ip> <port>

Primer:

.\vnc-viewer.exe 192.168.1.50 5900

Program se pokreće kao konzolna aplikacija — prvo u konzoli ispisuje tok RFB handshake-a, a zatim otvara GUI prozor sa uživo slikom ekrana. Prozor se osvežava u pozadinskoj niti dok je konekcija aktivna; zatvaranjem prozora (X dugme) veza se uredno prekida.

vnc-viewer je generički RFB 3.8 klijent (bez autentifikacije, Raw enkoding) — može da se poveže i na neki drugi RFB server koji ispunjava iste uslove, ne samo na vnc-server.exe iz ovog projekta.


Kako radi (arhitektura)

common/         deljeni kod (Winsock helperi, RFB konstante, logger)
server/
  main.c        parsiranje komandne linije, biranje režima rada
  service.c     integracija sa Windows Service Control Manager-om (SCM)
  listener.c    TCP accept petlja (jedan klijent u datom trenutku)
  rfb_server.c  RFB protokol - server strana (handshake + petlja poruka)
  capture.c     snimanje ekrana preko GDI-ja (BitBlt -> DIB sekcija)
viewer/
  main.c        parsiranje argumenata, orkestracija mrežne i GUI niti
  rfb_client.c  RFB protokol - klijentska strana
  window.c      Win32 prozor i iscrtavanje (StretchDIBits)
  framebuffer.c lokalni bafer piksela, sa CRITICAL_SECTION zaključavanjem

Tok jedne sesije:

  1. Viewer se poveže i odradi RFB handshake (verzija → security → init).
  2. Server pri handshake-u snimi trenutne dimenzije ekrana (GDI DIB sekcija se drži otvorena kroz celu sesiju, bez ponovne alokacije po frejmu).
  3. Viewer u petlji šalje FramebufferUpdateRequest; server na svaki zahtev snimi trenutni ekran i pošalje ga nazad kao jedan Raw pravougaonik koji pokriva ceo ekran.
  4. Viewer prima podatke u pozadinskoj niti i poziva InvalidateRect da GUI nit ponovo iscrta prozor.

Server dodatno prepoznaje i bezbedno odbacuje standardne klijent→server poruke (SetPixelFormat, SetEncodings, KeyEvent, PointerEvent, ClientCutText) — to znači da se na njega mogu povezati i drugi VNC vieveri (npr. TigerVNC), ali samo za pregled ekrana (unos sa tastature/ miša se ne prosleđuje).


Bezbednost

  • Security type je None (bez lozinke). Bilo ko ko može da dopre do porta 5900 (TCP) na mreži može da vidi ekran.
  • Nema šifrovanja saobraćaja.
  • Nema autentifikacije korisnika.

Ovo NIJE bezbedno za izlaganje internetu. Koristiti isključivo u poverljivim, izolovanim mrežama, ili iza VPN-a / SSH tunela / firewall pravila koja ograničavaju pristup portu na poznate IP adrese.


Poznata ograničenja

  • Samo Raw enkoding (nema kompresije) — svaki frejm nosi punu veličinu ekrana; osvežavanje je ograničeno na ~33 fps u vieweru radi uštede CPU-a i mreže.
  • Nema praćenja "prljavih" regiona — svaki zahtev šalje ceo ekran, čak i kad se ništa nije promenilo.
  • Nema prosleđivanja unosa (tastatura/miš) — isključivo pregled (view-only).
  • Nema autentifikacije (security type None).
  • Samo IPv4.
  • Server opslužuje jednog klijenta u datom trenutku; sledeći klijent se prihvata tek kad se prethodni otkači.

Struktura projekta

CMakeLists.txt   definicija build-a za oba izvršna fajla
build.ps1        pomoćna skripta za konfigurisanje i build
common/          deljeni kod (server + viewer)
server/          izvorni kod vnc-server.exe
viewer/          izvorni kod vnc-viewer.exe

About

Minimalna VNC (RFB 3.8) implementacija za Windows u čistom C-u — server hvata ekran i radi kao Windows servis, viewer je CLI alat sa GUI prikazom uživo.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages