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

Bài giảng Lập trình trên môi trường Windows: Chương 6 - Phạm Minh Tuấn

42 11 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

Thông tin cơ bản

Định dạng
Số trang 42
Dung lượng 1,03 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng Lập trình trên môi trường Windows: Chương 6 do Phạm Minh Tuấn biên soạn bao gồm hai nội dung chính. Trong đó, phần 1 trình bày về thư viện liên kết động và phần 2 là về Hook. Mời các bạn tham khảo bài giảng để bổ sung thêm kiến thức về lĩnh vực này.

Trang 1

LẬP TRÌNH TRÊN MÔI TRƯỜNG WINDOWS

***

Dynamic Link Library & Hook

Phạm Minh Tuấn

pmtuan@fit.hcmuns.edu.vn

Trang 2

Nội dung trình bày

 Hook

Trang 3

Thư viện liên kết động - DLL

Trang 4

Thư viện liên kết động - DLL

 Giới thiệu - Liên kết (Linking) là gì?

 Liên kết là cách thức mà trình biên dịch nhúng/kết hợp các đoạn mã thực thi của những module thư viện (Lib) vào chương trình.

 Có 2 cách liên kết

 Liên kết tĩnh (Static linking)

 Liên kết động (Dynamic linking)

Trang 5

Thư viện liên kết động - DLL

 Giới thiệu - Các loại thư viện

 Thư viện liên kết tĩnh (Static linking library)

 Dạng file: LIB

 Chứa mã lệnh nhị phân của các hàm thư viện

 Dùng để nhúng vào file chương trình khi thực hiện giai đoạn liên kết (linking) của quá trình biên dịch

 Trình biên dịch sẽ copy đoạn mã lệnh của hàm thư viện vào trong những module gọi

Trang 6

Thư viện liên kết động - DLL

 Giới thiệu - Các loại thư viện

 Thư viện liên kết tĩnh (Static linking library)

Trang 7

Thư viện liên kết động - DLL

 Giới thiệu - Các loại thư viện

 Thư viện liên kết động (Dynamic linking library)

 Dạng file: LIB và DLL

 File Lib:

– Thư viện nhập (Import library).

– Không chứa mã lệnh của các hàm, chỉ chứa các thông tin cần thiết để Hệ điều hành nạp thư viện DLL và xác định các hàm export trong DLL

Sử dụng khi dùng cách thức load-time dynamic linking

 File DLL:

– Chứa mã lệnh nhị phân của các hàm thư viện – Được tải vào bộ nhớ khi ứng dụng gọi hàm thư viện – Cần có khi thực hiện ứng dụng

 Mã lệnh của các hàm sẽ không được nhúng vào trong file chương trình của ứng dụng

 Ứng dụng chỉ cần lưu thông tin của hàm thư viện, và khi cần Hệ điều hành sẽ tải các hàm thư viện vào bộ nhớ

Trang 8

Thư viện liên kết động - DLL

 Giới thiệu - Các loại thư viện

 Thư viện liên kết động (Dynamic linking library)

Trang 9

Thư viện liên kết động - DLL

 Là thư viện chứa các hàm và dữ liệu có thể được gọi từ các module khác (module có thể là 1 ứng dụng EXE hay

là một DLL khác)

 DLL được nạp vào bộ nhớ lúc run-time và được map vào vùng nhớ của tiến trình gọi

 DLL có thể chứa 2 loại hàm thư viện:

 Export: được phép gọi từ các module khác

 Internal: chỉ được dùng nội bộ trong DLL

Trang 10

Thư viện liên kết động - DLL

Xây dựng DLL

Trang 11

Thư viện liên kết động - DLL

 Xây dựng DLL

 Để export một hàm thì sử dụng khai báo

declspec(dllexport) hoặc sử dụng DEF file

 Để import một hàm thì sử dụng khai báo

declspec(dllimport)

Ví dụ

Khai báo export một hàm trong DLL

