2011-09-02 5 views
8

Chociaż dużo szukałem, wciąż nie jest jasne, co to jest "haczyk". Na przykład, czytałem ten post wiki answers:Co to jest "hak" i jak mogę go napisać w Javie? I jak komunikować się z jądrem, aby poznać klawisze naciskane przez użytkownika/rejestrujące się z OS

Hak jest metodą wstawienie kawałek kodu przed innym kawałek kodu, tak, że pierwszy fragment kodu wykonuje przed drugim kawałku kod, dając pierwszemu kodowi możliwość monitorowania i/lub filtrowania zachowania drugiego fragmentu kodu. Przykładem może być hak myszy, umożliwiający kodowi haczyka monitorowanie myszy przy jednoczesnym zachowaniu funkcjonalności oryginalnej procedury przetwarzania zdarzenia myszy.

Czytałem również ten post, ale nadal nie rozumiem, co to jest "hak". Czy ktoś może wyjaśnić, w laiku, co to jest "hak"? Dlaczego niektórzy piszą "hak"? Czy możliwe jest napisanie "haka" w Javie?

Uwaga:

chciałem napisać keyloggera w Javie i jeden z moich przyjaciół powiedział, że trzeba będzie napisać „hak” w C. nie można zapisać cały keyloggera w Javie (do obsługi tylko w oknach)?

EDIT

proszę dać odpowiedź w.r.t keyloggera. Jak mogę poprosić kernel o podanie informacji o klawiszu wciśniętym do mojej aplikacji za pomocą zahaczenia? Albo jak mogę zarejestrować swoją aplikację w systemie operacyjnym za pomocą JNI? Chcę, aby moja aplikacja nagrywała klawisze naciskane przez użytkownika.

+1

Myślę, że twój przyjaciel chciał powiedzieć, że musisz użyć natywnej metody. Możesz napisać natywną metodę w C i wywołać ją z poziomu Java, używając Java Native Interface (JNI). – toto2

+0

@ toto2 i co zrobi ta natywna metoda? – saplingPro

+0

To byłaby funkcja systemowa rejestrująca klucze. Właściwie lepiej jest całkowicie zrezygnować z Java do takiej pracy. Java ma być przenośna, a wadą jest to, że nie może robić rzeczy związanych z systemem operacyjnym. Nie znam Windowsa, ale prawdopodobnie C# byłby bardziej odpowiedni. – toto2

Odpowiedz

2

Chciałbym skojarzyć słowo hak z co najmniej dwóch różnych pojęć:

a) w przypadku, gdy klasa pozwala dodać detektor, który zostanie poinformowany o pewnych wydarzeniach Wzorzec Obserwator. Możesz znaleźć to w całym Swingu, Servlet API i wielu frameworkach zewnętrznych.

b) Wzór metody szablonowej. Klasa abstrakcyjna określa, jakie metody są wywoływane w jakiej kolejności, a klasa implementująca może zastąpić te metody. Przykłady tego nie są wspólne, ale widzisz je od czasu do czasu.

1

Innymi nazwami mogą być delegat lub oddzwonienie.

Przykładem tego w języku Java jest MouseListener (http://download.oracle.com/javase/tutorial/uiswing/events/mouselistener.html). MouseListener to interfejs z metodami takimi jak mouseClicked(MouseEvent e). Aby odpowiedzieć na działania myszy od użytkownika, zaimplementowałbyś MouseListener i kiedy użytkownik kliknie, biblioteka Java Swing wywoła twoją klasę detektora (po zarejestrowaniu go przez wywołanie addMouseListener.

1

Oto prosty przykład:

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 
} 

W tej uproszczonej przykład hookableMethod zapewnia sposób dla podmiotu zewnętrznego, żeby go zaczepić - czyli przekazać zewnętrznego odniesienia do obiektu i ten zewnętrzny obiekt będzie pierwszy stracony . Więc jeśli potrzebujesz jakiegoś przetwarzania, które nie jest częścią oryginalnej implementacji, możesz to zrobić, przekazując referencję, a nie łatając oryginalne źródło.

5

Od Hooking - Wikipedia,

W programowaniu komputerowym, zahaczenie Termin ten obejmuje szereg technik używane do zmiany lub rozszerzyć zachowanie systemu operacyjnego, z aplikacji lub innych składników oprogramowania przez funkcję przechwytywania połączenia lub wiadomości lub zdarzenia przekazywane między komponentami oprogramowania. Kod , który obsługuje takie przechwycone wywołania funkcji, zdarzenia lub komunikaty, jest nazywany "hakiem".

