Các chương trình quản lý phòng máy hiện nay ở Việt Nam - 5

pdf
Số trang Các chương trình quản lý phòng máy hiện nay ở Việt Nam - 5 25 Cỡ tệp Các chương trình quản lý phòng máy hiện nay ở Việt Nam - 5 731 KB Lượt tải Các chương trình quản lý phòng máy hiện nay ở Việt Nam - 5 0 Lượt đọc Các chương trình quản lý phòng máy hiện nay ở Việt Nam - 5 0
Đánh giá Các chương trình quản lý phòng máy hiện nay ở Việt Nam - 5
4 ( 13 lượt)
Nhấn vào bên dưới để tải tài liệu
Đang xem trước 10 trên tổng 25 trang, để tải xuống xem đầy đủ hãy nhấn vào bên trên
Chủ đề liên quan

Nội dung

hàm API CreateDC: tạo ngữ cảnh thiết bị hàm API GetDeviceCaps: lấy các thông số của thiết bị. Áp dụng mã vào chương trình như sau: HDC hScrDC; hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); int xScrn, yScrn; xScrn = GetDeviceCaps(hScrDC, HORZRES); yScrn = GetDeviceCaps(hScrDC, VERTRES); //resize cho lon nhat . Day la topmost window SetWindowPos(&wndTopMost, 0, 0, xScrn, yScrn, SWP_SHOWWINDOW); Hai dòng đầu tạo một HDC cho thiết bị màn hình hiển thị, do tính chất đặc biệt của màn hình mà hàm chỉ cần nhận tham số tên “DISPLAY” là có thể trả về kết quả. Ba dòng kế tiếp có tác dụng lấy độ rộng và độ dài của màn hình. Dòng cuối là gọi phương thức SetWindowPos như cách 1. Có một lưu ý nhỏ ở đây là ta vẫn có thể sử dụng thay thế hàm SetWindowPos bằng một hàm API khác là MoveWindow. Để biết chi tiết hàm, xem thêm trong Phụ lục Các hàm API hữu ích sử dụng trong chương trình. Hàm API này tuy có chức năng tương tự với SetWindowPos nhưng hàm lại không có chức năng quản lý việc “nổi” lên trên cửa sổ khác.Mặc dù theo thiết kế ban đầu khi khởi động xong, chỉ có một cửa sổ màn hình che phủ toàn bộ màn hình, rất có khả năng người dùng nhanh tay kích hoạt một cửa sổ nào đó trên desktop. Khi ấy, sử dụng hàm MoveWindow lại không làm cửa sổ “nổi” lên trên tất cả các cửa sổ còn lại. Hàm SetWindowPos lại có thêm tác dụng hữu ích này. Thử nghiệm: Chương trình vô hiệu hóa tuyệt đối việc tương tác của người dùng với desktop bằng mouse. Chỉ còn lại một việc nữa phải làm là vô hiệu hóa bàn phím. 101 Hình 3-6 Màn che mouse 3.2.2.2 Tương tác bằng bàn phím: Mục tiêu ban đầu là không cho người dùng gõ những phím tắt kích hoạt chương trình. Tuy nhiên, ta không cần vô hiệu hóa cả bàn phím. Điều này rất lãng phí công sức. Thực chất, ta thực hiện mục tiêu dưới điều kiện hoàn thành ngăn chặn tương tác với mouse. Vì vậy các loại tương tác làm cho xuất hiện các chương trình thông thường như Windows Explorer (Win key + E)… không làm ta quan tâm vì các cửa sổ chương trình đó không thể “nổi” bằng cửa sổ màn hình che. Vì vậy, chỉ còn lại các loại phím và tổ hợp phím tắt “nhạy cảm” cấp thấp mà thôi. Các loại phím tắt đó là: o Win key : có tác dụng bật Start menu. o Alt + Tab : có tác dụng đổi cửa sổ đang hoạt động. o Alt + Esc : có tác dụng kích hoạt cửa sổ kế trên thanh taskbar. 102 o Ctrl + Esc: có tác dụng tương tự Win key o Ctrl + Shift + Esc : có tác dụng bật Task Manager. o Esc : đây là vấn đề về kỹ thuật làm, theo thiết kế ta tạo một cửa sổ hộp thoại đơn giản, nên chịu tác dụng của phím Esc, có tác dụng tắt cửa sổ màn che. o Alt + F4 : có tác dụng tắt cửa sổ màn hình che. o Ctrl + Alt + Del : có tác dụng bật Task Manager, hay hộp lựa chọn tùy theo cấu hình Windows (đây là tổ hợp phím gây “nhức đầu” nhiều nhất, ta sẽ đề cập kỹ trong phần sau). o Ctrl + Shift + Esc : bật Task Manager. May mắn thay, trong 7 tổ hợp phím đầu, ta dễ dàng loại bỏ khi sử dụng kỹ thuật lập trình bằng hook, xem chi tiết về kỹ thuật này trong 3.1 Kỹ thuật lập trình sự kiện và hook và mã nguồn chương trình. Ta chỉ áp dụng xây dựng một hook đơn giản lọc bỏ trong quá trình đợi đăng nhập và loại bỏ khi đăng nhập xong. Tuy nhiên, với 2 tổ hợp phím cuối cùng, Ctrl + Alt + Del và Ctrl + Shift + Esc (về sau ta gọi tắt chỉ một mình tổ hợp Ctrl + Alt + Del vì tổ hợp Ctrl + Shift + Esc cũng có tính năng tương tự), khá phức tạp. Ta phải hiểu rõ cơ chế truyền gởi thông điệp Ctrl – Alt – Del. Hook bàn phím không thể bắt được tổ hợp phím Ctrl – Alt – Del ! Tại sao ? Vì chính bản thân hệ điều hành Windows không hề gởi tổ hợp phím này cho hook chain. Nó đã được chặn bắt và xử lý ở mức thấp hơn ở hệ thống và không bao giờ được gởi lên ứng dụng. Ứng dụng nếu có cài đặt cũng chỉ nhận được các phím Ctrl, Alt, và Del rời rạc chứ không phải là tổ hợp Ctrl – Alt – Del. Tổ hợp phím sau đó sẽ gởi đến cơ chế khởi động đăng nhập của Windows, gọi là Winlogon, gồm 3 thành phần : thành phần thực thi (“winlogon.exe”), thư viện liên kết động “Chứng thực và nhận dạng theo cơ chế đồ họa” (Graphical Identification and Authentication GINA) (“msgina.dll”), và các thành phần mạng. Tham khảo các tài liệu, ta tìm thấy các cách khống chế tổ hợp Ctrl – Alt – Del, một số cách dựa trên việc khống chế một trong hai thành phần đầu trong cơ chế khởi động đăng nhập của Windows như sau: 103 • Giả lập “lừa” hệ điều hành rằng đang có một screensaver đang chạy, tổ hợp phím được gởi nhưng không kích hoạt Task Manager. Tuy nhiên, cách này chỉ có tác dụng ở các phiên bản hệ điều hành Win98, không có tác dụng trên WinXP. Cách này cũng rất hạn chế khi chỉ có tác dụng khi có thiết lập hệ thống phù hợp, một số tài liệu cho rằng cả phiên bản hệ điều hành Win98 cũng không có tác dụng !. • Vô hiệu hóa Task Manager bằng chính sách (policy). Cách này không hề xử lý ở “gốc”, chặn bắt thông điệp Ctrl – Alt – Del, mà xử lý ở “ngọn”, đặt chính sách hệ thống ngăn chặn kích hoạt Task Manager. Cách này đơn giản nhưng không dùng được vì thông điệp thông báo : Hình 3-7 Thông báo của policy về việc vô hiệu hóa Task Manager khá bực mình, lại còn làm xuất hiện Start Menu. • Bắt thông điệp ở tận “gốc” khi xây dựng driver thiết bị bàn phím. Lúc đó, phải sử dụng Device Development Kit (bộ phát triển thiết bị). Đây là lĩnh vực lập trình hoàn toàn mới, với thời gian nghiên cứu không cho phép, ta bỏ qua khả năng này. • Viết một GINA stub. GINA là một thư viện liên kết động mà Winlogon dùng để chứng thực người dùng. Đây là một cách khá hay, nhưng nó lại làm thay đổi cách đăng nhập của người dùng đồng thời vô hiệu hóa màn hình Welcome, và chớp màn hình mỗi khi người dùng nhấn Ctrl – Alt – Del. Tuy ta không sử dụng cách này nhưng có thể xem thêm về kỹ thuật này trong Phụ lục GINA stub – kỹ thuật xây dựng. • Tạo một desktop mới và chuyển sang desktop mới này. Vì kích hoạt Task Manager bằng tổ hợp phím Ctrl – Alt – Del chỉ làm xuất hiện Task Manager 104 trên “Default” desktop (desktop cũ), nên trên desktop mới sẽ không có xuất hiện. Cách này khá hiệu quả khi ta xây dựng màn hình che bên desktop mới, người dùng đăng nhập vào thì trở lại desktop cũ. Khuyết điểm nhỏ của cách này là hơi phức tạp về mặt lý thuyết cài đặt chương trình, và người dùng đăng nhập vào thành công sẽ thấy Task Manager hiện ra mặc dù trước đó có vẻ việc nhấn Ctrl – Alt – Del không có tác dụng. Tuy ta không sử dụng cách này nhưng có thể xem thêm về kỹ thuật này trong Phụ lục Tạo thêm và sử dụng Desktop mới. • Kế thừa, trở thành lớp con của lớp cửa sổ SAS trong tiến trình Winlogon. Để làm được điều này, mã phải được “chích” (inject) vào tiến trình Winlogon và sau đó tạo lớp con kế thừa Windows Procedure. Kỹ thuật này không tương thích với Windows 95/98/Me. Ta sẽ sử dụng kỹ thuật này để vô hiêu hóa tổ hợp phím Ctrl – Alt - Del. Module xây dựng gồm có hai phần lớn : tạo lớp con kế thừa lớp cửa sổ SAS của Winlogon. * Tạo lớp con kế thừa lớp cửa sổ SAS của Winlogon: Hàm API SetWindowLong sẽ giúp ta thực hiện điều này: Áp dụng hàm vào trong chương trình: SetWindowLong(hWnd, GWL_WNDPROC, NewWindowProc); Lời gọi chỉ có tác dụng cho các cửa sổ được tạo bởi cùng ứng dụng gọi hàm (địa chỉ hàm NewWindowProc chỉ có nghĩa với tiến trình gọi hàm SetWindowLong). Như vậy, ta sẽ dùng một cách nào đó ánh xạ được điạ chỉ của NewWindowProc vào trong không gian địa chỉ của tiến trình ở xa và chuyển địa chỉ đó đến lời gọi hàm SetWindowLong. Để có thể hiểu cơ chế nạp một chương trình vào bộ nhớ, cũng như định nghĩa về không gian địa chỉ của tiến trình, xem thêm Phụ lục Quá trình nạp một hook DLL toàn cục. Bây giờ, ta sẽ bàn về kỹ thuật injection. * Kỹ thuật injection: 105 Khả năng ứng dụng của kỹ thuật injection rất mạnh mẽ và hữu ích. Ưu điểm này cũng lại là khuyết điểm. Vì càng có nhiều khả năng ứng dụng mà không bị hạn chế, kỹ thuật injection đòi hỏi các lập trình viên cần phải lập trình cực kỳ cẩn thận các đọan mã mà họ sẽ “chích” vào tiến trình ở xa. Mọi hành động “chích” lầm sẽ dẫn đến hậu quả cực kỳ nguy hiểm như crash chương trình ở xa, treo máy… Tuy nhiên, việc lập trình thành công bằng kỹ thuật injection sẽ gợi mở nhiều khả năng lập trình thú vị như : xem mật khẩu dạng * trên một cửa sổ khác, Hình 3-8 Ứng dụng xem mật khẩu từ cửa sổ khác điều khiển hoạt động của các tiến trình hệ thống Windows như : giấu tên tiến trình đang chạy trong hai tab Applications” và “Processes” của Task Manager, … đặc biệt là ứng dụng mà ta cần là vô hiệu hóa Ctrl – Alt – Del. Vậy thực chất kỹ thuật injection là gì ? Kỹ thuật ánh xạ bộ nhớ (mã chương trình) vào trong không gian địa chỉ của một tiến trình ở xa được gọi là kỹ thuật injection. Việc injection có thể thực hiện bởi một trong những cài đặt sau: • Registry. Để “chích” một DLL vào một tiến trình, chỉ cần đơn giản thêm tên DLL đó vào trong khóa registry: HKLM\Software\Microsoft\Windows NT\ 106 CurrentVersion\Windows\AppInit_DLLs:STRING chỉ hỗ trợ trên Windows NT trở lên. • Hook. Cách này hỗ trợ trên mọi phiên bản Windows. • Sử dụng CreateRemoteThread()/LoadLibrary(), chỉ đúng với Windows NT và cao hơn. • Sao chép mã trực tiếp vào tiến trình ở xa bằng WriteProcessMemory() và thực thi nó bằng hàm CreateRemoteThread(), chỉ đúng với Windows NT và cao hơn. Mức độ cẩn thận trong lập trình tăng dần từ trên xuống trong 4 cài đặt của kỹ thuật, tỉ lệ nghịch với việc tiêu tốn tài nguyên (giảm dần từ trên xuống). Cơ chế hook vẫn áp dụng được trong kỹ thuật này nhưng việc áp dụng nó khá tiêu tốn tài nguyên hệ thống. Ta sẽ thực hiện phương án cuối để áp dụng kỹ thuật injection cho cài đặt trong phần mềm. Phương án 3 cũng khả thi nhưng lại không ổn định, tùy thiết lập của máy mà phương án thành công hay không, có thể xem thêm phương án này trong mã nguồn chương trình. Ở đây, ta sẽ mô tả cài đặt cuối : Chương trình sử dụng cài đặt cuối qua hai hàm InjectCode, và EjectCode. InjectCode thực hiện việc sao chép dữ liệu và trong tiến trình của cửa sổ SAS. Các dữ liệu này là : InjectFunc, “khung” thực thi của tiểu trình, GetSASWnd, tìm handle của cửa sổ SAS, SASWindowProc, hàm window procedure của lớp con kế thừa, INJDATA, các dữ liệu đầu vào. Hàm InjectCode int InjectCode () Bỏ qua các chi tiết rườm rà về kỹ thuật (cấp phát bộ nhớ bên tiến trình ở xa, kỹ thuật lấy vùng nhớ …) thì hàm InjectCode làm những động tác sau: o Lấy địa chỉ hàm FindWindowA trong DLL USER32.DLL. o Mở tiến trình winlogon.exe với truy cập toàn quyền. o Sao chép dữ liệu INJDATA với khởi tạo gồm tên lớp "SAS Window class", tên cửa sổ "SAS window", địa chỉ hàm FindWindowA vào tiến trình ở xa. 107 o Sao chép hàm GetSASWnd vào trong tiến trình ở xa. o Tạo tiểu trình thực hiện việc tìm kiếm handle của cửa sổ SAS. o Nếu thành công, sẽ trả về handle cửa sổ SAS. o Sao chép nội dung hàm SASWndProc vào trong tiến trình ở xa. o Sao chép dữ liệu INJDATA với khởi tạo gồm địa chỉ hàm SetWindowLong (tùy theo tiến trình ở xa có sử dụng Unicode hay không mà sẽ chép tương ứng hàm dạng SetWindowLongA hay SetWindowLongW), CallWindowProc (tùy theo tiến trình ở xa có sử dụng Unicode hay không mà sẽ chép tương ứng hàm dạng CallWindowProcA hay CallWindowProcW), SASWndProc. o Trong SASWndProc, cần sử dụng dữ liệu trong INJDATA nhưng đây là một hàm callback nên tham số đầu vào không thể tùy biến, ta không thể truyền tường minh dữ liệu này. Vì vậy, ở đây, ta đã biết được địa chỉ của dữ liệu đầu vào INJDATA, và cả nội dung hàm SASWndProc đã được ghi vào vùng nhớ bên tiến trình ở xa, ta phải thực hiện động tác ghi trực tiếp giá trị biến nội tại sẽ lưu địa chỉ dữ liệu đầu vào INJDATA, bằng cách tìm trong vùng nhớ ở xa đã ghi nội dung hàm SASWndProc từng DWORD một. Dĩ nhiên biến nội tại này đã lưu một giá trị đặc biệt để có thể tìm ra. o Sao chép nội dung hàm InjectFunc o Tạo tiểu trình thực hiện nội dung hàm InjectFunc: dùng SetWindowLong thay window procedure mới. o Nếu thành công, công việc hoàn tất. Hàm InjectFunc Chức năng: tạo lớp con kế thừa, thay đổi hàm window procedure mới cho cửa sổ SAS. static DWORD WINAPI InjectFunc (INJDATA *pData) Hàm window procedure mới chính là SASWindowProc. Ta không thể lấy dữ liệu từ tiến trình ở xa (ví dụ như truy cập hàm SetWindowLong…) nên mọi dữ liệu đầu vào phải chuẩn bị sẵn và “chích” vào tiến trình, tại đây, lần lượt các hàm sẽ 108 sử dụng các dữ liệu này. Ở đây, InjectFunc sử dụng địa chỉ hàm SetWindowLong trong INJDATA Ý nghĩa tham số: pData: dữ liệu đầu vào, sẽ được giải thích ở phần sau. Hàm GetSASWnd Chức năng :lấy handle của cửa sổ SAS. static HWND WINAPI GetSASWnd (INJDATA *pData) Hàm SASWindowProc LRESULT CALLBACK SASWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) Nếu đến đây mọi việc “đột nhập” đều suôn sẻ, các công việc sau đây sẽ được thực hiện tiếp trong đoạn mã vừa sao chép (là nội dung các hàm nêu ở trên, các bước sau đều thực hiện trong không gian địa chỉ ảo của tiến trình ở xa): • Lấy handle của cửa sổ SAS : hSASWnd = FindWindow("SAS Window class", "SAS window"); FindWindow là một hàm API khá hữu ích, được dùng để tìm handle của các cửa sổ top-level nếu biết tên cửa sổ và tên lớp. • Tạo lớp con kế thừa window procedure của cửa sổ SAS: SetWindowLong(hSASWnd, GWL_WNDPROC, NewSASWindowProc); • Trong NewSASWindowProc(), bắt thông điệp WM_HOTKEY và trả về 1 cho tổ hợp phím Ctrl – Alt – Del. LRESULT CALLBACK NewSASWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_HOTKEY) { // Ctrl+Alt+Del if (lparam == MAKELONG(MOD_CONTROL | MOD_ALT, VK_DELETE)) return 1; 109 } return CallWindowProc(OldSASWindowProc, hWnd, wParam, lParam); } Hình 3-9 Màn che mouse và bàn phím 110
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.