Co oznacza termin „hak” w programowaniu?


248

Niedawno usłyszałem termin „hak” podczas rozmowy z niektórymi ludźmi na temat programu, który piszę. Nie jestem pewien, co dokładnie oznacza ten termin, chociaż z rozmowy wywnioskowałem, że hak jest rodzajem funkcji. Szukałem definicji, ale nie mogłem znaleźć dobrej odpowiedzi. Czy ktoś byłby w stanie dać mi wyobrażenie o tym, co ogólnie oznacza ten termin i być może mały przykład ilustrujący definicję?


3
Zobacz Hooking @ Wikipedia . Link jest ukryty w jednej z niżej głosowanych odpowiedzi.
Palec

Odpowiedzi:


143

Zasadniczo jest to miejsce w kodzie, które pozwala podłączyć się do modułu, aby zapewnić inne zachowanie lub zareagować, gdy coś się wydarzy.


7
Czy to jest podobne do oddzwaniania?
Chris

19
Haki często (ale nie zawsze) używają funkcji zwrotnych. Na przykład możesz podłączyć system zdarzeń za pomocą „hookEvent (Events.STARTUP, myCallbackFunction)”. Przekazujesz wskaźnik funkcji do funkcji hookEvent, dzięki czemu wie ona, jaką funkcję wywołać po wystąpieniu zdarzenia. Mam nadzieję, że to pomoże :-)
William Brendel

6
dokładnie. Oddzwonienie to „typ” haka.
Micheasza

21
yyy ... nie. Oddzwanianie jest oddzwanianiem i nie ma nic wspólnego z haczykami, oddzwanianie jest po prostu WYKORZYSTYWANE do WDROŻENIA metod haczyków. Oddzwanianie to wskaźniki (RELJMP) do funkcji / metod / procedur (CALL), zaczepy to modyfikacje działających aplikacji.
specializt

1
@SahilBabbar Nie. Przerwanie powoduje wykonanie instrukcji w określonym miejscu (przerwaniu). Możesz być w stanie podłączyć się do procesu obsługi przerwań, na przykład modyfikując tabelę z listą lokalizacji programów obsługi przerwań, aby twój kod był wywoływany jako pierwszy przy przerwie (a następnie twój kod wywoływałby poprzednio obecny kod obsługi przerwań, w sposób łańcuchowy)
David Tonhofer

77

Hak to funkcjonalność zapewniana przez oprogramowanie dla użytkowników tego oprogramowania w celu wywołania własnego kodu w określonych okolicznościach. Ten kod może rozszerzyć lub zastąpić obecny kod.

W dawnych czasach, gdy komputery były naprawdę osobiste, a wirusy były mniej rozpowszechnione (mówię o latach 80.), wystarczyło załatać oprogramowanie systemu operacyjnego, aby wywołać twój kod. Pamiętam, jak napisałem rozszerzenie do języka Applesoft BASIC na Apple II, które po prostu podłączyło mój kod do interpretera BASIC, wstrzykując wywołanie do mojego kodu przed przetworzeniem dowolnego wiersza.

Niektóre komputery miały wstępnie zaprojektowane zaczepy, jednym z przykładów jest strumień we / wy w Apple II. Użył takiego haka do wstrzyknięcia całego podsystemu dyskowego (ROMy Apple II ROM zostały pierwotnie zbudowane w czasach, w których kasety były podstawowym nośnikiem pamięci dla komputerów PC). Kontrolowałeś dyski, drukując kod ASCII 4 ( CTRL-D), a następnie polecenie, które chcesz wykonać, a następnie a CR, i został on przechwycony przez podsystem dyskowy, który podłączył się do procedur drukowania Apple ROM.

Na przykład linie:

PRINT CHR(4);"CATALOG"
PRINT CHR(4);"IN#6"

wyświetli zawartość dysku, a następnie ponownie zainicjuje maszynę. Pozwoliło to na takie sztuczki, jak ochrona programów BASIC poprzez ustawienie pierwszego wiersza jako:

123 REM XIN#6

następnie używając, POKEaby wstawić CTRL-Dznak tam, gdzie Xbył. Następnie każdy, kto spróbuje podać źródło, wyśle ​​sekwencję ponownej inicjalizacji poprzez procedury wyjściowe, w których podsystem dyskowy ją wykryje.

Jest to często rodzaj oszustwa, do którego musimy się zastosować, aby uzyskać pożądane zachowanie.

W dzisiejszych czasach, z bardziej bezpiecznym systemem operacyjnym, zapewnia on możliwości haków, ponieważ nie należy już modyfikować systemu operacyjnego „w locie” ani na dysku.

