Trao đổi với tôi

http://www.buidao.com

7/7/09

[Rootkit] Lập trình driver trên Windows - Cài đặt bộ công cụ lập trình

Link gốc: http://www.arm.vn/index.php?option=com_content&task=view&id=38&Itemid=1


Microsoft với các bộ công cụ lập trình nổi tiếng như: Visual Studio .NET (phiên bản mới nhất là 2008), cũ hơn thì có Visual Studio 6 đã mang lại cuộc cách mạng thật sự cho các ứng dụng chạy trên nền desktop. Các bộ công cụ này tích hợp nhiều loại ngôn ngữ: Visual Basic, C, C++ và sau này các dòng ngôn ngữ dựa trên công nghệ .NET như: C#, Visual Basic .NET,… cùng với phương pháp kéo thả (drag-drop) giao diện đã hỗ trợ tối đa cho lập trình viên trong việc tạo ra các ứng dụng nhanh chóng, đảm bảo tính ổn định và đáp ứng đầy đủ nhu cầu người dùng.

Ở bài viết này chúng tôi sẽ đề cập đến một khía cạnh khác của lập trình: viết driver cho Windows. Viết driver cho Windows là lĩnh vực khá mới ở nước ta, chưa được phổ biến. Cũng như các ứng dụng desktop, Microsoft cũng đã hỗ trợ rất nhiều trong việc tạo và triển khai driver. Đó chính là WDF (Windows Driver Foundation) mà tiền thân của nó là WDM (Windows Driver Model), bộ công cụ hỗ trợ lập trình, triển khai, bảo trì và nâng cấp driver. Do hạn chế về kiến thức cũng như thời gian, toàn bộ bài viết này sẽ tập trung vào bộ WDF, cách tạo và triển khai một driver thực sự trên Windows XP.



Driver là một chương trình đặc biệt, đóng vai trò trung gian giữa chương trình ứng dụng và thiết bị.

Khái quát vài đặc điểm kỹ thuật của driver:

- Là chương trình chạy nền, tách biệt với ứng dụng, có thể được gọi bởi nhiều chương trình khác nhau, trong lập trình hay gọi là re-entrant.

- Tồn tại cùng với sự hiện diện của thiết bị, khi thiết bị được gắn vào máy, driver được hệ điều hành đưa vào sử dụng, khi thiết bị được tháo ra, driver cũng được giải phóng.

- Giao tiếp thông qua các lệnh I/O với các chương trình bên ngoài.

- Không có giao diện GUI, các ứng dụng muốn truy cập phải thông qua các lệnh điều khiển I/O.

- Sử dụng không gian địa chỉ khác với không gian địa chỉ của ứng dụng gọi đến driver.

Nói nôm na do driver là chương trình đặc biệt được quản lý bởi Windows, nên tài nguyên cùng cách hoạt động của nó sẽ khác với các ứng dụng desktop thông thường. Vì vậy khi viết driver, điều quan trọng là phải đảm bảo tính ổn định: mã an toàn, khả năng chịu lỗi, quản lý tài nguyên, đồng thời đảm bảo khả năng tương tác với các thành phần điều khiển khác của Windows, nếu không driver có tác hại tương tự như một chương trình virus.

Bộ công cụ lập trình driver WDF

Đây là mô hình lập trình driver mới nhất của Microsoft, các kiến thức cơ bản về WDF có thể tham khảo ở đây. Cài đặt WDF rất đơn giản, đây là bộ công cụ miễn phí hỗ trợ lập trình của Microsoft, nên sau khi đăng ký là có thể tải về để cài đặt.

Để hỗ trợ việc viết driver, trong thư mục “src” ở thư mục cài đăt của WDF có cung cấp sẵn các ví dụ lập trình driver mẫu. Điểm qua một vài mô hình driver ta có thể thấy:

Driver hoạt động ở user mode: umdf

Driver hoạt động ở kernel mode: kmdf

Các driver hoạt động ở kernel mode bao gồm: serial driver, usb sample driver, fake modem driver… Các bạn có thể tự tìm hiểu thêm về các mô hình driver khác, ở đây chúng tôi giới thiệu driver điển hình: fake modem driver, cách tạo driver và cách cài đặt fake modem vào hệ thống.

