Huỳnh Phúc Huy
Búa Đá Đôi
Nhắc đến keylogger thì hầu hếu nhiều bạn đã biết rồi nhưng mình cũng muốn nêu lại ngắn gọn về định nghĩa này.
Keylogger hay "trình theo dõi thao tác bàn phím" theo cách dịch ra tiếng Việt là một chương trình máy tính ban đầu được viết nhằm mục đích theo dõi và ghi lại mọi thao tác thực hiện trên bàn phím vào một tập tin nhật ký (log) để cho người cài đặt nó sử dụng. Vì chức năng mang tính vi phạm vào riêng tư của người khác này nên các trình keylogger được xếp vào nhóm các phần mềm gián điệp.
Phòng chống Keylogger cho ứng dụng của bạn
Khi bạn phân phối ứng dụng cho người dùng thì việc yêu cầu người dùng cài đặt trình antivirus để phòng keylogger khi sử dụng ứng dụng của bạn là không khả thi
Vì thế mình sẽ cũng cấp một giải pháp để phòng tránh keylogger có thể ghi được thông tin khi người dùng nhập lệu trên ứng dụng của bạn bằng cách sử dụng một hàm đơn giản đã được cung cấp bởi thư viện user32.dll của Windows
Các bạn có thể sử dụng mọi ngôn ngữ chỉ cần ngôn ngữ đó có thể làm việc với các thư viện của windows, ngôn ngữ mà mình demo trong bài viết này là C# và ứng dụng nhỏ mình sử dụng là khung đăng nhập đơn giản gồm 2 fields
Bằng phương pháp tạo ra một Desktop ngẫu nhiên và khởi tạo thread chạy độc lập trên desktop mới này sẽ ngăn chặn được các chương trình khác can thiệp trên nền ứng dụng, kể cả low level hook của keylogger. Chi tiết về tập lệnh, các bạn có thể tham khảo thêm ở đây : https://msdn.microsoft.com/en-us/li...124(v=vs.85).aspx?f=255&MSPPError=-2147217396
Mã nguồn:
>> Khai báo các phương thức, hằng số và import user32.dll
Mã:
[DllImport("user32.dll")]
public static extern IntPtr CreateDesktop(string lpszDesktop, IntPtr lpszDevice,
IntPtr pDevmode, int dwFlags, uint dwDesiredAccess, IntPtr lpsa);
[DllImport("user32.dll")]
private static extern bool SwitchDesktop(IntPtr hDesktop);
[DllImport("user32.dll")]
public static extern bool CloseDesktop(IntPtr handle);
[DllImport("user32.dll")]
public static extern bool SetThreadDesktop(IntPtr hDesktop);
[DllImport("user32.dll")]
public static extern IntPtr GetThreadDesktop(int dwThreadId);
[DllImport("kernel32.dll")]
public static extern int GetCurrentThreadId();
public static String html;
enum DESKTOP_ACCESS : uint
{
DESKTOP_NONE = 0,
DESKTOP_READOBJECTS = 0x0001,
DESKTOP_CREATEWINDOW = 0x0002,
DESKTOP_CREATEMENU = 0x0004,
DESKTOP_HOOKCONTROL = 0x0008,
DESKTOP_JOURNALRECORD = 0x0010,
DESKTOP_JOURNALPLAYBACK = 0x0020,
DESKTOP_ENUMERATE = 0x0040,
DESKTOP_WRITEOBJECTS = 0x0080,
DESKTOP_SWITCHDESKTOP = 0x0100,
GENERIC_ALL = (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU |
DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | DESKTOP_JOURNALPLAYBACK |
DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | DESKTOP_SWITCHDESKTOP),
}
>> Khởi tạo một Desktop ngẫu nhiên và tiến hành chuyển đổi sang Desktop mới này
Mã:
// old desktop's handle, obtained by getting the current desktop assigned for this thread
IntPtr hOldDesktop = GetThreadDesktop(GetCurrentThreadId());
// new desktop's handle, assigned automatically by CreateDesktop
IntPtr hNewDesktop = CreateDesktop("RandomDesktopName",
IntPtr.Zero, IntPtr.Zero, 0, (uint)DESKTOP_ACCESS.GENERIC_ALL, IntPtr.Zero);
// switching to the new desktop
SwitchDesktop(hNewDesktop);
>> Đóng Desktop sau khi kết thúc phiên làm việc và trở về desktop hiện tại
Mã:
// if got here, the form is closed => switch back to the old desktop
SwitchDesktop(hOldDesktop);
// disposing the secure desktop since it's no longer needed
CloseDesktop(hNewDesktop);
Các bạn có thể kiểm tra thành quả bằng cách mở một chương trình theo dõi bàn phím hoặc thử nhấn nút chụp hình (PrintSceen), nếu không thể log nội dung nhập trên ứng dụng hay không thể chụp hình được nghĩa là thành công rồi nhé
Tải project mẫu
Các bạn có thể tải project mẫu ở file đính kèm để tiện ngâm cứu và áp dụng