declspec(dllexport) void HoanVi(int & a, int & b){

Trang 12

Thư viện liên kết động - DLL

Sử dụng DLL

Trang 13

Thư viện liên kết động - DLL

 Cách thức tìm kiếm file DLL

 Cách thức gọi hàm của DLL trong một ứng dụng

 Load-time Dynamic Linking

 Run-time Dynamic Linking

Trang 14

Thư viện liên kết động - DLL

Trang 15

Thư viện liên kết động - DLL

 Cách thức gọi hàm của DLL trong một ứng dụng

 Load-time Dynamic Linking

– Ứng dụng cần liên kết với file thư viện nhập (Import Lib) của DLL

– Ứng dụng sẽ nạp DLL ngay từ ban đầu– Nếu không tìm ra DLL lúc nạp, ứng dụng sẽ kết thúc ngay– Cách làm:

» Add file thư viện nhập (DllName.lib) vào project

» Khai báo các hàm IMPORT từ DLL

» Gọi hàm của thư viện DLL như gọi hàm bình thường

Trang 16

Thư viện liên kết động - DLL

 Cách thức gọi hàm của DLL trong một ứng dụng

 Run-time Dynamic Linking

– Ứng dụng sẽ dùng hàm LoadLibrary hay LoadLibraryEx để nạp DLL tại thời điểm cần thiết

– Sau khi DLL được nạp, ứng dụng sẽ dùng hàm GetProcAddress để

lấy địa chỉ của hàm export trong DLL

– Ứng dụng sẽ gọi hàm export trong DLL bằng cách dùng con trỏ

hàm trả về từ hàm GetProcAddress

– Cách này không cần dùng đến file thư viện nhập (Import Lib)– Có thể xử lý lỗi không tìm thấy DLL, tránh kết thúc ứng dụng tức

thời.

Trang 17

Thư viện liên kết động - DLL

 Cách thức gọi hàm của DLL trong một ứng dụng

 Run-time Dynamic Linking

– Ví dụ typedef void (*HoanVi)(int & a, int & b)

hinstDLL = LoadLibrary(_T("hook.dll"));

proc = (HoanVi)GetProcAddress(hinstDLL, “HoanVi");

proc(a,b);

Trang 18

Thư viện liên kết động – Ví dụ minh họa

Sử dụng

win32API

Trang 19

Thư viện liên kết động – Ví dụ minh họa

Sử dụng

win32API

Trang 20

Thư viện liên kết động – Ví dụ minh họa

Phân tích hàm DllMain

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call, LPVOID lpReserved )

{

return TRUE;

}

Trang 21

Thư viện liên kết động – Ví dụ minh họa

Phân tích hàm DllMain (đầy đủ)

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )

Trang 22

Thư viện liên kết động – Ví dụ minh họa

Trong đó:

 Hàm DllMain là hàm chính của DLL

 Hàm DllMain được gọi khi DLL được load vào bộ nhớ hoặc khi Windows yêu cầu DLL kết thúc (unload khỏi bộ nhớ)

 Hàm DllMain có nhiệm vụ khởi tạo hoặc giải phóng các tài nguyên sử dụng cho DLL đó (nếu có)

 Các tham số:

Trang 23

Thư viện liên kết động – Ví dụ minh họa

DLL_PROCESS_DETACH:

• Thư viện DLL được giải phóng khỏi vùng nhớ của tiến trình do 1 trong 3 nguyên nhân: nạp DLL không thành công, tiến trình kết thúc, hay tiến trình gọi hàm FreeLibrary

Trang 24

Thư viện liên kết động – Ví dụ minh họa

DLL_THREAD_ATTACH:

• Khi tiến trình tạo mới một tiểu trình (Thread), Windows gọi hàm

DllMain của tất cả các thư viện DLL đang được sử dụng với tiến trình đó

• Đây là thời điểm để khởi tạo các biến dùng cho tiểu trình

• Lưu ý rằng tình huống này chỉ xảy ra khi tiểu trình được tạo sau khi thư viện DLL đã load vào tiến trình, nghĩa là nếu DLL được load bằng hàn LoadLibrary thì tất cả các tiểu trình hiện có (trong tiến trình) sẽ không gọi hàm DllMain với tham số này

