1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Báo cáo Đồ Án viết hệ phần mềm Điều khiển máy tính từ xa bằng e mail

19 17 2
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Hệ Phần Mềm Điều Khiển Máy Tính Từ Xa Bằng E-Mail
Tác giả Nguyễn Hoàng Anh Khoa, Nguyễn Hoàng Đăng, Ngô Trần Quang Đạt, Lê Võ Xuân Hưng
Người hướng dẫn Đỗ Hoàng Cường, Huỳnh Thụy Bảo Trân
Trường học Trường Đại Học Khoa Học Tự Nhiên
Chuyên ngành Mạng máy tính
Thể loại báo cáo đồ án
Năm xuất bản 2024
Thành phố Hồ Chí Minh
Định dạng
Số trang 19
Dung lượng 169,74 KB

Nội dung

 Trước hết, socket có thể hiểu là giao diện liên kết 2 chiều giữa hai tiến trình kết nối mạng, nó giúp cho người phát triển ứng dụng có thể lựa chọn giao thức được sử dụng để truyền dữ

Trang 1

KHOA CÔNG NGHỆ THÔNG TIN

KHTN ĐHQG-HCM

K

BÁO CÁO ĐỒ ÁN VIẾT HỆ PHẦN MỀM ĐIỀU KHIỂN MÁY

TÍNH TỪ XA BẰNG E-MAIL

Bộ môn: Mạng máy tính Giảng viên lý thuyết: Đỗ Hoàng Cường Giảng viên thực hành: Huỳnh Thụy Bảo Trân

Nhóm thực hiện:

23127015– Nguyễn Hoàng Anh Khoa

23127166 – Nguyễn Hoàng Đăng 23127341-Ngô Trần Quang Đạt

23127371 – Lê Võ Xuân Hưng

Hồ Chí Minh, ngày 8 tháng 12 năm 2024

Trang 2

2 Cơ sở lý thuyết 4

2.1 Kiến trúc Client – Server 4

2.2 Socket 4

2.3 Quá trình tạo kết nối giữa client và server 5

2.4 Giao thức TCP 5

2.4.1 Khái niệm 5

2.4.2 Tại sao lại sử dụng giao thức TCP 6

2.5 Giao thức IP 6

2.6 Địa chỉ IP 6

2.7 Port 6

2.8 Giao thức SMTP 6

2.9 Giao thức IMAP 7

3 Giới thiệu về ứng dụng và các tính năng 8

3.1 Ok 8

3.2 8

3.3 8

4 Chi tiết cách phát triển ứng dụng 9

4.1 Tổ chức code 9

4.2 Socket 9

4.2.1 Hàm WSAStartup: 9

4.2.2 Hàm socket 9

4.2.3 InetPton 10

4.2.4 int WSAGetLastError() 10

4.2.5 int WSACleanup() 11

4.2.6 sockaddr_in (chi tiết thuộc tính) 11

4.3 Mail 11

4.4 Các tính năng được yêu cầu 11

4.4.1 Shutdown 11

4.4.2 List services, start/stop service 11

Trang 3

4.4.5 Screenshot 14

4.4.6 Start/stop webcam 16

4.4.7 Keylogger 17

5 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 18

5.1 Tóm Tắt 18

5.2 Những Khó Khăn Và Hạn Chế 18

5.3 Hướng Phát Triển 18

6 TÀI LIỆU THAM KHẢO 19

Trang 4

1 Thông tin nhóm

23127015 Nguyễn Hoàng Anh Khoa nhak23@clc.fitus.edu.vn

23127166 Nguyễn Hoàng Đăng nhdang232@clc.fitus.edu.vn

23127341 Ngô Trần Quang Đạt ntqdat23@clc.fitus.edu.vn

23127371 Lê Võ Xuân Hưng lvxhung23@clc.fitus.edu.vn

2 Cơ sở lý thuyết

2.1 Kiến trúc Client – Server

 Mô hình Client-Server là một kiến trúc phổ biến trong mạng máy tính, nơi một máy chủ (server) cung cấp các dịch vụ hoặc tài nguyên, và các máy khách (client) yêu cầu và sử dụng các dịch vụ đó

 Phần mềm này hoạt động theo mô hình Client-Server, với client gửi yêu cầu đến server để thực hiện các thao tác như tải lên, tải xuống, liệt kê và xóa file

