42
LẬP TRÌNH TRÊN MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook Phạm Minh Tuấn [email protected]

LẬP TRÌNH TRÊN MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

  • 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

Page 1: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

***Dynamic Link Library & Hook

Phạm Minh Tuấ[email protected]

Page 2: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

04/21/23Khoa CNTT - ĐH KHTN 2

Nội dung trình bày

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

Page 3: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & 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

Page 4: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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)

Page 5: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 6: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 7: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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ớ

Page 8: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 9: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 10: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 11: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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);

Page 12: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 13: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 14: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 15: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 16: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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.

Page 17: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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);

Page 18: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

04/21/23Khoa CNTT - ĐH KHTN 18

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

Sử dụng

win32API

Page 19: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

04/21/23Khoa CNTT - ĐH KHTN 19

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

Sử dụng

win32API

Page 20: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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;

}

Page 21: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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;

}

Page 22: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 23: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 24: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 25: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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;

}

Page 26: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 27: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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);

}

Page 28: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

04/21/23Khoa CNTT - ĐH KHTN 28

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

Page 29: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

04/21/23Khoa CNTT - ĐH KHTN 29

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

Page 30: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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.

Page 31: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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;

};

Page 32: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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;

}

Page 33: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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"

Page 34: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

04/21/23Khoa CNTT - ĐH KHTN 34

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

Page 35: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

04/21/23Khoa CNTT - ĐH KHTN 35

Nội dung trình bày

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

Page 36: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & 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.

Page 37: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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 )

{ ………………………

}

Page 38: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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 đó

Page 39: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 40: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 41: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

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

Page 42: LẬP TRÌNH TRÊN  MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook

04/21/23Khoa CNTT - ĐH KHTN 42