2011-09-02 30 views
8

Mặc dù tôi đã tìm kiếm rất nhiều, vẫn không rõ ràng với tôi về chính xác "móc" là gì. Ví dụ, tôi đọc bài này trên wiki answers:"móc" là gì và làm thế nào tôi có thể viết một cái trong Java? Và làm thế nào để giao tiếp với hạt nhân để biết các phím được nhấn bởi người dùng/đăng ký với hệ điều hành

Một móc là một phương pháp xen một đoạn mã trước mặt khác đoạn mã, do đó phần đầu tiên của mã thực thi trước khi mảnh thứ hai của mã, cho đoạn mã đầu tiên một cơ hội để theo dõi và/hoặc lọc hành vi của đoạn mã thứ hai. Ví dụ có thể là móc chuột, cho phép mã móc theo dõi chuột trong khi đồng thời bảo toàn chức năng của quy trình xử lý sự kiện chuột gốc .

Tôi cũng đọc số này post, nhưng tôi vẫn không hiểu chính xác "móc" là gì. Ai đó có thể vui lòng giải thích, theo thuật ngữ của giáo dân, "móc" là gì? Tại sao chính xác làm một số viết một "móc"? Ngoài ra, nó có thể viết một "móc" trong Java?

Lưu ý:

Tôi muốn viết một keylogger trong java và một trong những người bạn của tôi nói rằng bạn sẽ phải viết một "móc" trong C. Tôi không thể viết toàn bộ keylogger trong Java (chỉ hoạt động trên các cửa sổ)?

EDIT

xin đưa ra một câu trả lời w.r.t keylogger. Tôi có thể yêu cầu kernel để cung cấp thông tin về khóa được nhấn vào ứng dụng của tôi bằng cách sử dụng móc nối? Hoặc làm thế nào tôi có thể đăng ký ứng dụng của tôi với hệ điều hành bằng cách sử dụng JNI? Tôi muốn ứng dụng của tôi ghi lại các phím được nhấn bởi người dùng.

+1

Tôi nghĩ bạn của bạn muốn nói rằng bạn sẽ cần sử dụng phương pháp gốc. Bạn có thể viết một phương thức nguyên gốc trong C và gọi nó từ Java bằng cách sử dụng Giao diện Native Java (JNI). – toto2

+0

@ toto2 và phương thức gốc đó sẽ làm gì? – saplingPro

+0

Đó sẽ là chức năng hệ thống ghi nhật ký các phím. Trên thực tế bạn tốt hơn hết hoàn toàn gửi Java cho một công việc như vậy. Java có nghĩa là để được di động và nhược điểm là nó không thể làm công cụ liên quan đến hệ điều hành. Tôi không biết Windows nhiều, nhưng có lẽ C# sẽ thích hợp hơn. – toto2

Trả lời

2

tôi sẽ kết hợp móc từ với ít nhất hai khái niệm khác nhau:

a) Pattern Observer, nơi một Class cho phép bạn thêm một Listener sẽ được thông báo về các sự kiện nhất định. Bạn có thể tìm thấy điều này trên Swing, API Servlet và nhiều khung bên thứ 3.

b) Mẫu Phương thức mẫu. Một lớp trừu tượng định nghĩa các phương thức nào được gọi theo thứ tự nào, và lớp thực hiện có thể ghi đè lên các phương thức này. Ví dụ về điều này không phải là rằng phổ biến, nhưng bạn nhìn thấy chúng một lần trong một thời gian.

1

Tên khác cho điều này có thể là đại biểu hoặc gọi lại.