2.2 Socket

 Đối với tầng vận chuyển, người phát triển ứng dụng thường chỉ có thể thiết lập các kích thước buffer, segments và lựa chọn sử dụng các dịch vụ do giao thức tầng này cung cấp chứ không thể điều khiển mọi thứ như ở tầng ứng dụng

 Đó cũng chính là lí do tại sao cần có một giao diện giữa tầng ứng dụng và tầng vận chuyển để người lập trình có thể tương tác, lựa chọn giao thức truyền dữ liệu ở tầng này Giao diện đó là socket, socket cung cấp hai giao thức chính ở tầng vận

Trang 5

chuyển là TCP và UDP Ở đồ án này, giao thức TCP sẽ được sử dụng để truyền/nhận các segments

 Trước hết, socket có thể hiểu là giao diện liên kết 2 chiều giữa hai tiến trình kết nối mạng, nó giúp cho người phát triển ứng dụng có thể lựa chọn giao thức được

sử dụng để truyền dữ liệu ở tầng vận chuyển

 Khi thực hiện truyền dữ liệu qua mạng giữa hai tiến trình, mỗi socket kết nối mạng sẽ được tạo ra ở đầu gửi và đầu nhận dữ liệu Như vậy, socket sẽ là nơi mà một thông điệp đi qua đầu tiên trước khi được đẩy vào hệ thống mạng, và cũng sẽ

là nơi đến cuối cùng trước khi gửi lên cho tiến trình bên nhận

 Mỗi socket sẽ có địa chỉ cụ thể, bao gồm địa chỉ IP và địa chỉ Port

 Socket thường được sử dụng ở kiến trúc ứng dụng khách-chủ (Client-Server) Máy chủ sẽ tạo ra một socket được gán với địa chỉ port nhất định rồi đợi socket bên máy khách yêu cầu kết nối đến nó Khi đã hình thành kết nối, quá trình truyền

dữ liệu giữa 2 bên sẽ tiến hành diễn ra cho đến khi có yêu cầu đóng kết nối

2.3 Quá trình tạo kết nối giữa client và server.

 Đầu tiên, bên server sẽ tạo ra một socket được bind với địa chỉ nhất định và được đặt ở trạng thái lắng nghe (listen())

 Trong lúc đó, một socket khác cũng được tạo ra bên client

 Thông qua hàm connect(), socket của máy khách gửi yêu cầu kết nối đến địa chỉ của socket bên máy chủ

 Khi nhận được yêu cầu kết nối từ client, máy chủ sẽ tạo ra một socket khác để chấp nhận kết nối và sẵn sàng tiếp nhận các yêu cầu được gửi từ client

 Nhờ cách kết nối này mà một lúc, có thể cùng tồn tại nhiều kết nối từ client đến cùng một server (số kết nối tối đa do hệ điều hành quy dịnh) Cứ mỗi khi được yêu cầu thiết lập một kết nối, server sẽ tạo ra thêm một socket khác để chấp nhận kết nối và sẵn sàng trao đổi dữ liệu trên kết nối đó

 Các thông điệp giao tiếp với nhau được gửi qua lại bằng cặp hàm send() và recv()

2.4 Giao thức TCP

2.4.1 Khái niệm

 Là một trong những giao thức chính của bộ giao thức TCP/IP

 Nó nằm giữa tầng ứng dụng và tầng mạng, thường được sử dụng để cung cấp dịch vụ truyền dữ liệu đáng tin cậy

Trang 6

 Là giao thức hướng kết nối để giao tiếp, nó giúp trao đổi tin nhắn giữa các thiết

bị với nhau qua mạng

2.4.2 Tại sao lại sử dụng giao thức TCP.

 TCP là giao thức truyền dữ liệu đáng tin cậy

 TCP đảm bảo rằng dữ liệu sẽ tới đúng đích với đúng thứ tự mà nó được gửi

 TCP có cơ chế điều khiển luồng: bên gửi sẽ không làm quá tải bên nhận

 TCP có cơ chế điều khiển tắt nghẽn

 TCP được sử dụng rộng rãi, và được duy trì bởi tổ chức IETF

 TCP hoạt động cùng với IP, để thiết lập kết nối giữa các thiết bị trên cùng một mạng