Byli już od dłuższego czasu. Miały je komputery mainframe (zwane wyjściami), a duża część oprogramowania mainframe korzysta z tych udogodnień nawet teraz. Na przykład darmowy system kontroli kodu źródłowego dostarczany z systemem z / OS (zwany SCLM) pozwala całkowicie zastąpić podsystem bezpieczeństwa, po prostu umieszczając własny kod w wyjściu.


41

W ogólnym ujęciu „hak” to coś, co pozwala programistowi przeglądać i / lub wchodzić w interakcje i / lub zmieniać coś, co już dzieje się w systemie / programie.

Na przykład Drupal CMS zapewnia programistom zaczepy, które pozwalają im podjąć dodatkowe działania po utworzeniu „węzła treści”. Jeśli programista nie wdroży haka, węzeł jest tworzony zgodnie z normalnym. Jeśli programista wdroży hak, może uruchomić jakiś dodatkowy kod przy każdym utworzeniu węzła. Ten kod może zrobić wszystko, w tym wycofać i / lub zmienić oryginalne działanie. Może również zrobić coś zupełnie niezwiązanego z tworzeniem węzła.

Oddzwonienie można uznać za specyficzny rodzaj haka. Wdrażając funkcję oddzwaniania w systemie, system ten pozwala na wywołanie dodatkowego kodu po zakończeniu akcji. Jednak przechwytywanie (jako ogólny termin) nie ogranicza się do wywołań zwrotnych.

Inny przykład. Czasami programiści będą odnosić się do nazw klas i / lub identyfikatorów elementów jako haczyków. Dzieje się tak, ponieważ umieszczając identyfikator / nazwę klasy na elemencie, mogą następnie użyć Javascript do modyfikacji tego elementu lub „zaczepić się” w dokumencie strony. (to rozszerza znaczenie, ale jest powszechnie używane i warte wspomnienia)


Co rozumiesz przez „dołącz do dokumentu strony”? Czy możesz podać przykład? Zrozumiałem pierwszy przykład - nadanie elementowi HTML identyfikatora, abyś mógł użyć javacript do modyfikacji elementu.
zaangażowanieandroider

21

Simple powiedział:

Hak to sposób wykonania niestandardowego kodu (funkcji) przed, po lub zamiast istniejącego kodu. Na przykład można napisać funkcję „zaczepiającą” się w procesie logowania w celu wykonania funkcji Captcha przed kontynuowaniem normalnego procesu logowania.


Najlepsza odpowiedź imo
Daniel

15

Przechwytywanie w programowaniu jest techniką wykorzystującą tak zwane haki do tworzenia łańcucha procedur jako procedury obsługi zdarzeń.


15

Haki to kategoria funkcji, która umożliwia kodowi bazowemu wywoływanie kodu rozszerzenia. Może to być przydatne w sytuacjach, w których główny programista chce zaoferować rozszerzalność bez ujawniania swojego kodu.

Jednym z zastosowań hooków jest rozwój modów gier wideo. Gra może nie zezwalać twórcom modów na rozszerzanie podstawowej funkcjonalności, ale haczyki mogą być dodawane przez twórców podstawowych bibliotek modów. Dzięki tym haczykom niezależni programiści mogą wywoływać niestandardowy kod dowolnego pożądanego zdarzenia, takiego jak ładowanie gry, aktualizacje ekwipunku, interakcje jednostek itp.

Częstą metodą implementacji jest nadanie funkcji pustej listy wywołań zwrotnych, a następnie udostępnienie możliwości rozszerzenia listy wywołań zwrotnych. Kod podstawowy zawsze wywołuje funkcję w tym samym czasie i we właściwym czasie, ale przy pustej liście wywołań zwrotnych funkcja nic nie robi. To jest z założenia.

Osoba trzecia ma zatem możliwość napisania dodatkowego kodu i dodania nowego połączenia zwrotnego do listy połączeń zwrotnych haka. Posiadając jedynie odniesienie do dostępnych haczyków, mają one rozszerzoną funkcjonalność przy minimalnym ryzyku dla systemu podstawowego.

Haki nie pozwalają programistom robić niczego, czego nie można zrobić z innymi strukturami i interfejsami. Można je wybrać z uwzględnieniem zadania i użytkowników (niezależni programiści).

Dla wyjaśnienia: hak pozwala na przedłużenie i może być zaimplementowany za pomocą wywołań zwrotnych. Oddzwanianie to na ogół tylko wskaźnik funkcji; obliczony adres funkcji. Wydaje się, że istnieją pomieszania w innych odpowiedziach / komentarzach.