Một ví dụ về điều này trong Java là Trình ghi chuột (http://download.oracle.com/javase/tutorial/uiswing/events/mouselistener.html). MouseListener là một giao diện với các phương thức như mouseClicked(MouseEvent e). Để phản hồi hành động của chuột từ người dùng, bạn sẽ triển khai MouseListener và khi người dùng nhấp vào, thư viện Java Swing sẽ gọi cho lớp người nghe của bạn (sau khi bạn đăng ký bằng cách gọi addMouseListener.

1

Dưới đây là một ví dụ đơn giản:

public void hookableMethod(HookObject hook, String param) { 
String innerParam = param; 
if(hook != null) { 
innerParam = hook.someHookMethod(innerParam); 
} 

//rest of the code is working with inner param 
} 

Trong ví dụ đơn giản đi này hookableMethod cung cấp một cách cho một thực thể bên ngoài để móc nó - đó là vượt qua tham chiếu đối tượng bên ngoài và đối tượng bên ngoài này sẽ được thực hiện đầu tiên . Vì vậy, nếu bạn cần phải có một số loại xử lý mà không phải là một phần của việc thực hiện ban đầu bạn có thể làm điều đó chỉ đơn giản bằng cách đi qua một tài liệu tham khảo và không phải bằng cách vá nguồn gốc.

5

Từ Hooking - Wikipedia,

Trong lập trình máy tính, hooking hạn bao gồm một loạt các kỹ thuật sử dụng để thay đổi hoặc tăng cường cho hành vi của một hệ điều hành, các ứng dụng, hoặc các thành phần phần mềm khác bởi chức năng chặn cuộc gọi hoặc tin nhắn hoặc sự kiện được chuyển giữa các thành phần phần mềm. Mã số xử lý các cuộc gọi, sự kiện hoặc tin nhắn bị chặn như vậy là được gọi là "móc".

Ví dụ điển hình được tích hợp vào Java sẽ là Runtime.addShutdownHook. Một móc tắt máy chỉ đơn giản là một chuỗi được khởi tạo nhưng chưa được bắt đầu. Khi máy ảo bắt đầu trình tự tắt máy của nó, nó sẽ bắt đầu tất cả các móc tắt đã đăng ký trong một số thứ tự không xác định và cho phép chúng chạy đồng thời.

Runtime.addShutdownHook(new Thread(){ 
    @Override 
    public void run(){ 
     // do something before application terminates 
    } 
}); 
1

Đối với các keylogger: yes bạn có thể viết tối đa của nó trong Java NHƯNG một phần nhỏ sẽ phải đi vào một module JNI vì ví dụ với một cái móc toàn cầu một DLL/thread/bất cứ điều gì được "tiêm" vào các quy trình khác ... vì không phải tất cả quá trình lưu trữ một JVM, vv điều này sẽ không hoạt động trong Java ... do đó bạn cần phải sử dụng JNI và một số C để viết một DLL cho phần đó của keylogger của bạn ...

EDIT - theo nhận xét:

This article mô tả chiều sâu những gì móc toàn cầu làm và ý nghĩa của việc tiêm ...

+0

@ Yahia '" toàn cầu móc một DLL/thread/bất cứ điều gì được "tiêm" vào các quá trình khác .. "' bạn có thể làm cho rõ ràng hơn và bao gồm một phần trong câu trả lời của bạn – saplingPro

+0

@grassPro - vui lòng liên kết trong EDIT của tôi ... – Yahia

1

Trong trường hợp của bạn, móc là cơ chế phần mềm để đăng ký người nghe (bộ xử lý) trong hệ điều hành. Trình xử lý này (một phương thức trong ứng dụng của bạn chẳng hạn) sẽ được hệ điều hành thông báo khi một sự kiện quan trọng được kích hoạt (khóa được đẩy).

Đây chỉ là một ứng dụng của mẫu người quan sát.

Một ví dụ hư cấu:

class MyKBHandler implements ISomeKeyboardListener { 
     public void onKeyDown(<params containing key info here>){ 
      //Your code here, doing something with the params. 
     } 
    } 

    MyKBHandler handler = new MyKBHandler(); 
    <someOSLibrary>.register(handler); 

Khi họ đã nói với bạn trong câu trả lời khác, không có cách nào để làm điều này trong Java mà không cần dựa vào một số miếng code.I mẹ đẻ nghĩ cách dễ nhất để đi là để chọn một ngôn ngữ liên quan đến hệ điều hành bạn đang nhắm mục tiêu. Đối với các cửa sổ, tôi sẽ làm điều đó với C#.

Kiểm tra liên kết này:

http://msdn.microsoft.com/en-us/library/ms632589%28VS.85%29.aspx

+0

và làm thế nào tôi có thể nói chuyện với hạt nhân? – saplingPro

+0

Nói chuyện với hạt nhân? Bạn không phải làm vậy. Chỉ cần đăng ký với hệ điều hành và nó sẽ calll xử lý của bạn trên mỗi đột quỵ quan trọng. Trong trang này http://en.wikipedia.org/wiki/Hooking bạn có một ví dụ về C# keylogger, có rất nhiều mã nguồn mở cũng trên tất cả các mạng. –

+0

@ Mister Smith Tôi muốn đăng ký ứng dụng của mình bằng JNI. tức là tôi muốn sử dụng Java và mã gốc, đặc biệt là C để làm điều này. Đó là câu hỏi. Bây giờ làm thế nào tôi có thể đăng ký với hệ điều hành để nó gọi xử lý của tôi trên mỗi đột quỵ quan trọng. – saplingPro

1

Chụp sự kiện thiết bị cấp thấp cần chạy mã gốc (JNI, JNA, vv) và rất hệ thống phụ thuộc vào. Trên Linux, bạn có thể sẽ không cần phải giao tiếp với hạt nhân, hầu hết có thể với X11 sever.

0

Trước tiên, bạn phải xác định một lớp quản lý, đó là một cái gì đó như:

package foo.bar 

public class SomeHookManager { 
    public static void initialize (...) { 
     // <pre-initialization-routing> 
     _native_init_(); 
     // <post-initialization-routing> 
    } 

    public static void registerCallback (IHookCallback callback) 
    { /* save this callback */ } 

    // this method will be invoked in your C code. 
    protected static void invokeCallback() { /* invoke the saved callback */ } 

    // this is a native method, the native modifier tells the compiler this method 
    // is implemented in C, and linked at runtime. 
    protected native static void _native_init_(); 
} 

Sau đó sử dụng javah để tạo ra một tiêu đề C, kết quả là một cái gì đó tương tự (Tôi không thực sự biên dịch mã này, vì vậy đây là giả thuyết):

/* 
* Class:  Win32 
* Method: _native_init_ 
* Signature:()V 
*/ 
JNIEXPORT void JNICALL Java_foo_bar_Win32_native_init_ 
    (JNIEnv * env, jobject obj); 

Tạo dự án C, bao gồm tệp này và triển khai phương pháp này. Hãy chắc chắn rằng khi móc thực tế gây ra, gọi invokeCallback trong mã C:

jclass cls = (*env)->GetObjectClass(env, obj); 
jmethodID mId = (*env)->GetStaticMethodID(env, cls, "invokeCallback", "()V"); 
if (mId == 0) { /* error handling */ } 
(*env)->CallStaticVoidMethod(env, cls, mId); 

Biên dịch dự án C vào một tập tin DLL, nói hookimpl_win32.dll, và dynamicly liên kết nó ở đâu đó trong mã Java của bạn:

static { 
    System.loadLibrary("hookimpl_win32"); // no need of .dll or .so in Unix alike OS's 
} 

Đảm bảo dll nằm trong cùng thư mục với bình của bạn. Hoặc chỉ định -Djava.library.path=/path/to/your/dlls trong VM args.

Để biết cách bạn có thể ghi lại mọi đột quỵ chính, hệ điều hành thường cung cấp một số API để bạn chặn sự kiện quan trọng. Đối với các hệ thống Windows, bạn có thể đạt được điều này bằng cách chặn các thông điệp chính toàn cầu. Tôi không có bất kỳ kinh nghiệm nào về các hệ thống khác. Dù sao, bạn có thể thiết lập các ngắt thích hợp, đó là mức độ thấp yên tĩnh. Bạn luôn có thể google câu trả lời của bạn ra ngoài. :)