2.5 Giao thức IP

 Giao thức IP đóng vai trò quan trọng trong giao thức mạng máy tính, nó chịu trách nhiệm cho việc truyền gói dữ liệu từ thiết bị trong mạng này tới thiết bị trong mạng khác

 Giao thức IP cung cấp cơ chế định địa chỉ và định tuyến mà các thiết bị yêu cầu cho thông tin liên lạc của chúng

2.6 Địa chỉ IP

 Là mã định danh 32 bit được liên kết với từng interface của host hoặc router

2.7 Port

 Là địa chỉ logic của số nguyên không dấu 16 bit được phân bổ cho mọi ứng dụng trên máy tính sử dụng internet để gửi hoặc nhận dữ liệu Nó nằm trong khoảng từ

0 đến 65535

2.8 Giao thức SMTP

2.9 Giao thức IMAP

Trang 7

3 Giới thiệu về ứng dụng và các tính năng

3.1 Sơ lược về ứng dụng

3.2 Các chức năng chính của ứng dụng

Trang 8

4 Chi tiết cách phát triển ứng dụng

4.1 Tổ chức code

4.2 Socket

4.2.1 Hàm WSAStartup:

 Tham số truyền vào:

o [in]wVersionRequested: phiên bản cao nhất của Wind ws Sokets mà người gọi có thể sử dụng Byte có thứ tự cao chỉ định số phiên bản phụ, byte có thứ tự thấp chỉ định số phiên bản chính

o [out]lpWSAData: Một con trỏ tới cấu trúc dữ liệu WSADATA dùng để nhận thông tin chi tiết về việc triển khai Window Sockets

 Giá trị trả về:

o Nếu thành công, hàm WSAStartup sẽ trả về 0

o Nếu thất bại, nó sẽ trả về các giá trị:

 WSASYSNOTREADY: Hệ thống mạng con chưa sẵn sàng cho giao tiếp mạng

 WSAVERNOTSUPPORTED: Phiên bản của Windows Sockets được yêu cầu hỗ trợ không được cung cấp bởi việc cài đặt Window Sockets này

 WSAEINPROGRESS: Đang thực hiện thao tác chặn Windows Sockets 1.1

 WSAEPROCLIM: Đã tới giới hạn của số lượng công việc được hỗ trợ bởi việc cài đặt Windows Sockets

 WSAEFAULTL: tham số lpWSAData không phải là một con trỏ hợp lệ

4.2.2 Hàm socket

 Tham số truyền vào:

o [in]af: Đặc tả họ địa chỉ Các giá trị có thể có cho họ địa chỉ được xác định trong Winsock2.h

o [in]type: Loại cụ thể cho socket mới Các giá trị có thể có cho loại ổ socket được xác định trong tệp tiêu đề Winsock2.h

Trang 9

o [in]protocol: Giao thức sẽ được sử dụng Các tùy chọn có thể có cho tham

số giao thức dành riêng cho họ địa chỉ và loại socket được chỉ định Các giá trị có thể có cho giao thức được xác định trong tệp tiêu đề Winsock2.h và Wsrm.h

 Giá trị trả về:

o Nếu không xảy ra lỗi, hàm socket sẽ trả về một bộ mô tả tham chiếu tới một soket mới

o Ngược lại, nếu xảy ra lỗi, INVALID_SOCKET sẽ được trả về, và ta có thể biết được lỗi cụ thể thông qua việc gọi WSAGetLastError

4.2.3 InetPton

 Tham số truyền vào:

o [in] family: họ địa chỉ

 AF_INET: Giao thức Internet phiên bản 4(IPV4)

 AF_INET6: Giao thức Internet phiên bản 6(IPV6)

o [in]pszAddrString:

 Một con trỏ tới chuỗi kết thúc bằng NULL chứa biểu diễn văn bản của địa chỉ IP để chuyển đổi sang dạng nhị phân số

 Khi tham số Family là AF_INET thì tham số pszAddrString phải trỏ đến phần trình bày văn bản của địa chỉ IPv4 theo ký hiệu thập phân chấm tiêu chuẩn

 Khi tham số Family là AF_INET6 thì tham số pszAddrString phải trỏ đến phần trình bày văn bản của địa chỉ IPv6 theo ký hiệu chuẩn

o [out]pAddrBuf:

 Một con trỏ tới bộ đệm để lưu trữ biểu diễn nhị phân số của địa chỉ IP Địa chỉ IP được trả về theo thứ tự byte mạng

 Khi tham số Family là AF_INET, bộ đệm này phải đủ lớn để chứa cấu trúc IN_ADDR

 Khi tham số Family là AF_INET6, bộ đệm này phải đủ lớn để chứa cấu trúc IN6_ADDR