4

Hak oznacza miejsce w kodzie, w którym wywołujesz zdarzenie określonego typu, a jeśli to zdarzenie zostało wcześniej zarejestrowane z odpowiednią funkcją do oddzwonienia, wówczas byłoby obsługiwane przez tę zarejestrowaną funkcję, w przeciwnym razie nic się nie stanie.


2

haki można wykonać, gdy wystąpi jakiś warunek. np. niektóre zmiany zmiennych lub jakieś działanie jest wywoływane lub zdarza się jakieś zdarzenie. haki mogą wchodzić w proces i zmieniać rzeczy lub reagować na zmiany.


1

Często przechwytywanie odnosi się do przechwytywania komunikatów Win32 lub odpowiedników Linux / OSX, ale bardziej ogólnie zaczepianie to po prostu powiadamianie innego obiektu / okna / programu / itp., Że chcesz zostać powiadomiony, gdy nastąpi określone działanie. Na przykład: posiadanie wszystkich okien w systemie powiadamia o zbliżającym się zamknięciu.

Zasadniczo zaczepianie jest nieco niebezpieczne, ponieważ wykonywanie go bez zrozumienia, jak wpływa na system, może prowadzić do niestabilności lub bardzo nieoczekiwanego zachowania. Pomysł może być BARDZO przydatny w pewnych okolicznościach. Na przykład: FRAPS używa go do określania, w których oknach powinien pokazywać licznik FPS.


1

Łańcuch haków to zestaw funkcji, w których każda funkcja wywołuje następną. Istotne w łańcuchu haków jest to, że programista może dodać kolejną funkcję do łańcucha w czasie wykonywania. Jednym ze sposobów na to jest poszukiwanie znanej lokalizacji, w której przechowywany jest adres pierwszej funkcji w łańcuchu. Następnie zapisujesz wartość tego wskaźnika funkcji i zastępujesz wartość pod adresem początkowym adresem funkcji, którą chcesz wstawić do łańcucha zaczepu. Następnie funkcja jest wywoływana, wykonuje swoją działalność i wywołuje następną funkcję w łańcuchu (chyba że zdecydujesz inaczej). Oczywiście istnieje wiele innych sposobów tworzenia łańcucha haczyków, od pisania bezpośrednio do pamięci po korzystanie z funkcji metaprogramowania w językach takich jak Ruby lub Python.

Przykładem łańcucha haków jest sposób, w jaki aplikacja MS Windows przetwarza wiadomości. Każda funkcja w łańcuchu przetwarzania albo przetwarza wiadomość lub wysyła ją do następnej funkcji w łańcuchu.


1

W systemie zarządzania treścią Drupal „hook” ma względnie konkretne znaczenie. Gdy wystąpi zdarzenie wewnętrzne (na przykład tworzenie treści lub logowanie użytkownika), moduły mogą reagować na zdarzenie, implementując specjalną funkcję „przechwytywania”. Odbywa się to za pomocą konwencji nazewnictwa - na przykład [nazwa wtyczki] _user_login () dla zdarzenia logowania użytkownika.

Z powodu tej konwencji zdarzenia bazowe są nazywane „hakami” i występują w nazwach takich jak „hook_user_login” i „hook_user_authenticate ()” w dokumentacji API Drupala.


Jest to zgodne z wyżej wspomnianą ideą „oddzwaniania”, aby reagować, gdy coś się wydarzy ”. W takim przypadku wywołanie zwrotne nie jest jawnie rejestrowane, ale oparte na „magicznym nazywaniu”. Jest to obecnie omawiane na stronie drupal.org, patrz Korzystanie z Symfony EventDispatcher do przechwytywania zdarzeń
donquixote

Aby uogólnić, hook / callback / listener można „poznać kod wywołujący” na różne sposoby (nie mówiąc, że jest to kompletne): 1. funkcje o magicznej nazwie 2. klasy o magicznej nazwie 3. jawnie zarejestrowane funkcje 4. jawnie zarejestrowane zarejestrowane obiekty (nasłuchiwacze, subskrybenci, obserwatorzy) 5. jawnie zarejestrowane nazwy klas (+ opcjonalne argumenty konstruktora), które mają zostać utworzone przed uruchomieniem haka. 6. modyfikując kod wywołujący
donquixote

1

Krótko mówiąc, możesz zmienić kod wywołania API, na przykład, MessageBoxgdzie wykonuje inną funkcję edytowaną przez ciebie (globalnie będzie działać w całym systemie, lokalnie w całym procesie).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.