Upload
italia
View
60
Download
2
Embed Size (px)
DESCRIPTION
LẬP TRÌNH TRÊN MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook. Phạm Minh Tuấn [email protected]. Nội dung trình bày. Thư viện liên kết động Hook. Thư viện liên kết động - DLL. Giới thiệu Xây dựng DLL Sử dụng DLL. Thư viện liên kết động - DLL. - PowerPoint PPT Presentation
Citation preview
04/21/23Khoa CNTT - ĐH KHTN 2
Nội dung trình bày
Thư viện liên kết động Hook
04/21/23Khoa CNTT - ĐH KHTN 3
Thư viện liên kết động - DLL
Giới thiệu Xây dựng DLL Sử dụng DLL
04/21/23Khoa CNTT - ĐH KHTN 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)
04/21/23Khoa CNTT - ĐH KHTN 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
04/21/23Khoa CNTT - ĐH KHTN 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)
Ưu điểm:– Dễ thực hiện
– Chương trình có thể chạy độc lập, không cần các file kèm theo
– Chương trình sẽ chạy nhanh hơn (nếu kích thước nhỏ)
Khuyết điểm:– Đoạn mã lệnh được nhúng vào file chương trình .
– Kích thước chương trình lớn, tốn bộ nhớ
– Đoạn mã lệnh được nhúng vào nhiều file chương trình khác nhau=> không tối ưu
– Khi thay đổi hàm thư viện phải biên dịch lại toàn bộ các file chương trình
04/21/23Khoa CNTT - ĐH KHTN 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ớ
04/21/23Khoa CNTT - ĐH KHTN 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)
Ưu điểm:– Kích thước của ứng dụng nhỏ
– Khi không còn sử dụng, có thể giải phóng DLL khỏi bộ nhớ
– Khi cần nâng cấp, chỉ cần thay thế file DLL, các file chương trình khác không bị ảnh hưởng
Khuyết điểm:– Khó sử dụng hơn
04/21/23Khoa CNTT - ĐH KHTN 9
Thư viện liên kết động - DLL
Giới thiệu - Định nghĩa 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
04/21/23Khoa CNTT - ĐH KHTN 10
Thư viện liên kết động - DLL
Giới thiệu Xây dựng DLL Sử dụng DLL
04/21/23Khoa CNTT - ĐH KHTN 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){
int t=b;b=a;a=t;
} Khai báo sử dụng một hàm từ DLL__declspec(dllimport) void HoanVi(int &a, int&b);
04/21/23Khoa CNTT - ĐH KHTN 12
Thư viện liên kết động - DLL
Giới thiệu Xây dựng DLL Sử dụng DLL
04/21/23Khoa CNTT - ĐH KHTN 13
Thư viện liên kết động - DLL
Sử dụ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
04/21/23Khoa CNTT - ĐH KHTN 14
Thư viện liên kết động - DLL
Sử dụng DLL Cách thức tìm kiếm file DLL
Dựa vào giá trị của HKLM\System\CurrentControlSet\Control\ Session Manager\SafeDllSearchMode
Nếu SearchMode=1– Nơi chứa chương trình ứng dụng gọi DLL– Thư mục system, system32– Thư mục Windows– Thư mục hiện hành– Các thư mục được liệt kê trong biến môi trường PATH
Nếu SearchMode=0– Nơi chứa chương trình ứng dụng gọi DLL– Thư mục hiện hành– Thư mục system, system32– Thư mục Windows– Các thư mục được liệt kê trong biến môi trường PATH
04/21/23Khoa CNTT - ĐH KHTN 15
Thư viện liên kết động - DLL
Sử dụ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
04/21/23Khoa CNTT - ĐH KHTN 16
Thư viện liên kết động - DLL
Sử dụ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.
04/21/23Khoa CNTT - ĐH KHTN 17
Thư viện liên kết động - DLL
Sử dụ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);
04/21/23Khoa CNTT - ĐH KHTN 18
Thư viện liên kết động – Ví dụ minh họa
Sử dụng
win32API
04/21/23Khoa CNTT - ĐH KHTN 19
Thư viện liên kết động – Ví dụ minh họa
Sử dụng
win32API
04/21/23Khoa CNTT - ĐH KHTN 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;
}
04/21/23Khoa CNTT - ĐH KHTN 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 )
{ switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
04/21/23Khoa CNTT - ĐH KHTN 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ố:
• hModule: handle của DLL, do Windows tạo ra
• ul_reason_for_call: lý do hàm DllMain được gọi
04/21/23Khoa CNTT - ĐH KHTN 23
Thư viện liên kết động – Ví dụ minh họa
DLL_PROCESS_ATTACH:
• Hàm DllMain với tham số DLL_PROCESS_ATTACH được gọi khi process tiến hành load DLL
• Thư viện DLL đang được Windows ánh xạ vào vùng nhớ của tiến trình (thực hiện lời gọi DLL)
• Đây là thời điểm để DLL khởi tạo các biến, cấp phát vùng nhớ hay những thao tác cần thiết khác trước khi cho phép tiến trình gọi đến các hàm của thư viện
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
• Đây là thời điểm để giải phóng các biến hay tài nguyên mà DLL đã cấp phát
04/21/23Khoa CNTT - ĐH KHTN 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ư viện DLL đang được sử dụng với tiểu trình này.
• Đây là thời điểm để giải phóng các biến dùng cho tiểu trình
04/21/23Khoa CNTT - ĐH KHTN 25
Thư viện liên kết động – Ví dụ minh họa
__declspec(dllexport) void HoanVi(int & a, int & b)
{
int t=b;
b=a;
a=t;
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
04/21/23Khoa CNTT - ĐH KHTN 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
04/21/23Khoa CNTT - ĐH KHTN 27
Thư viện liên kết động – Ví dụ minh họa
__declspec(dllimport) void HoanVi(int &a, int&b);
void CTmp2Dlg::OnButton1()
{
int a =2, b=3;
HoanVi(a,b);
CString s;
s.Format("%i %i", a, b);
MessageBox(s);
}
04/21/23Khoa CNTT - ĐH KHTN 28
XÂY DỰNG DLL DÙNG THƯ VIỆN MFC
04/21/23Khoa CNTT - ĐH KHTN 29
XÂY DỰNG DLL DÙNG THƯ VIỆN MFC
04/21/23Khoa CNTT - ĐH KHTN 30
XÂY DỰNG DLL DÙNG THƯ VIỆN MFCRegular 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.
• 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
• Chỉ có các ứng dụng MFC mới có thể dùng với loại DLL này.
04/21/23Khoa CNTT - ĐH KHTN 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:
void SetFirstName(CString s);
void ShowMessageBox();
CMyClass();
virtual ~CMyClass();
protected:
CString m_FirstName;
};
class AFX_EXT_CLASS CMyClass
{
public:
void SetFirstName(CString s);
void ShowMessageBox();
CMyClass();
virtual ~CMyClass();
protected:
CString m_FirstName;
};
04/21/23Khoa CNTT - ĐH KHTN 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)
{
m_FirstName = s;
}
CMyClass::CMyClass()
{
m_FirstName="MyFirstDLL Sample";
}
void CMyClass::ShowMessageBox()
{
AfxMessageBox(m_FirstName);
}
void CMyClass::SetFirstName(CString s)
{
m_FirstName = s;
}
04/21/23Khoa CNTT - ĐH KHTN 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"
04/21/23Khoa CNTT - ĐH KHTN 34
CÁCH THỨC GỌI DLL TRONG ỨNG DỤNG –Run-time
04/21/23Khoa CNTT - ĐH KHTN 35
Nội dung trình bày
Thư viện liên kết động Hook
04/21/23Khoa CNTT - ĐH KHTN 36
Hook
Giới thiệu
Cơ chế cho phép chặn các sự kiện trước khi chúng được gửi tới hàm xử lý sự kiện tương ứng.
04/21/23Khoa CNTT - ĐH KHTN 37
Hook
Giới thiệu Hook sẽ khiến cho hệ thống chậm hơn nên chỉ sử dụng
khi cần thiết Với mỗi loại hook hệ thống sẽ duy trì một dãy các hook
procedure tương ứng(hook chain) Hook procedure có thể giám sát, hiệu chỉnh thông điệp
hoặc ngăn cản việc chuyển thông điệp đến nơi tương ứngLRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam )
{ ………………………
}
04/21/23Khoa CNTT - ĐH KHTN 38
Hook
Giới thiệu 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 đó
04/21/23Khoa CNTT - ĐH KHTN 39
Hook
Các loại hook WH_CALLWNDPROC WH_CALLWNDPROCRET WH_CBT WH_DEBUG WH_FOREGROUNDIDLE WH_GETMESSAGE WH_JOURNALPLAYBACK WH_JOURNALRECORD WH_KEYBOARD_LL WH_KEYBOARD WH_MOUSE_LL WH_MOUSE WH_MSGFILTER WH_SYSMSGFILTER WH_SHELL
04/21/23Khoa CNTT - ĐH KHTN 40
Hook
Cài đặt Hook procedure Sử dụng hàm SetWindowsHookEx
Gỡ bỏ Hook procedure Sử dụng hàm UnhookWindowsHookEx
04/21/23Khoa CNTT - ĐH KHTN 41
Hook
Demo Keyboard Hook 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ý
nCode: HC_ACTION: wParam và lParam chứa thông tin về sự kiện
bàn phím HC_NOREMOVE: wParam và lParam chứa thông tin về sự
kiện bàn phím nhưng thông điệp vẫn còn nằm trong hàng đợi wParam: virtual-key code của phím lParam:
0-15 repeat count 16-23 scan code 24 25-28 29 30 31
extended key
ALT key
previous key state
transition state
04/21/23Khoa CNTT - ĐH KHTN 42