프로그래밍에서 "후크"라는 용어는 무엇을 의미합니까?


248

나는 최근에 어떤 사람들에게 내가 쓰고있는 프로그램에 관해 이야기하면서 "후크"라는 용어를 들었다. 대화에서 후크가 일종의 기능이라는 것을 유추했지만이 용어가 무엇을 의미하는지는 잘 모르겠습니다. 정의를 검색했지만 좋은 답변을 찾지 못했습니다. 누군가이 용어가 일반적으로 무엇을 의미하는지, 그리고 그 정의를 설명하기위한 작은 예를 알려줄 수 있습니까?


3
Hooking @ Wikipedia를 참조하십시오 . 링크는 투표율이 낮은 답변 중 하나에 묻 힙니다.
Palec

답변:


143

본질적으로 이것은 코드를 사용하여 다른 동작을 제공하거나 어떤 일이 발생할 때 반응하도록 모듈을 활용할 수 있습니다.


7
콜백과 비슷합니까?
Chris

19
후크는 종종 콜백 함수를 사용하지만 항상 그런 것은 아닙니다. 예를 들어, "hookEvent (Events.STARTUP, myCallbackFunction)"을 사용하여 이벤트 시스템을 후크 할 수 있습니다. 함수 포인터를 hookEvent 함수에 전달하므로 이벤트 발생시 호출 할 함수를 알고 있습니다. 희망 도움 :-)
William Brendel

6
바로 그거죠. 콜백은 후크의 "유형"입니다.
Micah

21
음 .. 아니야. 콜백은 콜백이며 후크와 관련이 없으며 콜백은 단순히 후크 방법의 구현에 사용됩니다. 콜백은 함수 / 메소드 / 프로 시저 (CALL)에 대한 포인터 (RELJMP)이며 후크는 실행중인 응용 프로그램에 대한 수정입니다.
specializt

1
@SahilBabbar No. 인터럽트는 특정 장소 (인터럽트)의 명령이 실행되도록합니다. 예를 들어 인터럽트 처리기의 위치를 ​​나열하는 테이블을 수정하여 코드가 인터럽트시 먼저 호출되도록 코드를 인터럽트 처리 프로세스에 연결할 수 있습니다. 데이지 체인 방식)
David Tonhofer

77

후크는 해당 소프트웨어 사용자가 특정 상황에서 호출 한 고유 코드를 갖도록 소프트웨어가 제공하는 기능입니다. 이 코드는 현재 코드를 확장하거나 대체 할 수 있습니다.

