Đồ án Tìm hiểu kỹ thuật mạng riêng ảo

MỤC LỤC

LỜI CẢM ƠN: 2

CHƯƠNG I: GIỚI THIỆU TỔNG QUAN 3

1. Mô tả hệ thống cần xây dựng 3

2. Tìm hiểu cơ chế hook trên window 3

3. Tìm hiểu lập trình mạng với C# 4

3.1. Tổng quan về C# 4

3.2. Tổng quan về .Net Framework 5

3.3. Cấu trúc của một chương trình C# 9

3.4. Lập trình mạng với C# 9

CHƯƠNG II: PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG 24

2.1 Cấu trúc chương trình 24

2.2 Phân tích và thiết kế các module chương trình 25

2.2.1 Mô tả chức năng modul kết nối và chấp nhận kết nối 25

2.2.2 Mô tả chức năng module truyền và nhận màn hình Desktop trên máy client về server 26

2.2.3 Mô tả chức năng module truyền và nhận các thồng tin điều khiển từ server. 26

2.2.4 Mô tả phân tích và thiết kế module chặn các thông điệp hệ thống 27

2.3 Phân tích và thiết kế lớp 30

2.3.1 Lớp tạo giao diện kết nối 30

2.3.2 Lớp giao diện chương trình: (InterfaceApplication) 32

2.4 Xây dựng chương trình Remote Desktop control 36

2.4.1 Xây dựng chương trình trên máy Server 36

2.4.2 Xây dựng chương trình trên máy client (chương trình phục vụ) 36

CHƯƠNG III: CHƯƠNG TRÌNH THỰC NGHIỆM 38

3.1 Một số giao diện chính. 38

3.2 KẾT LUẬN: 41

3.2.1. Kết quả đạt được 41

3.2.2. Hướng phát triển đề tài 41

Tài liệu tham khảo 42

 

 