4.2.4 int WSAGetLastError()

 Hàm này trả về mã lỗi của thao tác (các hàm winsock) gần nhất trên Windows Sockets

Trang 10

Ví dụ: khi tạo một socket client thất bại thì hàm này sẽ cho biết socket được tạo

từ hàm socket() có thể không thành công

4.2.5 int WSACleanup()

 Giá trị trả về:

o Nếu thực hiện thành công, trả về 0

o Nếu thực hiện không thành công, trả về SOCKET_ERROR vàWSAGetLastError() có thể được dùng dể lấy mã lỗi ngay sau đó

 Trong môi trường đa luồng, khi WSACleanup() được gọi, nó sẽ chấm dứt mọi hoạt động của các Window Sockets trong tất cả các luồng

 Vì vậy, sau khi đã hoàn thành các hoạt động cần thiết trên kết nối sockets hoặc khi thực hiện thất bại một thao tác nào đó, chúng ta cần gọi WSACleanup() để giải phóng, dọn dẹp các tài nguyên đã được cấp

4.2.6 sockaddr_in (chi tiết thuộc tính).

4.3 Mail

4.4 Các tính năng được yêu cầu

4.4.1 Shutdown

 Mục đích: Hệ thống phải cho phép tắt máy tính từ xa

 Cách hoạt động:

o Sử dụng lệnh hệ thống, ví dụ: system("shutdown /s /t 0") cho Windows

o Đóng gói lệnh này vào một hàm, và kích hoạt nó dựa trên lệnh được gửi qua email

4.4.2 List services, start/stop service.

a List Servies(void listServices())

 Mô tả: Hàm này liệt kê tất cả các dịch vụ đang chạy trên hệ

thống và lưu kết quả vào tệp services.txt

 Cách hoạt động:

o Hàm gọi lệnh net start, lệnh này hiển thị danh sách các dịch vụ đang chạy trong Windows

Trang 11

o Kết quả đầu ra của lệnh này được chuyển hướng (>) vào tệp services.txt bằng cách sử dụng system()

b start Service(bool startService(serviceName))

 Mô tả: Hàm này bắt đầu một dịch vụ có tên được chỉ định.

 Cách hoạt động:

o Hàm nhận một chuỗi tên dịch vụ (serviceName) làm tham số

o Sử dụng lệnh net start <serviceName> để khởi động dịch vụ

o system(command.c_str()) thực thi lệnh này và trả về mã thoát (exit code) Nếu lệnh thành công, mã thoát sẽ là 0. 

o  

4.4.3 List/open/close applications:

a List applications:

 Để lấy được danh sách các applications hiện tại, các thư viện của Windows API sẽ được sử dụng như ”psapi.h”

ĐỐI VỚI SERVER

o Thông qua một hàm enum dùng để liệt kê các tiến trình (process) đang hiển thị trên máy

o BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

o Hàm trả về kiểu BOOL CALLBACK

> Một số hàm trong Windows API yêu cần cần gọi stdcall (định nghĩa của CALLBACK trong Windows API) để đảm bảo cơ chế gọi hàm của nó, đồng thời các hàm được gọi sẽ chịu trách nhiệm làm sạch stack sau khi nó kết thúc

-> để tránh gặp lỗi stack

o Công dụng của hàm được viết này là kiểm tra bất cứ tiến trình nào nó tìm thấy xem có đang hiển thị không (Thông qua hàm IsWindowVisible()), nếu

Trang 12

hiển thị thì sẽ tiến hành lấy tiêu đề bằng hàm GetWindowText(), và có một hàm làm sạch được viết thêm để đảm bảo tiêu đề lấy được chỉ chứa các kí tự ASCII Việc này nhằm để thuận lợi cho chức năng biểu diễn thông tin

o Bên cạnh lấy tên tiêu đề, địa chỉ của một tiến trình đang chạy cũng phải được lưu lại, hay PID, địa chỉ này được lấy thông qua hàm GetWindowThreadProcessId() trong Windows API

o PID sẽ là địa chỉ chủ yếu để lấy thêm thông tin của các tiến trình như tên file thực thi, nên nó vô cùng quan trọng