예전에는 컴퓨터가 실제로 개인용이고 바이러스가 널리 보급되지 않았던 시절 ('80 년대 이야기), 운영 체제 소프트웨어 자체를 패치하여 코드를 호출하는 것만 큼 간단했습니다. Apple II에서 Applesoft BASIC 언어의 확장을 작성하여 회선이 처리되기 전에 코드를 호출하여 내 코드를 BASIC 인터프리터에 간단히 연결 한 것을 기억합니다.

일부 컴퓨터에는 미리 디자인 된 후크가 있었는데, 그 예로 Apple II의 I / O 스트림이 있습니다. 이러한 후크를 사용하여 전체 디스크 하위 시스템을 주입했습니다 (Apple II ROM은 원래 카세트가 PC의 기본 저장 매체였던 시절에 만들어졌습니다). ASCII 코드 4 ( ) 다음에 실행하려는 명령 다음에 a 를 인쇄 하여 디스크를 제어했으며 디스크 하위 시스템이이를 가로 채서 Apple ROM 인쇄 루틴에 연결했습니다.CTRL-DCR

예를 들어 라인은 다음과 같습니다.

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

디스크 내용을 나열한 다음 머신을 다시 초기화하십시오. 이를 통해 첫 번째 줄을 다음과 같이 설정하여 BASIC 프로그램을 보호하는 것과 같은 트릭을 얻을 수있었습니다.

123 REM XIN#6

그런 다음를 사용하여 위치에 문자 POKE를 삽입하십시오 . 그런 다음 소스 목록을 작성하려는 사람은 디스크 하위 시스템이이를 감지하는 출력 루틴을 통해 다시 초기화 시퀀스를 보냅니다.CTRL-DX

그것은 종종 우리가 원하는 행동을 얻기 위해 의지해야 할 속임수입니다.

요즘 운영 체제가 더 안전 해지면 운영 체제를 더 이상 "기내"또는 디스크에서 수정하지 않아도되므로 후크 자체를위한 기능을 제공합니다.

그들은 다닌 시간입니다. 메인 프레임에는 출구가 있으며 많은 메인 프레임 소프트웨어가 현재 이러한 기능을 사용합니다. 예를 들어, z / OS와 함께 제공되는 무료 소스 코드 제어 시스템 (SCLM이라고 함)을 사용하면 종료에 사용자 고유의 코드를 배치하여 보안 서브 시스템을 완전히 대체 할 수 있습니다.


41

일반적으로 "후크"는 프로그래머, 시스템, 프로그램에서 이미 진행중인 작업을 보거나 상호 작용 및 / 또는 변경할 수있는 기능입니다.

예를 들어 Drupal CMS는 개발자에게 "컨텐츠 노드"가 생성 된 후 추가 조치를 취할 수있는 후크를 제공합니다. 개발자가 후크를 구현하지 않으면 노드가 정상마다 작성됩니다. 개발자가 후크를 구현하면 노드를 만들 때마다 추가 코드를 실행할 수 있습니다. 이 코드는 롤백 및 / 또는 원래 작업 변경을 포함하여 모든 작업을 수행 할 수 있습니다. 또한 노드 생성과 관련이없는 작업을 수행 할 수도 있습니다.

콜백은 특정 종류의 후크로 생각할 수 있습니다. 콜백 기능을 시스템에 구현하면 해당 시스템에서 작업이 완료된 후 추가 코드를 호출 할 수 있습니다. 그러나 후킹 (일반적인 용어)은 콜백에만 국한되지 않습니다.

다른 예시. 때때로 웹 개발자는 요소의 클래스 이름 및 / 또는 ID를 후크라고합니다. ID / 클래스 이름을 요소에 배치하면 Javascript를 사용하여 해당 요소를 수정하거나 페이지 문서에 "연결"할 수 있기 때문입니다. (이것은 의미를 확장하고 있지만 일반적으로 사용되며 언급 할 가치가 있습니다)


"페이지 문서에 연결"이란 무슨 뜻입니까? 예를 들어 주시겠습니까? 첫 번째 예제를 이해했습니다 .html 요소에 id를 지정하면 javacript를 사용하여 요소를 수정할 수 있습니다.
committedandroider

21

간단한 말 :

후크는 기존 코드 이전, 이후 또는 대신 사용자 지정 코드 (기능)를 실행하는 수단입니다. 예를 들어, 정상적인 로그인 프로세스를 계속하기 전에 Captcha 함수를 실행하기 위해 로그인 프로세스에 "후크"하도록 함수를 작성할 수 있습니다.


최고의 답변 imo
Daniel

15

프로그래밍에서의 후킹 은 이벤트 핸들러로서 프로 시저 체인을 만들기 위해 소위 후크를 사용하는 기술입니다.


15

후크는 기본 코드가 확장 코드를 호출 할 수 있도록하는 기능 범주입니다. 이는 핵심 개발자가 코드를 노출하지 않고 확장 성을 제공하려는 경우에 유용 할 수 있습니다.

후크의 한 가지 사용법은 비디오 게임 모드 개발에 있습니다. 게임은 모드 개발자가 기본 기능을 확장 할 수는 없지만 핵심 모드 라이브러리 개발자가 후크를 추가 할 수 있습니다. 이러한 후크를 통해 독립 개발자는 게임로드, 인벤토리 업데이트, 엔터티 상호 작용 등과 같은 원하는 이벤트를 호출하는 사용자 지정 코드를 가질 수 있습니다.

일반적인 구현 방법은 함수에 빈 콜백 목록을 제공 한 다음 콜백 목록을 확장하는 기능을 제공하는 것입니다. 기본 코드는 항상 동일하고 적절한 시간에 함수를 호출하지만 콜백 목록이 비어 있으면 함수가 수행하지 않습니다. 이것은 의도적으로 설계된 동작입니다.

그러면 타사는 추가 코드를 작성하고 새 콜백을 후크의 콜백 목록에 추가 할 수 있습니다. 사용 가능한 후크를 참조 할뿐 아니라 기본 시스템에 대한 위험을 최소화하면서 기능을 확장했습니다.

후크를 사용하면 개발자가 다른 구조 및 인터페이스로는 수행 할 수없는 작업을 수행 할 수 없습니다. 작업 및 사용자 (타사 개발자)를 고려하여 선택합니다.

설명을 위해 : 후크는 확장을 허용하며 콜백을 사용하여 구현 될 수 있습니다. 콜백은 일반적으로 함수 포인터에 지나지 않습니다. 함수의 계산 된 주소 다른 답변 / 의견에 혼란이있는 것으로 보입니다.


4

후크는 코드에서 특정 유형의 이벤트를 전달하는 위치를 나타내며,이 이벤트가 콜백 할 적절한 함수로 이전에 등록 된 경우이 등록 된 함수에 의해 처리되며 그렇지 않으면 아무 일도 발생하지 않습니다.


2

일부 조건이 발생하면 후크를 실행할 수 있습니다. 예를 들어 일부 변수 변경 또는 일부 조치가 호출되거나 일부 이벤트가 발생합니다. 후크는 프로세스에 들어가서 사물을 변경하거나 변화에 반응 할 수 있습니다.


1

종종 후킹은 Win32 메시지 후킹 또는 Linux / OSX 동등 항목을 의미하지만,보다 일반적으로 후킹은 지정된 동작이 발생할 때 알림을 받도록 다른 객체 / 창 / 프로그램 등을 단순히 알리는 것입니다. 예를 들어 : 시스템의 모든 창을 닫으려고 할 때 알립니다.

일반적으로 후킹은 시스템에 어떤 영향을 미치는지 이해하지 못하기 때문에 다소 위험하므로 불안정하거나 예기치 않은 동작을 초래할 수 있습니다. 또한 특정 상황에서 매우 유용 할 수 있습니다. 예를 들어 : FRAPS 는이를 사용하여 FPS 카운터를 표시 할 창을 결정합니다.


1

후크 체인은 각 함수가 다음 함수를 호출하는 함수 세트입니다. 후크 체인에서 중요한 것은 프로그래머가 런타임에 체인에 다른 기능을 추가 할 수 있다는 것입니다. 이를 수행하는 한 가지 방법은 체인에서 첫 번째 기능의 주소가 유지되는 알려진 위치를 찾는 것입니다. 그런 다음 해당 함수 포인터의 값을 저장하고 후크 체인에 삽입하려는 함수의 주소로 초기 주소의 값을 덮어 씁니다. 그런 다음 함수가 호출되고 비즈니스가 수행되며 체인에서 다음 함수를 호출합니다 (달리 결정하지 않는 한). 당연히 직접 작성에서 메모리에 이르기까지 Ruby 또는 Python과 같은 언어의 메타 프로그래밍 기능을 사용하는 것까지 후크 체인을 작성하는 여러 가지 방법이 있습니다.

후크 체인의 예는 MS Windows 응용 프로그램이 메시지를 처리하는 방식입니다. 처리 체인의 각 함수는 메시지를 처리하거나 체인의 다음 함수로 보냅니다.


1

Drupal 컨텐츠 관리 시스템에서 '후크'는 비교적 구체적인 의미를 갖습니다. 컨텐츠 작성 또는 사용자 로그인과 같은 내부 이벤트가 발생하면 모듈은 특수한 "후크"기능을 구현하여 이벤트에 응답 할 수 있습니다. 예를 들어, 사용자 로그인 이벤트의 이름 지정 규칙 ([your-plugin-name] _user_login ())을 통해 수행됩니다.

이 규칙으로 인해 기본 이벤트는 "후크"라고하며 Drupal의 API 설명서에서 "hook_user_login"및 "hook_user_authenticate ()"와 같은 이름으로 나타납니다.


이것은 "일어 났을 때 반응하는" "콜백"의 위에서 언급 아이디어를 따릅니다 . 이 경우 콜백은 명시 적으로 등록 된 것이 아니라 "마법 이름 지정"을 기반으로합니다. 이것은 drupal.org에서 현재 논의되고 있습니다. 이벤트 훅에 Symfony EventDispatcher 사용
donquixote

일반화하기 위해, 후크 / 콜백 / 리스너는 여러 가지 방식으로 "호출 코드에 알려질 수 있습니다"(완전한 말은 아님) : 1. 매직 명명 함수 2. 매직 명명 클래스 3. 명시 적으로 등록 된 함수 4. 명시 적으로 등록 된 객체 (리스너, 가입자, 옵저버) 5. 후크가 발생하기 전에 인스턴스화 할 명시 적으로 등록 된 클래스 이름 (+ 선택적 생성자 인수). 6. 호출 코드를 수정함으로써
donquixote

1

간단히 말하면, 당신이 MessageBox편집 한 다른 기능을 수행하는 위치 와 같은 API 호출 코드를 변경할 수 있습니다 (전 세계적으로 시스템 전체에서 작동하고 로컬에서 프로세스 전체에서 작동 함).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.