2011-12-19 50 views
8

Cách lấy danh sách các móc được cài đặt trên toàn cầu trong Windows (sử dụng API SetWindowsHookEx)?Danh sách các móc cửa sổ được cài đặt

+0

@DavidStratton Tôi nghĩ anh ấy đang yêu cầu danh sách mọi thứ được gọi là 'SetWindowsHookEx'. – vcsjones

+0

Bàn phím chẳng hạn. SetWindowsHookEx cài đặt quy trình móc được xác định bởi ứng dụng vào một chuỗi móc. Tôi muốn lấy chuỗi móc này. – lightstep

+0

Bạn không thể tự làm điều này; Bạn đang cố gắng để thực hiện? – Michael

Trả lời

3

Một cách độc ác là móc tất cả các chức năng hooking trước khi bất kỳ điều gì khác có cơ hội.

+0

Tôi biết có thể cài đặt móc của riêng mình sẽ được gọi trước bất kỳ móc nào khác, nhưng nó không cho biết số lượng móc đã đăng ký theo sau khi hook của tôi gọi CallNextHookEx. – lightstep

+0

Không phải loại móc đó. Nhập hàm hook vào 'SetWindowsHookEx'. Bằng cách này bạn có thể đếm khi một quá trình gọi hàm đó. – kichik

+0

Tôi hiểu, nhưng làm thế nào tôi có thể chắc chắn để móc SetWindowsHookEx trước khi bất cứ ai gọi nó? – lightstep

5

Xem


Tìm móc So với các hoạt động khác, liệt kê các installe d móc khá dễ dàng.

Móc cụ thể theo chủ đề được ghi lại trong dữ liệu chuỗi chỉ số win32k được gắn thẻ, thay vì tưởng tượng, như THREADINFO 1. Đây là về cơ bản là cấu trúc ETHREAD/TEB giống như cấu trúc nhưng được thiết kế riêng dành riêng cho thông tin người dùng và gdi. Một trong những thành viên của nó (aphkStart) là một mảng 16 phần tử con trỏ, riêng chúng hoặc là điểm NULL, hoặc phần đầu của danh sách liên kết cấu trúc HOOK. Việc liệt kê các móc chỉ đơn giản là thước đo đi bộ xuống các dây chuyền .

Để thuận tiện và có thể do đó không cần phải lặp lại để xem nếu bất kỳ móc nào được đặt, THREADINFO chứa một thành viên khác, fsHooks, là một bitfield. Nếu bit được bật, chỉ mục tương ứng trong mảng móc hợp lệ. Thay vì 33 so sánh (16 cho NULL và 17 cho một for-loop), nói nếu có móc chỉ đòi hỏi một, tiện lợi!

móc toàn cầu, đó là mỗi máy tính để bàn 2, cũng được lưu trữ trong một cấu trúc mỗi đối tượng, cũng tưởng tượng được đặt tên (DESKTOPINFO), và được cũng được lưu trữ trong một mảng với một bitfield đi kèm. Cầu nối hai là pDeskInfo, một thành viên của THREADINFO trỏ đến sở hữu DESKTOPINFO.

Mặc dù bị rình rập trong phần giới thiệu, làm việc với tất cả các cấu trúc không có giấy tờ này không thực sự quá khó trong thực tế. Ký hiệu Windows 7 cho win32k.sys bao gồm bố cục của chúng, rất đẹp. Các biểu tượng cho thời đại Vista/Server 2008 không mặc dù, đây là nơi mà việc học tập đến và tiết kiệm trong ngày.

Biết những gì các cấu trúc giống như là một chuyện, nhận được vào họ là một ...

Sau khi nhận được găng tay bẩn thỉu của chúng tôi về họ, chúng ta thấy cấu trúc HOOK kỷ lục hầu hết các thông tin liên quan bản thân:

struct tagHOOK 
{ 
    THRDESKHEAD head; // info about the creator 
    struct tagHOOK* phkNext; // next entry in linked list 
    int iHook; // WH_ hook type 
    UINT_PTR offPfn; // RVA to hook function in ihmod library 
    UINT flags; // HF_ flags (GLOBAL, ANSI) 
    int ihmod; 
    THREADINFO* ptiHooked; // the hooked thread 
    PVOID rpDesk; // saved desktop pointer 
    ULONG nTimeout :7; 
    ULONG fLastHookHung :1; 
}; 

Bạn có thể tải software here


Một cái nhìn tổng quan để phát hiện móc toàn cầu cài đặt sau:

  1. Gọi PsGetCurrentThread và nhận được cấu trúc ETHREAD của thread hiện hành. ETHREAD là cấu trúc dữ liệu mờ theo tài liệu MSDN.
  2. Trích xuất cấu trúc THREADINFO bằng cách gọi PsGetThreadWin32Thread. Cả hai đều không có giấy tờ.
  3. Trích xuất DESKTOPINFO.
  4. Ở đó bạn có thể tìm thấy tất cả các móc được lắp đặt trên toàn cầu. Chúng được tổ chức trong một mảng. Mỗi phần tử là một danh sách được liên kết và tương ứng với một móc cụ thể (WH_ *).

Một cái nhìn tổng quan để phát hiện móc cục bộ cài đặt sau:

  1. Cho một thread ID.
  2. Gọi PsLookupThreadByThreadId và nhận cấu trúc ETHREAD của chuỗi được chỉ định.
  3. Trích xuất cấu trúc THREADINFO bằng cách gọi PsGetThreadWin32Thread.
  4. Ở đó bạn có thể tìm thấy tất cả các móc được lắp đặt cục bộ cho sợi chỉ định. Chúng được tổ chức trong một mảng. Mỗi phần tử là một danh sách được liên kết và tương ứng với một móc cụ thể (WH_ *).

Bạn có thể xem source here


Plugin for Process Hacker 2 (http://processhacker.sourceforge.net), móc hệ thống màn hình và có khả năng mở móc (bên phải nhấp vào menu).

Lấy nguồn Process Hacker và biên dịch nó, sau đó thêm HookTools.vcxproj vào Plugins.sln. VS 2013 đã được sử dụng. Đặt thư viện của bạn đường dẫn trong thư mục VC++.


hoặc có liên quan câu hỏi với câu trả lời ở đây

Nhưng tôi vẫn chưa tìm thấy một cách đáng tin cậy để làm điều đó.

+2

* "Trang web này không khả dụng" *. Vui lòng xem [Làm cách nào để viết câu trả lời hay?] (Http://stackoverflow.com/help/how-to-answer), cụ thể: * "Cung cấp ngữ cảnh cho các liên kết: Các liên kết tới các tài nguyên bên ngoài được khuyến khích, nhưng hãy thêm ngữ cảnh xung quanh liên kết để người dùng đồng nghiệp của bạn sẽ có ý tưởng và đó là lý do tại sao. ** Luôn trích dẫn phần có liên quan nhất của liên kết quan trọng, trong trường hợp trang web mục tiêu không thể truy cập hoặc vĩnh viễn ngoại tuyến **. "* – IInspectable

Các vấn đề liên quan