Xây dựng fake modem driver

Chương trình biên dịch

Mở Start Program, vào Microsoft Driver Kit chọn Build Environments: WDF cho phép biên dịch driver trên nhiều môi trường Windows, ở đây chúng ta chọn môi trường Windows XP. Có 2 dạng biên dịch: Free và Check build. Sự khác nhau giữa 2 dạng này có thể khái quát là: Free build dùng cho các bản Windows thương mại chúng ta vẫn hay dùng, Check build dùng cho các bản Windows riêng cho phát triển driver, phiên bản này có lẽ chúng ta ít được tiếp cận hơn. Đặc điểm của Check build cho phép chúng ta theo dõi, kiểm tra lỗi lập trình tốt hơn. Vì sử dụng Windows XP thương mại nên chúng ta sử dụng dạng biên dịch Free. Lưu ý là dạng biên dịch này chạy console (dòng lệnh), tương tự như lệnh cmd của hệ điều hành.


Biên dịch fake modem

Di chuyển vào thư mục chứa chương trình của fake modem: src\kmdf\fakemodem.

Cấu trúc các file trong thự mục chương trình:

+ makefile: hướng dẫn biên dịch, file này bắt buộc có. sources: chứa các file chương trình, file này là bắt buộc.

+ mdmfake.inx: file này sẽ tạo ra file mdmfake.inf, là file hướng dẫn cài đặt fakemodem driver vào máy.

+ Các file chương trình: (phần này sẽ được trình bày kỹ ở các bài viết sau)

- Driver.c: file chính để cài đặt driver vào hệ thống.

- <!--[endif]-->Ioctl.c: xử lý các yêu cầu thuộc về điều khiển I/O.

- <!--[endif]-->Readwrite.c: xử lý các yêu cầu đọc ghi dữ liệu.

- Fakemodem.h: file chứa các khai báo.<!--[if !supportLists]-->

<!--[if !supportLists]-->

Thực thi lệnh nmake, lệnh này tạo ra thư mục objfre_wxp_x86, trong thư mục này có thư mục i386 sẽ chứa driver (fakemodem.sys) và file hướng dẫn cài đặt (mdmfake.inf).


Cài đặt fake modem vào hệ thống.

Vào Control Panel, chọn mục Add Hardware.





Hệ thống sẽ tìm xem có phải có thiết bị phần cứng thật sự đã gắn vào máy hay không.




Vì là modem ảo, nên ta buộc Windows thêm driver vào







Chọn đường dẫn chứa file fakemodem.sys và mdmfake.inf.




Mở file mdmfake.inf, lưu ý là trong file dạng inf, comment được xác định bằng dấu ‘;’. Xem xét các lệnh sau:

[FakeModm_Service_Inst]

DisplayName = %ModemX%

[String]

ModemX = "FakeModem DDK Sample controllerless driver"

Các câu lệnh trên qui định tên của driver thể hiện như hình dưới










Sau khi chọn cài đặt mới driver, file fakemodem.sys sẽ được chép vào: C:\Windows\system32\drivers

[CopyFileSection]

fakemodem.sys

[DestinationDirs]

CopyFileSection=12

DefaultDestDir=12

Vì driver này chưa được chứng thực bởi Microsoft nên hệ thống sẽ hỏi có tiếp tục quá trình hay không, chọn tiếp tục.


Lưu ý là WDF cần có file Co-installation, vào thư mục “\redist\wdf\x86”, chép file WdfCoInstaller01007.dll vào thư mục cài đặt


Sau khi quá trình cài đặt hoàn thành, mở Device Manager, sẽ thấy Fake Modem xuất hiện.

Vậy là các bạn đã có thể tự tạo cho mình 1 driver riêng, biên dịch và cài đặt thành công vào Windows XP, ở bài tiếp theo, chúng tôi sẽ trình bày về các thủ thuật debug, kiểm tra driver trước khi đưa vào triển khai cài đặt.