DLL_THREAD_DETACH:

• Khi 1 tiểu trình kết thúc, Windows gọi hàm DllMain của tất cả các thư

Trang 25

Thư viện liên kết động – Ví dụ minh họa

declspec(dllexport) void HoanVi(int & a, int & b)

Trang 26

Thư viện liên kết động – Ví dụ minh họa

Sử dụng thư viện MyDLL

-Tạo một ứng dụng để sử dụng thư viện MyDLL

(ví dụ: ứng dụng MyAPP)

- Biên dịch và chạy chương trình:

Copy tập tin MyDLL.DLL vào thư mục Debug của “MyAPP”

Copy tập tin MyDLL.LIB vào thư mục MyAPP

Add tập tin MyDLL.LIB vào project MyAPP

Trang 27

Thư viện liên kết động – Ví dụ minh họa

declspec(dllimport) void HoanVi(int &a, int&b);

Trang 28

XÂY DỰNG DLL DÙNG THƯ VIỆN MFC

Trang 29

XÂY DỰNG DLL DÙNG THƯ VIỆN MFC

Trang 30

XÂY DỰNG DLL DÙNG THƯ VIỆN MFC

Regular DLL:

• Chỉ export các hàm theo dạng C-style, không thể export class, hàm thành phần của class, các hàm định nghĩa chồng (overloaded function)

• Các ứng dụng Win32 và MFC đều có thể sử dụng loại DLL

• “with MFC statically linked”: DLL sẽ được liên kết với các DLL chuẩn của MFC theo cách liên kết tĩnh

• “using shared MFC DLL”: DLL sẽ được liên kết với các DLL chuẩn của MFC theo cách liên kết động

MFC Extention DLL:

• Cho phép export các class Ứng dụng khác có thể tạo các project từ các class, hoặc xây dựng các lới kế thừa từ class này

Trang 31

XÂY DỰNG DLL DÙNG THƯ VIỆN MFC

Xây dựng thư viện MFC Extention DLL MyMFCDLL

class AFX_EXT_CLASS CMyClass

{public:

Trang 32

XÂY DỰNG DLL DÙNG THƯ VIỆN MFC

CMyClass::CMyClass(){

m_FirstName="MyFirstDLL Sample";

}void CMyClass::ShowMessageBox(){

AfxMessageBox(m_FirstName);

}void CMyClass::SetFirstName(CString s)

CMyClass::CMyClass(){

m_FirstName="MyFirstDLL Sample";

}void CMyClass::ShowMessageBox(){

AfxMessageBox(m_FirstName);

}void CMyClass::SetFirstName(CString s)

Trang 33

XÂY DỰNG DLL DÙNG THƯ VIỆN MFC

void CMyAPPDlg::OnButton1() {

CMyClass my;

my.ShowMessageBox();

}

void CMyAPPDlg::OnButton1() {

CMyClass my;

my.ShowMessageBox();

}Trong ứng dụng MyAPP:

#include " \MyMFCDLL\MyClass.h"

Trang 34

CÁCH THỨC GỌI DLL TRONG ỨNG DỤNG – Run-time

Trang 35

Nội dung trình bày

Hook

Trang 37

LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam )

{

………

}

Trang 38

 Global hook cho phép chặn thông điệp của tất cả các tiến trình

 Hook procedure phải đặt trong một DLL nào đó

 Thread-specific hook chỉ cho phép chặn thông điệp của một tiến trình cụ thể

 Nếu chương trình chặn thông điệp của chính nó thì hook procedure có thể thuộc chương trình đó

 Nếu chương trình chặn thông điệp của tiến trình khác thì hook procedure phải đặt trong một DLL nào đó

Trang 41

 Keyboard Hook procedure được gọi khi ứng dụng gọi GetMessage hay PeekMessage và có một sự kiện bàn phím để xử lý

Ngày đăng: 08/05/2021, 11:54

🧩 Sản phẩm bạn có thể quan tâm