Dobrym przykładem wbudowanym w Javę będzie Runtime.addShutdownHook. Haczyk zamykający jest po prostu zainicjowanym, ale niezastrzeżonym wątkiem. Gdy maszyna wirtualna rozpocznie sekwencję zamykania, uruchomi wszystkie zarejestrowane haki wyłączające w dowolnej nieokreślonej kolejności i pozwoli im działać jednocześnie.

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

chodzi o keyloggera: tak można napisać większość z nich w języku Java, ale niewielka część będzie musiał przejść do modułu JNI, ponieważ na przykład z globalnym hak DLL/Temat/cokolwiek ją „wstrzykuje” do innych procesów ... ponieważ nie wszystkie procesy hostują JVM itd. to nie będzie działać w Javie ... w ten sposób musisz użyć JNI i trochę C, aby napisać DLL dla tej części twojego keyloggera ...

EDIT - jak na komentarz:

This article opisuje w-głębokość co zrobić globalne haki i co rozumie się przez wstrzyknięcie itp ...

+0

@ Yahia '" globalny hook DLL/wątek/cokolwiek dostaje "wstrzyknięty" do innych procesów .. "" możesz uczynić to bardziej przejrzystym i dołączyć część do swojej odpowiedzi – saplingPro

+0

@grassPro - proszę link w moim EDYCIE ... – Yahia

1

W twoim przypadku hak to mechanizm oprogramowania służący do rejestrowania detektora (handler) w systemie operacyjnym. Ten program obsługi (na przykład metoda w twojej aplikacji) zostanie powiadomiony przez system operacyjny, gdy zostanie wywołane zdarzenie kluczowe (naciśnięty klawisz).

To tylko aplikacja wzorca obserwatora.

Fikcyjny przykład:

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); 

Jak oni wam powiedziałem w innych odpowiedzi, nie ma sposobu, aby to zrobić w Javie bez polegania na jakimś kawałku rodzimych code.I zdaniem najprostszym sposobem jest do wybierz język związany z systemem, na który kierujesz reklamy. Dla Windows zrobiłbym to z C#.

Sprawdź ten link:

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

+0

i jak mogę rozmawiać z jądrem? – saplingPro

+0

Porozmawiaj z jądrem? Nie musisz. Wystarczy zarejestrować się w systemie operacyjnym, aby wywołać procedurę obsługi po każdym naciśnięciu klawisza. Na tej stronie http://en.wikipedia.org/wiki/Hooking masz przykład C# keyloggera, istnieje wiele otwartego kodu źródłowego, jak również w całej sieci. –

+0

@ Mister Smith Chcę zarejestrować moją aplikację za pomocą JNI. tj. chcę użyć Java i natywnego kodu, zwłaszcza C, aby to zrobić. Oto jest pytanie. Teraz, jak mogę zarejestrować się w systemie operacyjnym, aby wywoływał mój przewodnik po każdym naciśnięciu klawisza. – saplingPro

1

Przechwytywanie zdarzeń urządzeń niskiego poziomu potrzeby uruchomione natywnego kodu (JNI, jna, etc) i jest silnie zależny od systemu . W Linuksie prawdopodobnie nie będziesz musiał komunikować się z jądrem, najprawdopodobniej z serwerem X11.

0

Najpierw trzeba zdefiniować klasy menedżera, że ​​jest coś takiego jak:

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_(); 
} 

Następnie użyj javah wygenerować nagłówek C, wynik jest coś (I faktycznie nie skompilować ten kod, więc jest to hipotetyczna):

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

Tworzenie projektu C, to ten plik i wdrożenie tej metody. Upewnić się, gdy rzeczywista hak wyzwalane, zadzwoń invokeCallback w kodzie 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); 

skompilować projekt C do pliku DLL, powiedzmy hookimpl_win32.dll i dynamicznie połączyć go gdzieś w kodzie Java:

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

Upewnij się, że biblioteka DLL znajduje się w tym samym folderze co twój jar. Lub podaj -Djava.library.path=/path/to/your/dlls w argach VM.

Jeśli chodzi o sposób rejestrowania każdego naciśnięcia klawisza, system operacyjny zazwyczaj udostępnia niektóre interfejsy API do przechwytywania kluczowych zdarzeń. W przypadku systemów Windows można to osiągnąć przechwytując komunikaty o kluczach globalnych. Nie mam żadnych doświadczeń w innych systemach. W każdym razie możesz ustawić odpowiednie przerwania, czyli cichy niski poziom. Zawsze możesz znaleźć odpowiedź w Google. :)

Powiązane problemy