C/C++: Làm quen với khái niệm WinAPI
WinAPI là gì?
WinAPI là viết tắt của "Windows API", là một bộ các giao diện lập trình ứng dụng (API) được Microsoft cung cấp để phát triển các ứng dụng chạy trên hệ điều hành Windows. Các ứng dụng Windows sử dụng WinAPI để tương tác với hệ thống máy tính, bao gồm việc tạo và quản lý cửa sổ (windows), xử lý sự kiện (events) đầu vào như nhấn phím (key) và chuột (mouse), vẽ đồ họa (3D), quản lý tệp và thư mục, và nhiều chức năng khác. Đây là một phần quan trọng của việc phát triển ứng dụng trên nền tảng Windows.
Tham khảo: tại đây.
WinAPI dùng để làm gì?
Tuy phần trên đã điểm qua điểm qua 1 vài chức năng chính của Windows API nhưng phần này mình vẫn nói lại 1 cách chi tiết hơn 😀
Cụ thể, WinAPI cung cấp các giao diện lập trình ứng dụng (API) cho việc tương tác với hệ thống máy tính và các thành phần của Windows. Dưới đây là một số công việc phổ biến mà WinAPI được sử dụng:
- Tạo và quản lý cửa sổ: WinAPI cho phép bạn tạo ra các cửa sổ ứng dụng, điều khiển kích thước, vị trí và kiểu cửa sổ, cũng như quản lý chu trình sự kiện của chúng.
- Xử lý input event: WinAPI cho phép bạn xử lý sự kiện từ bàn phím, chuột và các thiết bị khác, như các sự kiện nhấn phím, di chuyển chuột và nhấn nút chuột.
- Vẽ đồ họa và giao diện người dùng: WinAPI cung cấp các chức năng để vẽ đồ họa trên cửa sổ, bao gồm vẽ hình học, văn bản và hình ảnh. Bạn có thể sử dụng nó để tạo các giao diện người dùng đa dạng và tùy chỉnh.
- Quản lý tệp và thư mục: WinAPI cung cấp các hàm để tạo, đọc, ghi và xóa tệp tin, cũng như quản lý thư mục trên hệ thống tệp của Windows.
- Tương tác với hệ thống: WinAPI cho phép ứng dụng tương tác với các thành phần khác của hệ thống, bao gồm các dịch vụ và cấu hình hệ thống.
Sau khi đọc xong 5 ý trên thì chắc bạn cũng hiểu sương sương về Windows API làm gì rồi nhỉ :>>
Nhìn lạ đúng ko . Không lo, không lo mình sẽ hướng dẫn các bạn sử dụng WinAPI trong các mục tiếp theo ...
Ưu điểm, nhược điểm của WinAPI
Trước khi tiếp cận bất cứ thứ gì, cũng nên tìm hiểu xem ưu nhược điểm của nó là gì nhỉ. Biết khó để còn rút lui không học . Đùa thôi, mình nghĩ biết rõ được phần này thì sẽ giúp bạn sắp xếp thời gian và lựa chọn các options hợp lí trong các dự án sau này.
WinAPI, giống như bất kỳ công nghệ nào, có những ưu điểm và nhược điểm của riêng nó. Dưới đây là một số ưu điểm và nhược điểm chính của WinAPI:
Ưu điểm của WinAPI:
- Hiệu suất cao: WinAPI được tối ưu hóa để hoạt động hiệu quả trên hệ điều hành Windows, mang lại hiệu suất tốt cho các ứng dụng.
- Kiểm soát tuyệt đối: Với WinAPI, bạn có kiểm soát hoàn toàn về cách ứng dụng của bạn tương tác với hệ thống và giao diện người dùng. Điều này cho phép bạn tối ưu hóa trải nghiệm người dùng và hiệu suất của ứng dụng.
- Đa dạng chức năng: WinAPI cung cấp một loạt các chức năng để thực hiện nhiều nhiệm vụ khác nhau, từ tạo cửa sổ đến quản lý tệp và thư mục, đồ họa và nhiều hơn nữa.
- Hỗ trợ tương thích ngược: WinAPI thường hỗ trợ tương thích ngược với các phiên bản cũ hơn của Windows, giúp ứng dụng của bạn chạy trên nhiều phiên bản hệ điều hành.
Nhược điểm của WinAPI:
- Phức tạp: WinAPI có thể phức tạp và khó tiếp cận đối với những người mới bắt đầu hoặc những người không quen với lập trình hệ thống Windows.
- Thiếu tính di động: WinAPI được thiết kế đặc biệt cho hệ điều hành Windows, do đó không thể sử dụng lại mã nguồn trên các nền tảng khác như macOS hoặc Linux mà không cần sửa đổi đáng kể.
- Dễ phạm lỗi: Do tính phức tạp và sức mạnh của nó, việc sử dụng WinAPI có thể dễ dẫn đến lỗi nếu không được sử dụng một cách cẩn thận và chính xác. (Fix muốn chớt )
- Thiếu tính linh hoạt: WinAPI không cung cấp các tính năng cao cấp như một số framework và thư viện khác, do đó có thể không phù hợp cho một số dự án đòi hỏi sự linh hoạt cao.
Nhiều nhược điểm chí mạng như thiếu tính linh hoạt và thiếu tính di động. Vậy tại sao WinAPI vẫn được nhiều người lựa chọn sử dụng? Cùng mình điểm qua 1 vài lí do nhé.
-
Kiểm soát và tùy chỉnh cao: WinAPI cho phép lập trình viên kiểm soát hoàn toàn việc phát triển ứng dụng và tùy chỉnh giao diện người dùng, hiệu suất và tính năng theo ý muốn của mình.
-
Hiệu suất cao: Do WinAPI được tối ưu hóa cho hệ điều hành Windows, nó có thể cung cấp hiệu suất tốt và sử dụng tài nguyên hiệu quả cho các ứng dụng Windows.
-
Sự ổn định và tin cậy: WinAPI đã được sử dụng và thử nghiệm rộng rãi trong nhiều năm và đã được chứng minh là ổn định và tin cậy trong việc phát triển các ứng dụng Windows.
-
Hỗ trợ chi tiết: Có một lượng lớn tài liệu, tài nguyên và cộng đồng hỗ trợ sẵn có cho WinAPI, giúp lập trình viên có thể tìm kiếm giải pháp cho các vấn đề phát triển cụ thể một cách dễ dàng.
-
Tương thích ngược: WinAPI thường hỗ trợ tương thích ngược với các phiên bản cũ hơn của Windows, giúp ứng dụng của bạn chạy trên nhiều phiên bản hệ điều hành mà không cần sửa đổi đáng kể.
-
Kinh nghiệm: Một số lập trình viên có kinh nghiệm sâu rộng với WinAPI và đã quen thuộc với cách làm việc của nó, điều này khiến việc sử dụng nó trở nên thuận tiện hơn so với việc học và chuyển đổi sang các công nghệ mới.
Để học được WinAPI, cần gì?
Khi bạn đọc đến đây thì chắc là bạn cũng đang quan tâm đến nó và khá tò mò về cách sử dụng các windows api này đúng không nhỉ Không lan man, dài dòng nữa, mình sẽ điểm qua 1 vài công cụ thiết thiếu để bạn có thể cài đặt trước khi đọc tiếp các phần tiếp theo:
- Developer Powershell for VS2022, 2019, 2017,...
- VScode (Recommend) hoặc VisualStudio (phiên bản nào cũng được nha)
- C/C++ Extension Pack (Trông code đẹp hơn tí :v)
Lưu ý: Để có thể cài đặt được công cụ đầu tiên thì bạn phải tải Visual Studio (thường sẽ có sẵn bản 2017) để có thể lấy được Visual Studio Developer Tools của Microsoft.
Ngôn ngữ mình sử dụng trong bài viết này là C or C++ nhé. Ngoài ra rất nhiều ngôn ngữ khác có thể sử dụng được WinAPI, nổi bật nhất cần kể đến là C#, .NET và Python.
Oki, thì mình cũng không biết là đã đủ chưa, nếu các bạn gặp bất kì lỗi nào trong quá trình cài đặt thì có thể Comment xuống phần bên dưới để được mình giải đáp.
Kiểu dữ liệu
Ngoài các kiểu dữ liệu phổ biến như: Int, Long Int, Long Long Int, Float, Boolean, Char, Strings,... Thì khi bạn sử dụng đến WinAPI thì bạn sẽ gặp các kiểu dữ liệu vô cùng mới lạ mà mình cũng từng thấy hốt hoảng . Điểm qua 1 vài cái như: BYTE, DWORD, WCHAR, LPCSTR, LPCWSTR, .... Đấy là chỉ là số nhỏ để làm việc với chuỗi trên 1 đống kiểu dữ liệu khác nữa :v .
Bạn có thể đọc thêm tại đây.
HelloWorld với WinAPI
Ngộ không thì có 72 phép thần thông, còn với WinAPI thì có tới tận 4 phép biến hóa đoạn mã nhưng kết quả vẫn là 1 (này mình sẽ nói sau nhé). Trước tiên các bạn nên biết cách để sử dụng WinAPI đã nhỉ.
Như ảnh trên kia thì thư viện cần thiết nhất đó là Windows.h
Và đối với từng nhu cầu sử dụng thì sẽ thêm bớt các thư viện khác nhau...
Để hiện ra hộp thoại như này
Mình sẽ sử dụng hàm MessageBox. Chi tiết về chức năng:
Syntax:
int MessageBox( [in, optional] HWND hWnd, [in, optional] LPCTSTR lpText, [in, optional] LPCTSTR lpCaption, [in] UINT uType
);
Ấn vào link ở bên trên và đọc phần parameters bạn sẽ biết mình nên sử dụng giá trị gì cho từng biết. Chú ý đến biến thứ 4 (biến này sẽ quyết định hộp thoại của bạn sẽ hiển thị Icon gì và Button loại gì). Một vài giá trị phổ biến sau:
Okey thì phần còn lại sẽ là lập trình. Thay vì sử dụng printf để tương tác với console rồi in ra HelloWorld thì sẽ hiển thị hộp thoại rồi in ra HelloWorld nhé .
Đây là 1 đoạn code mẫu:
#include<Windows.h> #pragma comment(lib, "user32.lib") //required by MessageBox int main()
{ MessageBox(NULL, "Hello MAYFEST2024 :D", "_MAYFEST2024_", MB_OK|MB_ICONINFORMATION); return 0;
}
trông khá là giống C bình thường rồi nhẻ
Biên dịch nó như nào đây 🙄?. Đầu tiên bạn mở công cụ Developer Powershell for VScode lên nhé. Sau đó sử dụng câu lệnh: cl .\hello.c
hoặc cl /Zi .\hello.c
(lệnh này sẽ sinh ra file PDB - chứa các tên hàm được sử dụng để load vào các công cụ debugger)
Nếu thành công nó sẽ hiện như sau:
1 vài lỗi nhỏ trong quá trình các bạn lập trình. Ví dụ:
Do khi này đoạn code của bạn chưa được link tới các thư viện cần thiết để sử dụng hàm MessageBox như user32.lib
lúc này bạn cần sửa thêm dòng sau vào đoạn code: #pragma comment(lib, "user32.lib")
.
Một phần thú vị khác như mình đã nói ở trên là WinAPI cụ thể là hộp thoại (như bạn vừa nhìn thấy) nó có 4 hàm khác nhau thực hiện chức năng tương tự.
Kiểu thứ 2:
#include<Windows.h> #pragma comment(lib, "user32.lib") int main()
{ MessageBoxA(NULL, "Hello MAYFEST2024 :D", "_MAYFEST2024_", MB_OK|MB_ICONINFORMATION); return 0;
}
Kiểu thứ 3:
#include<Windows.h> #pragma comment(lib, "user32.lib") int main()
{ MessageBoxExA(0, "Hello MAYFEST2024 :D", "_MAYFEST2024_", MB_OK|MB_ICONINFORMATION, 0); return 0;
}
Kiểu thứ 4:
#include<Windows.h> #pragma comment(lib, "user32.lib") int main()
{ MessageBoxExW(0, L"Hello MAYFEST2024 :D", L"_MAYFEST2024_", MB_OK|MB_ICONINFORMATION, 0); return 0;
}
Tổng kết
Túm cái váy lại, thì phần trên chính là logic hoặc là trình tự để bạn có thể sử dụng được WinAPI đúng cách. Đối với WinAPI thì bạn chỉ cần seach MDSN <tên hàm>
thì sẽ ra được sổ tay của Microsoft và đọc nó thôi :v. Đọc nhiều lắm nhen mới thành thạo được.
Nếu bạn muốn trở thành 1 Reverse Engineering khét mù như idol kienmanowar
thì việc sử dụng và đọc các WinAPI là việc trời ắt tránh được tai họa này 😝. Phần này là phần tổng quan về cách sử dụng WinAPI. Phần sau khả năng mình sẽ viết về cách mình học Malware Analysis từ gà mờ đến newbie nha 🐧