סקירה כללית
מערכת LEVOR Remote Desktop בנויה על ארכיטקטורת Client-Server-Agent
המאפשרת שליטה מרחוק מאובטחת במחשבי Windows. המערכת מורכבת משלושה רכיבים עיקריים:
┌─────────────────────────────────────────────────────────────────────────┐
│ INTERNET / LAN │
└─────────────────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ WPF Client │ │ SignalR Server │ │ Host Agent │
│ (Viewer) │◄────►│ (Relay) │◄────►│ (Screen+Input) │
├─────────────────┤ ├─────────────────┤ ├─────────────────┤
│ • Frame Display │ │ • Hub Routing │ │ • Screen Capture│
│ • Input Capture │ │ • Auth (JWT) │ │ • Input Inject │
│ • File Browser │ │ • Sessions │ │ • File Transfer │
│ • Audio Play │ │ • Database │ │ • Audio Capture │
│ • Clipboard │ │ • Audit Logs │ │ • Clipboard │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │
│ ▼
│ ┌─────────────────┐
│ │ SQL Server │
│ │ Database │
│ ├─────────────────┤
│ │ • Users │
│ │ • Devices │
│ │ • Sessions │
│ │ • Audit Logs │
│ └─────────────────┘
│
▼
┌─────────────────┐
│ Blazor Dashboard│
│ (Admin UI) │
├─────────────────┤
│ • User Mgmt │
│ • Device Mgmt │
│ • Monitoring │
│ • Audit Logs │
└─────────────────┘
רכיבי המערכת
Server (RemoteDesktop.Server)
שרת ASP.NET Core 8 המשמש כנקודת ממסר (Relay) בין הלקוח ל-Agent.
מנהל את כל החיבורים, האימות, ה-Sessions ומסד הנתונים.
ASP.NET Core 8
SignalR
EF Core
JWT
Agent (RemoteDesktop.Agent)
תוכנת Console שרצה על המחשב המרוחק. אחראית על לכידת המסך, הזרקת קלט,
העברת קבצים, לכידת אודיו וסנכרון Clipboard.
.NET 8 Console
SharpDX
NAudio
SendInput
Client (RemoteDesktop.Client)
אפליקציית WPF המאפשרת צפייה ושליטה במחשב המרוחק.
מציגה את זרם הווידאו, מקבלת קלט מהמשתמש ומנהלת העברת קבצים.
WPF
MVVM
CommunityToolkit
Dashboard (RemoteDesktop.Dashboard)
ממשק ניהול מבוסס Blazor Server לניהול משתמשים, מכשירים,
צפייה ב-Sessions פעילים וביקורת לוגים.
Blazor Server
Bootstrap
Shared (RemoteDesktop.Shared)
ספרייה משותפת המכילה את כל המודלים, ממשקים, שירותי הצפנה וקידוד וידאו.
משמשת את כל הפרויקטים האחרים.
Models
Interfaces
Security
Video
Shared.Services (RemoteDesktop.Shared.Services) חדש!
ספריית שירותים משותפת המאפשרת שיתוף קוד בין Agent ל-Client.
כוללת את UnifiedSignalRService שמאחד את יכולות שני הצדדים.
UnifiedSignalR
Services
DRY
AgentClient (RemoteDesktop.AgentClient) חדש!
יישום WPF משולב המשלב את יכולות ה-Agent וה-Client.
מאפשר לפעול כ-Agent (לאפשר שליטה מרחוק) וכ-Client (לשלוט במחשבים אחרים) בו-זמנית.
WPF
Agent+Client
Dual-Mode
MVVM
זרימת נתונים
זרימת לכידת מסך (Screen Capture Flow)
Agent Server Client
│ │ │
│ 1. Capture Screen (DXGI/GDI+) │ │
│ 2. Encode (H.264/VP8/JPEG) │ │
│ 3. Encrypt (XChaCha20-Poly1305) │ │
│ │ │
│────── SendEncryptedFrame() ────►│ │
│ │────── ReceiveEncryptedFrame() ─►│
│ │ │
│ │ │ 4. Decrypt
│ │ │ 5. Decode
│ │ │ 6. Display
זרימת קלט (Input Flow)
Client Server Agent
│ │ │
│ 1. Capture Mouse/Keyboard │ │
│ 2. Normalize Coordinates │ │
│ 3. Encrypt │ │
│ │ │
│────── SendInput() ─────────────►│ │
│ │────── ReceiveInput() ──────────►│
│ │ │
│ │ │ 4. Decrypt
│ │ │ 5. Inject (SendInput API)
תהליך יצירת Session
1
רישום Agent
Agent מתחבר לשרת וקורא ל-RegisterAgent() עם פרטי המכונה
2
התחברות Client
Client מתחבר, מבצע Login וקורא ל-GetAvailableAgents()
3
בקשת Session
Client קורא ל-RequestSession(agentId)
4
התחלת Streaming
Server שולח ל-Agent callback StartStreaming()
5
החלפת מפתחות
מתבצעת החלפת מפתחות X25519 להצפנה מקצה לקצה
6
זרימת נתונים
Agent שולח frames מוצפנים, Client שולח input מוצפן
פרוטוקול תקשורת
SignalR Hub
כל התקשורת מתבצעת דרך SignalR WebSocket. ה-Hub מנהל:
- Agent Methods: RegisterAgent, SendFrame, SendFrameEx
- Client Methods: GetAvailableAgents, RequestSession, SendInput, EndSession
- Encryption: InitiateKeyExchange, SendEncryptedFrame
- File Transfer: RequestFileTransfer, SendFileChunk
- Audio: SendAudioFrame
- Clipboard: SendClipboardData
הגדרות SignalR
{
"SignalR": {
"MaximumParallelInvocationsPerClient": 10,
"MaximumReceiveMessageSize": 104857600, // 100 MB
"KeepAliveInterval": "00:00:15",
"ClientTimeoutInterval": "00:00:30"
}
}
מסד נתונים
המערכת משתמשת ב-Entity Framework Core 8 עם SQL Server (או In-Memory לפיתוח).
טבלאות עיקריות
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Users │ │ Devices │ │ Sessions │
├─────────────────┤ ├─────────────────┤ ├─────────────────┤
│ Id (PK) │ │ Id (PK) │ │ Id (PK) │
│ Username │◄───┐│ OwnerId (FK) │ │ ClientUserId(FK)│
│ Email │ ││ DeviceId │◄───┐│ HostDeviceId(FK)│
│ PasswordHash │ ││ Name │ ││ SessionId │
│ Role │ ││ IsOnline │ ││ Status │
│ TwoFactorEnabled│ ││ PublicKey │ ││ StartedAt │
│ CreatedAt │ │└─────────────────┘ ││ EndedAt │
└─────────────────┘ │ │└─────────────────┘
│ │ │
│ │ │
▼ │ │
┌─────────────────┐ │ │
│ RefreshTokens │ │ │
├─────────────────┤ │ │
│ Id (PK) │ │ │
│ UserId (FK) │────┘ │
│ Token │ │
│ ExpiresAt │ │
└─────────────────┘ │
│
┌─────────────────┐ │
│ AuditLogs │ │
├─────────────────┤ │
│ Id (PK) │ │
│ UserId (FK) │────────────────────────────┘
│ Action │
│ Details │
│ IpAddress │
│ Timestamp │
└─────────────────┘
Connection String
// SQL Server
"Server=localhost;Database=RemoteDesktop;Trusted_Connection=true;TrustServerCertificate=true;"
// In-Memory (Development)
services.AddDbContext<AppDbContext>(options =>
options.UseInMemoryDatabase("RemoteDesktop"));