o Hàm trả về TRUE thì sẽ tiếp tục được gọi để tìm các tiến trình thỏa yêu cầu khác

o Sau đó, để lấy danh sách các tiến trình đang hiển thị, chỉ việc gọi hàm bên trên và lưu kết quả vào một vector Đến đây, chúng ta đã có thể chuyển vector này qua mạng để đến bên nhận là client

o Tuy nhiên cấu trúc được chuyển không phải là vector mà là map Map được

sử dụng nhằm xử lí vấn đề trùng PID nhiều cửa sổ của một ứng dụng chạy

đa tiến trình (ví dụ các tab được mở ở chrome khi chia ra thành nhiều cửa

sổ, sẽ có cùng PID) Do tính chất của ánh xạ, nên map chỉ giữ lại 1 giá trị PID duy nhất và sẽ có tên tương ứng là chrome.exe)

o Việc gửi map qua mạng chỉ đơn giản là sử dụng lại hàm send của thư viện winsock2, chia nhỏ map để gửi đi, đầu tiên gửi size của nó, sau đó gửi thông tin của từng phần tử trong đó Tất nhiên dữ liệu truyền vào send() phải được ép kiểu về char*

o Tuy nhiên tên lấy được từ hàm GetWindowText() đã được làm sạch nên luôn để lại nhiều rủi ro, nó chỉ cho biết thông tin (thậm chí còn làm mất kí

tự của một vài ứng dụng có tên đặc biệt) và thường không thể dùng tên đó

để truy cập bất cứ thứ gì Vì vậy bên cạnh PID và Tên ứng dụng thì tên của file thực thi ứng dụng đó cũng sẽ được gửi đi, các tên này cho biết một ứng dụng cụ thể hơn và có thể dùng để mở hoặc đóng một ứng dụng nào đó bên server

o Để lấy được tên thực thi từ PID thì có nhiều cách, chúng tôi chọn đọc thông tin của PID đó từ cửa sổ cmd Đầu tiên, cần phải tạo pipe (để đọc thông tin

từ 1 tiến trình, ở đây là cmd, và hỗ trợ cho input của tiến trình khác, ở đây là server) Sau đó gọi hàm createProcess() để mở CMD và tìm thông tin về

Trang 13

PID được yêu cầu theo cú pháp quy định Lượng thông tin được CMD cung cấp sẽ được lưu lại vào pipe

o Sau khi dữ liệu đã được lưu trong pipe, dữ liệu này sẽ tiếp tục được ghi vào trong một chuỗi result, và khi xong việc, đảm bảo các handle được tạo đã được đóng đầy đủ Việc còn lại chỉ là xử lí chuỗi result để tìm ra tên file thực thi và trả về kết quả

o Pipe?: https://www.geeksforgeeks.org/pipe-system-call/

ĐỐI VỚI CLIENT:

o Bên client sẽ gửi yêu cầu để server xử lí ra một danh sách các tiến trình đang hiển thị

o Vì dữ liểu được gửi từ server không chỉ là vector mà còn có map, nên cũng cần viết thêm các hàm nhận dữ liệu vector, map qua mạng

o Các hàm này thì ngược lại với hàm gửi, sử dụng lại hàm recv của thư viện winsock2 và nhận dữ liệu theo thứ tự được gửi, đầu tiên là size, sau đó là nội dung

o Sau khi đã có các danh sách được gửi từ server thì client sẽ lưu lại và sử dụng các danh sách này theo các mục đích riêng

 Để thực hiệu yêu cầu mở một app nào đó từ client, thì client cần gửi tên dạng thực thi (.exe) và server sẽ dùng hàm trong thư viện windows.h: ShellExecute() để mở ứng dụng theo tên đã gửi

c Close applications:

 Để thực hiện đóng một ứng dụng theo tên thực thi, thì bên server sử dụng PID được tìm thấy của tên này, thông qua hàm OpenProcess() để lấy HANDLE và thực hiện đóng tiến trình bằng TerminateProcess()

 Việc tìm được một PID từ tên thực thi có vẻ dễ dàng hơn là chiều ngược lại bằng các hàm có sẵn trong thư viện “tlhelp32.h”, một thư viện được gọi gián tiếp qua windows.h, và nó cung cấp cho chúng ta khả năng quản lí thông tin các tiến trình đang chạy trên máy

4.4.4 Get/delete file

Ngày đăng: 19/12/2024, 14:41

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w