doc41 trang | Chia sẻ: lynhelie | Lượt xem: 1306 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Đồ án Tìm hiểu kỹ thuật mạng riêng ảo, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
, int port) IPEndPoint(IPAddress address, int port) Cả hai constructors sử dụng 2 tham số: một giá trị IP, được thể hiện dưới dạng một giá trị long hoặc một đối tượng IPAddress; và một số hiệu cổng. Method Description Create Creates an EndPoint object from a SocketAddress object Equals Compares two IPEndPoint objects GetHashCode Returns a hash value for an IPEndPoint object GetType Returns the type of the IPEndPoint instance Serialize Creates a SocketAddress instance of the IPEndPoint instance ToString Creates a string representation of the IPEndPoint instance Lớp SocketAddress là một lớp đặc biệt trong phạm vi namespace System.Net. Nó thể hiện một dạng khác của một đối tượng IPEndPoint. Lớp này có thể được sử dụng để lưu trữ một thực thể IPEndPoint, để sau đó có thể tạo lại một IPEndPoint bằng phương thức Create(). Định dạng của SocketAddress là: 1 byte trình bày AddressFamily của đối tượng. 1 byte thể hiện kích thước của đối tượng. 2 bytes là số hiệu cổng của đối tượng. Những byte còn lại lưu trữ địa chỉ IP của đối tượng. Ngoài các phương thức, lớp IPEndPoint còn bao gồm 3 thuộc tính có thể đọc/ghi từ một thực thể: Address Gets or sets the IP address property AddressFamily Gets the IP address family Port Gets or sets the TCP or UDP port number Các thuộc tính trên có thể được sử dụng với một thực thể IPEndPoint để đạt được các thông tin về các thành phần riêng lẻ của đối tượng IPEndPoint. Những thuộc tính địa chỉ và cổng cũng có thể được sử dụng để thiết lập những giá trị cụ thể trong phạm vi của một đối tượng IPEndPoint đã có. MaxPort Giá trị cổng lớn nhất có thể chấp nhận được. MinPort Giá trị cổng nhỏ nhất có thể chấp nhận được. Sử dụng C# socket Namespace System.Net.Sockets bao gồm những lớp cung cấp giao diện thực tới các hàm Winsock APIs ở mức thấp. Socket Construction Hạt nhân của namespace System.Net.Sockets là lớp Socket. Nó cung cấp cho trình quản lý C# đoạn mã thực thi của Winsock API. Constructor của lớp Socket là: Socket(AddressFamily af, SocketType st,ProtocolType pt) Định dạng cơ bản của Socket constructor tương tự như Unix socket. Nó sử dụng 3 tham số để định nghĩa kiểu của socket cần tạo: AddressFamily để định nghĩa kiểu mạng. SocketType để định nghĩa kiểu dữ liệu của kết nối. ProtocolType định nghĩa giao thức mạng Mỗi tham số trên có thể được sử dụng bằng các hằng được mô tả trong bảng dưới SocketType Protocoltype Description Dgram Udp Connectionless communication Stream Tcp Connection-oriented communication Raw Icmp Internet Control Message Protocol Raw Raw Plain IP packet communication Sử dụng những giá trị hằng giúp người lập trình dễ nhớ tất cả các tùy chọn, ví dụ: Socket newsock = Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Một vài thuộc tính của lớp Socket có thể được sử dụng để lấy ra các thông tin từ một đối tượng Socket đã được tạo. Những thuộc tính đó được mô tả trong bảng dưới: Property Description AddressFamily Gets the address family of the Socket Available Gets the amount of data that is ready to be read Blocking Gets or sets whether the Socket is in blocking mode Connected Gets a value that indicates if the Socket is connected to a remote device Handle Gets the operating system handle for the Socket LocalEndPoint Gets the local EndPoint object for the Socket ProtocolType Gets the protocol type of the Socket RemoteEndPoint Gets the remote EndPoint information for the Socket SocketType Gets the type of the Socket b. Lập trình với C# Socket Helper Classes .NET Framework hỗ trợ giao diện socket thông thường dành cho những người lập trình chuyên nghiệp và nó cũng cung cấp một giao diện đơn giản hơn giúp cho việc lập trình mạng trở nên dễ dàng hơn. Những giao diện lập trình mạng mới này giúp cho việc lập trình mạng trở nên đơn giản và thuận lợi hơn rất nhiều. Có 3 lớp đối tượng được sử dụng cho việc lập trình mạng với giao diện mới này là: TcpClient TcpListener UdpClient Mỗi lớp được thiết kế để hỗ trợ một socket đặc biệt phục vụ cho một chức năng của chương trình và giao diện lập trình trở nên đơn giản hơn cho các chức năng đó. Rõ ràng, lớp TcpClient và TcpListener được sử dụng cho việc tạo các chương trình TCP client và server; lớp UdpClient được sử dụng để tạo các chương trình UDP. TcpClient Những phương thức của lớp TcpClient được sử dụng để tạo những chương trình network client theo mô hình hướng kết nối. Những phương thức của lớp TcpClient giống như trong chương trình socket thông thường, nhưng nhiều bước đã được bó lại để đơn giản hơn cho người lập trình. Để bắt đầu, có 3 bước để tạo một đối tượng TcpClient và kết nối nó tới một host ở xa, và mỗi bước đó được thiết kế để tạo ra một socket đơn giản hơn sử dụng các phương thức của lớp Socket thông thường. Constructor mặc định tạo ra một socket trên bất kỳ cổng cục bộ nào có thể. Bạn có thể sử dụng phương thức Connect() để kết nối tới một host đặc biệt ở xa: TcpClient newclient = new TcpClient(); newclient.Connect("www.isp.net", 8000); Câu lệnh đầu tạo ra một đối tượng TcpClient mới và nối kết nó tới một địa chỉ và cổng cục bộ. Câu lệnh thứ hai kết nối socket tới một địa chỉ và số hiệu cổng của một host ở xa. Chú ý rằng địa chỉ host ở xa có thể sử dụng những kiểu đặc biệt như là địa chỉ DNS. Lớp TcpClient sẽ tự động cố gắng diễn giải tên DNS sang địa chỉ IP. Một đối tượng đặc biệt EndPoint có thể được sử dụng với constructor thứ hai theo cách như sau: IPAddress ia = Dns.GetHostByName(Dns.GetHostName()).AddressList[0]; IPEndPoint iep = new IPEndPoint(ia, 10232); TcpClient newclient2 = new TcpClient(iep); newclient2.Connect("www.isp.net", 8000); Constructor thứ 3 là thông dụng nhất. Nó cho phép bạn kết nối với một host ở xa ngay trong hàm constructor và không cần gọi đến phương thức Connect(): TcpClient newclient3 = new TcpClient("www.isp.net", 8000); Với một bước đơn giản, bạn đã tạo được một đối tượng TcpClient mới với một số cổng TCP ngẫu nhiên và kết nối nó tới một host ở xa. Khi một thực thể TcpClient được tạo ra, bạn sẽ chắc chắn muốn gửi và nhận dữ liệu với nó. Phương thức GetStream() được sử dụng để tạo ra một đối tượng NetworkStream cho phép bạn gửi và nhận các byte trên socket. Khi bạn có một thực thể NetworkStream cho socket, nó là một sự tách biệt để sử dụng dòng dữ liệu chuẩn để thông qua các phương thức Read() và Write() để di chuyển dữ liệu vào và ra trên một socket: TcpClient newclient = new TcpClient("www.isp.net", 8000); NetworkStream ns = newclient.GetStream(); byte[] outbytes = Encoding.ASCII.GetBytes("Testing"); ns.Write(outbytes, 0, outbytes.Length); byte[] inbytes = new byte[1024]; ns.Read(inbytes, 0, inbytes.Length); string instring = Encoding.ASCII.GetString(inbytes); Console.WriteLine(instring); ns.Close(); newclient.Close();' TcpListener Lớp TcpClient đơn giản là một client socket dành cho chương trình Client, lớp TcpListener đơn giản là dành cho chương trình server (một server socket); Những constructors của lớp này cũng đơn giản tương tự. Có 3 constructor có khuôn dạng như sau: TcpListener(int port) : nối kết tới một cổng cục bộ TcpListener(IPEndPoint ie) : kết nối tới một EndPoint cục bộ TcpListener(IPAddress addr, int port) : kết nối tới một IPAddress và cổng cục bộ Ba khuôn dạng trên cho phép bạn tạo ra các đối tượng TcpListener. Khi một đối tượng đã được tạo, bạn có thể bắt đầu lắng nghe cho kết nối mới bằng cách sử dụng phương thức Start(). Sau phương thức Start(), bạn phải sử dụng phương thức AcceptSocket() hoặc AcceptTcpClient() để chấp nhận một yêu cầu kết nối từ Client. Hai phương thức này, như tên của chúng, sẽ cho phép thành lập kết nối và trả về một đối tượng Socket hoặc TcpClient. Chúng ta đã thấy sự thuận tiện khi sử dụng lớp TcpListener, bởi vậy hầu hết chúng ta sẽ sử dụng phương thức AcceptTcpClient() để tạo ra một đối tượng TcpClient mới cho kết nối mới. Khi một đối tượng TcpClient mới được tạo ra cho kết nối, bạn có thể tận dụng những phương thức chuẩn của TcpClient để bắt đầu giao tiếp với client. Một đoạn mã ví dụ đơn giản có thể giống như thế này: TcpListener newserver = new TcpListener(9050); newserver.Start(); TcpClient newclient = newserver.AcceptTcpClient(); NetworkStream ns = newclient.GetStream(); byte[] outbytes = Encoding.ASCII.GetBytes("Testing"); ns.Write(outbytes, 0, outbytes.Length); byte[] inbytes = new byte[1024]; ns.Read(inbytes, 0, inbytes.Length); string instring = Encoding.ASCII.GetString(inbytes); Console.WriteLine(instring); ns.Close(); newclient.Close(); newserver.Stop(); Chương trình này sẽ block tại phương thức AcceptTcpClient(), đợi cho một kết nối mới từ client. Khi kết nối được thành lập, phương thức GetStream() được sử dụng để tạo một đối tượng NetworkStream để đọc và viết dữ liệu tới socket đã được kết nối. UdpClient Đối với những ứng dụng yêu cầu một socket không hướng nối, lớp UdpClient cung cấp một giao diện đơn giản cho UDP sockets. Chúng ta đều biết rằng UDP là một giao thức không kết nối, do đó nó không giống như ứng dụng client – server, chỉ có những UDP socket đợi để truyền dữ liệu. Chúng ta không cần kết nối UDP socket tới một địa chỉ đặc biệt và chờ nhận dữ liệu. Constructor của UdpClient cũng có khuôn dạng như TcpClient, chúng cho phép ta chỉ định những thông tin cần thiết để tạo một UDP socket hoặc tham chiếu đến một cổng UDP trên một địa chỉ ở xa. Phương thức Receive() cho phép bạn nhận dữ liệu trên cổng UDP. Không có phiên kết nối nào được thành lập, bởi vậy khi một cổng UDP nhận được dữ liệu, bạn không cần biết nó từ đâu đến. Để bù lại cho điều này, phương thức Receive() bao gồm một tham số IPEndPoint chứa thông tin về địa chỉ IP của host ở xa. Đoạn mã sau minh họa điều này: UdpClient newconn = new UdpClient(8000); IPEndPoint remoteclient = new IPEndPoint(IPAddress.Any, 0); byte[] recv = newconn.Receive(ref remoteclient); string data = Encoding.ASCII.GetString(recv); ConsoleWriteLine("From: {0}", remoteclient.ToString()); ConsoleWriteLine(" Data: "{0}", data); newconn.Close(); Đối tượng UdpClient khi đã được cài đặt sử dụng một cổng UDP mà ứng dụng của bạn muốn để nhận các gói UDP. Chú ý rằng một đối tượng UdpClient trên máy ở xa khi được thiết lập sử dụng giá trị IPAddress.Any. Giá trị này được sử dụng như là một giá trị giả và sẽ được thay thế với thông tin từ phương thức Receive(). Phương thức Send() có 3 khuôn dạng. Nếu đối tượng UdpClient tham chiếu tới một host ở xa, phương thức Send() không cần chỉ định đích của dữ liệu. Tuy nhiên, Nếu đối tượng UdpClient không tham chiếu tới một host ở xa, phương thức Send() phải được chỉ định địa chỉ đích. Việc này có thể thực hiện thông qua một đối tượng IPEndPoint, hoặc một xâu hostname hoặc giá trị IP và một số hiệu cổng. Để gửi giữ liệu ta có đoạn mã sau: UdpClient newclient = new UdpClient(8001); IPEndPoint remotehost = newIPEndPoint(IPAddress.Parse("192.168.1.6"), 8001); byte[] bytes = Encoding.ASCII.GetBytes("test string"); newclient.Send(bytes, bytes.Length, remotehost); newclient.Close(); Số hiệu cổng được sử dụng trên constructor của UdpClient không nhất thiết phải giống như số hiệu cổng trên host ở xa. c. Lập trình với Thread Khi xây dựng các ứng dụng Server ta luôn muốn nó phải đáp ứng được cho nhiều Client, do đó mỗi ứng dụng Server cần có nhiều SocketClient và chúng ta sẽ phải thực hiện chúng đồng thời. Nhưng phương thức Receive() trên mỗi SocketClient sẽ rơi vào trạng thái chờ đợi khi không có dữ liệu trên kết nối mà nó quản lý và vì vậy khi một kết nối đang được xử lý không có dữ liệu các kết nối khác sẽ bị khóa. Để giải quyết vấn đề này C# cung cấp công cụ lập trình Thread. Các ứng dụng chạy trên window như thế nào? Trên hệ thống Window nhiều chương trình có thể chạy đồng thời, để làm được điều đó hệ điều hành phải biết điều chế các chương trình để chắc chắn tất cả chúng đều có sự thay đổi thời gian sử dụng CPU và truy cập bộ nhớ cũng như các thiết bị ngoại vi. Để thực hiện được điều này hệ điều hành quản lý các trương trình bằng các mã quản (handles) và coi mỗi chương trình là một tiến trình thực thi (process). Một tiến trình thể hiện một thực thể đơn của một chương trình. Nếu một bản sao chép khác của một tiến trình được chạy trong cùng một thời gian, mỗi thực thể của chương trình tạo ra một tiến trình mới. Mặc dù window thể hiện việc chạy đồng thời nhiều tiến trình, nhưng trong thực tế CPU chỉ có thể chạy một tiến trình tại một thời điểm. Mỗi tiến trình có một khoảng thời gian nhất định trong một vòng sử dụng CPU trong hệ thống. Thông tin cho mỗi tiến trình được hoán đổi trong vùng thực hiện CPU, sau khi hoán đổi ra ngoài tiến trình sẽ rơi vào trạng thái nghỉ. Đối với hệ thống nhiều CPU, nhiều tiến trình có thể cùng tồn tại; mỗi tiến trình có thể chạy trên mỗi CPU tại cùng một thời điểm, hoặc một tiến trình đơn được chỉ ra thực hiện trên nhiều CPU. Sự phân chia thời gian sử dụng CPU cho các tiến trình riêng lẻ được xác định bởi độ ưu tiên của tiến trình. Windows sử dụng hai kiểu ưu tiên cho các tiến trình: Một lớp priority định nghĩa quyền ưu tiên cơ sở cho các tiến trình. Một mức ưu tiên đặc biệt dành cho các tiến trình hệ thống. Bảng sau mô tả các mức ưu tiên của một tiến trình. Class Description Idle The process runs only when the system is idle BelowNormal The process has less than normal priority but greater than idle priority Normal The default priority class for all processes AboveNormal The process has above-normal priority but less than high priority High The process has time-critical tasks that must be run immediately RealTime Preempts all other processes, including system processes Threads. Các tiến trình tạo ra một hoặc nhiều threads. Một thread xác định một luồng đơn thực thi trong phạm vi một chương trình. Khi một chương trình thực thi trên CPU, nó thực hiện các câu lệnh chương trình trong một luồng đơn tới khi luồng hoàn thành. Một ứng dụng multithreaded phân tán các chức năng theo nhiều luồng chương trình, cho phép hai hoặc nhiều tác vụ cùng thực hiện. Mỗi một tác vụ được thực thi trên một luồng riêng. Chương trình multithreaded tạo ra các luồng của nó và có thể thực thi các luồng đó từ luồng chính của chương trình. Tất cả các luồng được tạo ra từ luồng chính bằng cách chia sẻ không gian nhớ của luồng chính. Thông thường luồng thứ hai được sử dụng để thực hiện các công việc tính toán của chương trình, cho phép luồng chính phản ứng với các sự kiện. Không có luồng thứ 2, người sử dụng không thể lựa chọn thực đơn hoặc bất kỳ nút lệnh nào khi một chương trình đang tính toán các hàm toán học. Thread là đơn vị thực thi cơ sở trên window. Mỗi tiến trình được lập lịch để chạy trên CPU bằng cách sử dụng threads. Threads có một vài trạng thái thực hiện, những trạng thái đó được định nghĩa sẵn bằng các hằng trong .Net. Các hằng đó được định nghĩa trong namespace System.Threading. Bảng sau liệt kê những trạng thái có thể có của một thread trong hệ điều hành Windows. ThreadState Description Initialized The thread has been initialized but not started. Ready The thread is waiting for a processor. Running The thread is currently using the processor. Standby The thread is about to use the processor. Terminated The thread is finished and is ready to exit. Transition The thread is waiting for a resource other than the processor. Unknown The system is unable to determine the thread state. Wait The thread is not ready to use the processor. Một thread đơn lẻ có thể phải thay đổi trạng thái tại một vài thời điểm trong quá trình chạy của nó, chuyển đổi giữa trạng thái Running và Standby, Transition, hoặc Wait. Tự bản thân hệ điều hành có thể đặt một thread đang chạy chuyển sang một trạng thái khác để thực thi một thread khác có độ ưu tiên cao hơn. Lớp .NET Framework’s ProcessThread Lớp .NET ProcessThread trong namespace System.Diagnostics cho phép bạn truy nhập các thread trong phạm vi một tiến trình từ chương trình C# của bạn. Lớp ProcessThread bao gồm nhiều thuộc tính và phương thức được sử dụng để đạt được thông tin về các thread trong một tiến trình. Bảng sau chỉ ra các thuộc tính của ProcessThread sẵn có để đạt được thông tin về luồng thực thi. Property Description BasePriority Gets the base priority of the thread Container Gets the Icontainer that contains the thread object CurrentPriority Gets the current priority of the thread Id Gets the unique thread identifier of the thread IdealProcessor Sets the preferred processor for the thread to run on PriorityBoost Enabled Gets or sets a value indicating whether the operating system should temporarily boost the priority of the thread when its main window has the focus PriorityLevel Gets or sets the priority level of the thread PrivilegedProcessor Time Gets the amount of time the thread has spent running code in the operating system core ProcessorAffinity Sets the processors that the thread can run on Site Gets or sets the ISite of the thread object StartAddress Gets the memory address of the function used to start the thread ThreadState Gets the current state of the thread TotalProcessor Time Gets the total amount of time the thread has spent using the processor UserProcessor Time Gets the amount of time the thread has spent running code in the application WaitReason Gets the reason the thread is in the Wait state CHƯƠNG II: PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG 2.1 Cấu trúc chương trình Remote Control là một chương trình ứng dụng mạng Client/Server. Một phần phục vụ (Server) sẽ được cài lên máy trạm Client nhằm đáp ứng các yêu cầu của máy chủ Server.Việc điều khiển các ứng dụng chạy trên client phụ thuộc căn bản vào phần này. Phần còn lại là một ứng dụng kiểu khách (client) nhằm giúp cho người điều khiển có thể kết nối tới phần phục vụ (Server) để ra lệnh cho nó. Cấu trúc của chương trình Server: Chương trình sẽ được cài đặt trên máy trạm, bao gồm 2 phần: Phần cài đặt: Có nhiệm vụ cài đặt bản thân chương trình server trên máy trạm, ngoài ra nó còn phải thiết lập các thông số sao cho chương trình phải được chạy được khi máy tính khởi động Phần các câu lệnh thực thi có nhiệm vụ nắng nghe yêu cầu hoặc thực hiện yêu cầu mà nó được thiết lập trước từ trong chương trình trên một cổng xác định và khi có yêu cầu nó phải thực thi yêu cầu đó. Cấu trúc chương trình Client: Chương trình này tương tự như các chương trình client khác. Người viết chương trình có thể thiết lập tất cả các mục đích riêng của mình (đã được thể hiện trong phần server). Các thành phần thực thi trong chương trình Client: - Request: kết nối tới máy trạm cần điều khiển - Receive Desktop: Nhận về màn hình Desktop của máy client - SendControl: Phương thức gửi thông tin điều khiển tới Client Server: - ListenRequest: Thiết lập cơ chế nắng nghe các yêu cầu kết nối từ phía Server - DesktopCapture: Lớp phương thức thực thi dùng để chụp màn hình Desktop trên máy client và gửi về server - SendDesktop: Phương thức gửi màn hình client về server - HookContrrol: Phương thức dùng để chặn các thông điệp hệ thống trên máy client thay vào đó là các thông điệp điều khiển và gửi về server. - ReceiveControl: Phương thức nhận về thông tin điều khiển từ server Tất cả các ứng dụng được xây dựng trên lớp WindowsApplication. Remote control gồm các phần sau: Properties, Refences, Interrences trong đó Properties, Refences do WindowsApplication định nghĩa còn Interface dùng để viết chương trình điều khiển. Các cửa sổ giao diện chương trình dựa trên ứng dụng Windows Forms. Các form được thiết kế bằng Visual Studio.Net cho phép chúng ta tạo ra những giao diện ứng dụng bằng cách kéo thả các điều khiển. Form Designer được sử dụng để thiết kế ứng dụng, trong đó phương thức InitaliazeComponet cho phép người lập trình thiết lập mã nguồn của giao diện. Lớp System.Windows.Forms.Button dùng để điều khiển button. Chúng ta có thể thao tác các sự kiện bằng cách thực thi System.EventHandler. Quá trình truyền và nhận được thực hiện thông qua việc kích chuột vào các button. 2.2 Phân tích và thiết kế các module chương trình 2.2.1 Mô tả chức năng modul kết nối và chấp nhận kết nối - Modul này có chức năng quản lý và lắng nghe các yêu cầu kết nối từ server đến client và chấp nhận kết nối từ Client tới Server chủ đồng thời tạo ra các kết nối điều khiển từ Server chủ tới Client. - Modul này cho phép ta kết nối 2 máy tính lại với nhau thông qua một cổng (Port) hoặc thông qua địa chỉ IP, Qua đó mà server có thể gửi các thông tin điều khiển cũng như là nhận về các thông tin và dữ liệu từ client. Phía Client luôn thiết lập một cơ chế nắng nghe Listenner() chờ kết nối, yêu cầu này sẽ được thực hiện ngay sau khi Server thực hiện yêu cầu kết nối tới Client thông qua phương thức Connected(). Sau khi kết nối thành công phương thức SentControl() sẽ được gọi từ phía Server dùng để gửi các comand điều khiển tới server phục vụ được thiết lập trên máy trạm, và các comand này sẽ thực thi các yêu cầu của server tại máy trạm cần điều khiển. 2.2.2 Mô tả chức năng module truyền và nhận màn hình Desktop trên máy client về server - Module này có chức năng chụp liên tục màn hình desktop trên máy client thông qua phương thức DesktopCapture() và gửi về server bằng các gọi hàm điều khiển sendingDestop().Đây là phương thức truyền màn hình Desktop client dưới dạng ảnh BMP và truyền về server với thời gian thực, cứ sau một thời gian nhất định chương trình sẽ thực hiện việc truyền hình ảnh về một cách liên tục - Đây là chức năng sử dụng kĩ thuật capturemaping với phương thức CaptureSreen() được xây dựng trên server dùng để hiển thị màn hình Desktop của máy client lên server. - Qua đó module này cho phép tất cả mọi thao tác và các thông tin điều khiển của nguời quản trị từ server sẽ được thực hiện trên server chính. 2.2.3 Mô tả chức năng module truyền và nhận các thồng tin điều khiển từ server. - Module được xây dựng với chức năng cho phép server chính thiết lập và truyền các thông tin điều khiển tới máy client thông qua phương thức SendControl() và nhận lại các thông tin điều khiển này thông qua phương thức ReceiveControl(). - Cả hai phương thức truyền và nhận thông tin điều khiển đều thực hiện theo hình thức hướng kết nối tới địa chỉ IP và số hiệu cổng Port thông qua các socket thiết lập sẵn trong chương trình 2.2.4 Mô tả phân tích và thiết kế module chặn các thông điệp hệ thống Chặn các thông điệp điều khiển trên window và thay vào đó các thông điệp điều khiển của chương trình. Để thực hiện được nhiệm vụ này hệ thống phải tự động gọi các hàm API lấy trong thư viện Uer32.dll thiết lập các sự kiện của hệ thống, đặc biệt là kĩ thuật Hook Hook là việc đưa hàm xử lý cần thực thi vào một file *.dll rồi đăng ký nó để có thể chặn được bất kỳ các sự kiện nào được thực hiện bởi chuột hay bàn phím của người dùng. Trong Window khi chúng ta thực hiện thao tác nhấp chuột, hay nhấn phím thì hệ diều hành sẽ chuyển các sự kiện này thành các thông điệp (messege) và đưa vào hàng đợi (Queue) của hệ hống, sau đó các thông điệp sẽ được trao lại cho từng ứng dụng cụ thể để xử lý. Như vậy nói cách khác Hook là một kỹ thuật cho phép một hàm có thể chặn, theo dõi, xử lý hoặc huỷ bỏ các thông điệp trước khi chúng đạt đến được một ứng dụng. Các chức năng cơ bản mà hook sử dụng ứng với từng nhóm sự kiện mà nó cần xử lý đó là: WH_KEYBOARD: Cho phép đón nhận các thông điệp từ bàn phím. WH_MOUSE: Cho phép đón nhận các sự kiện có liên quan tới con trỏ chuột. - WH_MSGFILTER và WH_SYSMSGFILTER:Cho phép theo dõi chính các thông điệp được xử lý bởi menu, srollbar, dialog Xét về mặt phạm vi hoạt động thì có hai loại Hook cơ bản đó là Hook cục bộ (local hook) và Hook toàn cục (System hook). Hook cục bộ hay còn gọi là “Thread Hook” hàm này chỉ ảnh hưởng đến thiết lập hook đó. Để tạo hàm hook này ta chỉ cần viết hàm xử lý hook trong file chương trình và gọi hàm SetWindowshookEx() trong thư viện. Hook toàn cục (System hook) chức năng hàm này ảnh hưởng đến mọi ứng dụng đang chạy trên win. Để tạo được loại hook này, hàm xử lý hook phải được nằm trong file *.dll (thư viện liên kết động). Quy trình đăng ký System hook cũng giống như quy trình đăng ký “Thread hook” và gọi hàm đăng ký SetwindowsEx() như trên. Các thuộc tính và phương thức: UserActivityHook Thuộc tính : Phương thức : - UserActivityHook() - UserActivityHook(bool InstallMouseHook, bool InstallKeyboardHook) - ~UserActivityHook() - public void Start() - public void Stop() - private int MouseHookProc(int nCode, int wParam, IntPtr lParam) - private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) - UserActivityHook() : phương thức có cùng tên với lớp là phương thức khởi tạo, hàm được tự động chạy khi đối tượng được khởi tạo (new) chồng phương thức : các phương thức có cùng tên nhưng khác biến truyền vào. Mỗi một tham số khác nhau truyền vào ct sẽ gọi phương thức tương ứng. - Hàm có dấu ~ đằng trước là hàm hủy, hàm được tự động chạy khi mỗi đối tượng kết thúc công một công việc. Ứng với mỗi loạ

Các file đính kèm theo tài liệu này:

  • docDo an tot nghiep_Kien.doc
  • docbao cao tom tat _kien.doc
  • pptbao cao_do an_kien.ppt
  • docBia do an.doc