후킹
Hooking컴퓨터 프로그래밍에서 후크라는 용어는 소프트웨어 컴포넌트 간에 전달되는 함수 호출, 메시지 또는 이벤트를 가로채는 것으로 운영체제, 응용 프로그램 또는 다른 소프트웨어 컴포넌트의 동작을 변경하거나 증가시키기 위해 사용되는 다양한 기술을 포함한다.이러한 대행 수신된 함수 호출, 이벤트 또는 메시지를 처리하는 코드를 후크라고 합니다.
후킹은 디버깅 및 기능 확장을 포함한 다양한 목적으로 사용됩니다.예를 들어 키보드 또는 마우스이벤트 메시지가 응용 프로그램에 도달하기 전에 대행 수신하거나 운영체제콜을 대행 수신하여 동작을 감시하거나 응용 프로그램 또는 기타 컴포넌트의 기능을 변경하는 경우가 있습니다.또한 후크를 통해 출력과 입력을 수행하는 3D 게임에서의 프레임 속도 측정과 같은 벤치마크 프로그램에서도 널리 사용됩니다.
후킹은 악성코드에 의해 사용될 수도 있습니다.예를 들어, rootkits는 API 호출의 출력을 조작함으로써 자신을 투명하게 만들려고 하는 소프트웨어이며, 그렇지 않으면 자신의 존재를 드러낼 수 있는 후크 기술을 사용하는 경우가 많습니다.
방법들
일반적으로 후크는 소프트웨어가 이미 실행 중일 때 삽입되지만 후크는 응용 프로그램을 시작하기 전에 사용할 수 있는 전술입니다.이 두 가지 기술에 대해 아래에서 자세히 설명합니다.
소스 수정
후크는 응용 프로그램이 실행되기 전에 리버스 엔지니어링 기술을 통해 실행 파일 또는 라이브러리의 소스를 수정함으로써 달성할 수 있습니다.이것은 일반적으로 함수 호출을 대행 수신하여 완전히 모니터링하거나 대체하기 위해 사용됩니다.
예를 들어 디스어셈블러를 사용함으로써 모듈 내 함수의 진입점을 찾을 수 있다.그런 다음 다른 라이브러리 모듈을 동적으로 로드하고 로드된 라이브러리 내에서 원하는 메서드를 실행하도록 변경할 수 있습니다.적용 가능한 경우 후크를 달성할 수 있는 또 다른 관련 접근법은 실행 파일의 Import 테이블을 변경하는 것입니다.이 테이블은 추가 라이브러리 모듈을 로드하도록 수정하거나 함수가 응용 프로그램에 의해 호출될 때 호출되는 외부 코드를 변경할 수 있습니다.
함수 후크를 실현하는 대체 방법은 래퍼 라이브러리를 통해 함수 호출을 대행 수신하는 것입니다.래퍼는 응용 프로그램이 로드하는 라이브러리의 버전으로, 원래 라이브러리와 동일한 기능을 모두 사용하여 대체됩니다.즉, 액세스 가능한 모든 기능은 원래 기능과 대체 기능 간에 기본적으로 동일합니다.이 래퍼 라이브러리는 원래 라이브러리에서 모든 기능을 호출하거나 완전히 새로운 논리 세트로 대체하도록 설계할 수 있습니다.
런타임 수정
운영 체제와 소프트웨어는 런타임에 이벤트 후크를 쉽게 삽입할 수 있는 수단을 제공할 수 있습니다.후크를 삽입할 수 있는 충분한 권한이 있는 경우 사용할 수 있습니다.예를 들어 Microsoft Windows에서는 대화상자, 스크롤바, 메뉴 및 기타 항목에 대한 시스템이벤트 및 응용 프로그램이벤트 처리 또는 수정에 사용할 수 있는 후크를 삽입할 수 있습니다.또한 후크는 키보드와 마우스 이벤트를 삽입, 삭제, 처리 또는 수정할 수 있습니다.Linux는 NetFilter를 통해 커널 내의 네트워크 이벤트를 처리하는 것과 유사한 방법으로 후크를 사용할 수 있는 또 다른 예를 제공합니다.
이러한 기능이 제공되지 않는 경우, 특수한 형식의 후크는 프로세스에 의해 실행되는 라이브러리 함수 호출을 대행 수신합니다.함수 후크는 주입된 코드로 점프하도록 타깃 함수의 첫 번째 몇 개의 코드 명령을 변경함으로써 구현된다.또는 공유 라이브러리 개념을 사용하는 시스템에서 인터럽트 벡터 테이블 또는 Import 기술자 테이블을 메모리로 변경할 수 있다.기본적으로 이러한 전술은 소스 수정과 동일한 아이디어를 사용하지만 프로세스가 이미 실행되면 프로세스의 메모리에 있는 명령 및 구조를 변경합니다.
샘플코드
가상 메서드 테이블 후크
클래스가 가상 함수(또는 메서드)를 정의/상속할 때마다 컴파일러는 숨겨진 멤버 변수를 가상 메서드 테이블(VMT 또는 Vtable)을 가리키는 클래스에 추가합니다.대부분의 컴파일러는 숨겨진 VMT 포인터를 클래스의 모든 인스턴스의 처음 4바이트에 배치합니다.VMT는 기본적으로 클래스의 인스턴스가 호출할 수 있는 모든 가상 함수에 대한 포인터의 배열입니다.실행 시 이러한 포인터는 올바른 함수를 가리키도록 설정됩니다. 왜냐하면 컴파일 시에는 기본 함수를 호출할지 또는 파생 클래스에서 오버라이드된 함수를 호출할지(다형성을 허용함) 아직 알 수 없기 때문입니다.따라서 가상 기능에 대한 포인터를 VMT 내에서 대체함으로써 가상 기능을 잠글 수 있습니다.다음 코드는 C++[1]로 작성된 Microsoft Windows의 일반적인 VMT 훅의 예를 보여 줍니다.
#실패하다 <iostream> #실패하다 "창문이요.h" 사용. 네임스페이스 표준; 학급 가상 클래스 { 일반의: 인트 번호; 가상 무효 Virtual Fn1() //이것은 잠기는 가상 함수입니다. { 외치다 << > "VirtualFn1이 호출되었습니다. << > 번호++ << > "\n\n"; } }; 사용. VirtualFn1_t = 무효(__이 콜*)(무효* thisptr); VirtualFn1_t orig_VirtualFn1; 무효 __Fastcall hkVirtualFn1(무효* thisptr, 인트 엣지) //이 함수는 후크가 완료된 후 원래 VirtualFn1 함수가 아닌 프로그램이 호출하도록 하는 후크 함수입니다. { 외치다 << > "호크 함수가 호출됨" << > "\n"; orig_VirtualFn1(thisptr); //원래 함수를 호출합니다. } 인트 주된() { 가상 클래스* myClass = 신규 가상 클래스(); //동적으로 할당된 Virtual Class 인스턴스에 대한 포인터를 만듭니다. 무효** vTablePtr = *재해석_캐스트< >무효***>(myClass); //VirtualClass의 VMT 기반(그 후 VirtualFn1을 가리킴)을 가리키는 주소를 찾아 vTablePtr에 저장합니다. DWORD 오래된 보호; 가상 보호(vTablePtr, 4, 페이지_EXECUTE_READWRITE, &오래된 보호); //VMT 시작 시 첫 번째 포인터를 덮어쓸 수 있도록 페이지 보호를 해제합니다. orig_VirtualFn1 = 재해석_캐스트< >VirtualFn1_t>(*vTablePtr); //VMT에서 VirtualFn1로의 포인터를 글로벌 변수에 저장하여 VMT 내의 엔트리가 종료된 후 나중에 다시 액세스할 수 있도록 합니다. //후크 기능으로 덮어씁니다. *vTablePtr = &hkVirtualFn1; //가상 테이블 내의 VirtualFn1에 대한 포인터를 훅 함수(hkVirtualFn1)에 대한 포인터에 덮어씁니다. 가상 보호(vTablePtr, 4, 오래된 보호, 0); //이전 페이지 보호를 복원합니다. myClass->Virtual Fn1(); //클래스 인스턴스에서 가상 함수를 호출합니다.현재는 후크되어 있기 때문에 실제로는 후크 함수(hkVirtualFn1)를 호출합니다. myClass->Virtual Fn1(); myClass->Virtual Fn1(); 삭제하다 myClass; 돌아가다 0; } 모든 가상 함수는 클래스 멤버 함수여야 하며 모든 (비정적) 클래스 멤버 함수는 __thiscall 호출 규약을 사용하여 호출됩니다(멤버 함수가 변수 수의 인수를 사용하는 경우 __cdecl을 사용하여 호출되지 않는 한).__thiscall 호출 규약은 (x86 아키텍처의) ECX 레지스터를 통해 발신 클래스인스턴스(통상은 '이' 포인터라고 불립니다)에 포인터를 전달합니다.따라서 후크 함수가 전달된 "this" 포인터를 적절히 대행 수신하여 인수로 받아들이려면 ECX 레지스터를 조사해야 합니다.위의 예에서는 __fastcall 호출 규칙을 사용하도록 후크 함수(hkVirtualFn1)를 설정하면 후크 함수가 인수 중 하나의 ECX 레지스터를 조사합니다.
또한 위의 예에서는 후크 함수(hkVirtualFn1)는 멤버 함수 자체가 아니기 때문에 __thiscall 호출 규칙을 사용할 수 없습니다.대신 __fastcall을 사용해야 합니다.이는 인수의 ECX 레지스터를 조사하는 유일한 콜링 규칙이기 때문입니다.
C# 키보드 이벤트 훅
다음의 예에서는, Microsoft 를 사용해 Microsoft Windows 의 키보드이벤트에 접속합니다.NET 프레임워크
사용. System.실행시간상호 운용 서비스; 네임스페이스 훅; 일반의 학급 키 훅 { /* 멤버 변수 */ 보호되고 있다 정적인 인트 후크; 보호되고 있다 정적인 Low Level Keyboard 위임 위임.; 보호되고 있다 정적인 읽기 전용 물건 잠그다 = 신규 물건(); 보호되고 있다 정적인 부울 IsRegistered(등록 완료) = 거짓의; /* DLL Import */ [Dll Import('user32')] 사적인 정적인 외부 인트 Windows 설정후크익스(인트 id Hook, Low Level Keyboard 위임 lpfn, 인트 hmod, 인트 dw Thread Id); [Dll Import('user32')] 사적인 정적인 외부 인트 CallNextHook예(인트 후크, 인트 n코드, 인트 패램, KBDLL 훅 구조 파라암); [Dll Import('user32')] 사적인 정적인 외부 인트 Windows 연결 해제후크익스(인트 후크); /* 유형 & 상수 */ 보호되고 있다 위임하다 인트 Low Level Keyboard 위임(인트 n코드, 인트 패램, 레퍼런스 KBDLL 훅 구조 파라암); 사적인 컨스턴트 인트 HC_액션 = 0; 사적인 컨스턴트 인트 WM_KEYDOWN = 0x0100; 사적인 컨스턴트 인트 WM_KEYUP = 0x0101; 사적인 컨스턴트 인트 WH_키보드_LL = 13; [StructLayout(LayoutKind)]시퀀셜)] 일반의 구조 KBDLL 훅 구조 { 일반의 인트 vk코드; 일반의 인트 스캔 코드; 일반의 인트 플래그; 일반의 인트 시간을; 일반의 인트 dwExtraInfo; } /* 메서드 */ 정적인 사적인 인트 Low Level Key Low Low Level Keyboard Handler(인트 n코드, 인트 패램, 레퍼런스 KBDLL 훅 구조 파라암) { 한다면 (n코드 == HC_액션) { 한다면 (패램 == WM_KEYDOWN) 시스템..콘솔.나가..기입선('키 다운: " + 파라암.vk코드); 또 다른 한다면 (패램 == WM_KEYUP) 시스템..콘솔.나가..기입선("키업: " + 파라암.vk코드); } 돌아가다 CallNextHook예(후크, n코드, 패램, 파라암); } 일반의 정적인 부울 등록하세요후크() { 잠그다 (잠그다) { 한다면 (IsRegistered(등록 완료)) 돌아가다 진실의; 위임. = Low Level Key Low Low Level Keyboard Handler; 후크 = Windows 설정후크익스( WH_키보드_LL, 위임., 보안관.GetHINSTANCE(인스턴스)( 시스템..반사.어셈블리.Get Executing Assembly(어셈블리 실행)().Get Modules(모듈의 취득)()[0] ).ToInt32(), 0 ); 한다면 (후크 != 0) 돌아가다 IsRegistered(등록 완료) = 진실의; 위임. = 무효; 돌아가다 거짓의; } } 일반의 정적인 부울 등록 취소후크() { 잠그다 (잠그다) { 돌아가다 IsRegistered(등록 완료) = (Windows 연결 해제후크익스(후크) != 0); } } } JMP 명령 스플라이싱을 사용한 API/함수 후킹/인터셉트
다음 소스 코드는 JMP 명령으로 수신처 함수의 처음 6바이트를 새로운 함수로 덮어쓰면서 후크하는 API/함수 후크 방식의 예입니다.코드는 DLL 파일로 컴파일된 후 임의의 DLL 주입 방법을 사용하여 대상 프로세스에 로드됩니다.원래 함수의 백업을 사용하면 콜이 중단되지 않도록 처음 6바이트를 다시 복원할 수 있습니다.이 예에서는 win32 API 함수 MessageBoxW가 [2]잠겨 있습니다.
/* 이 아이디어는 GNU LGPL 라이선스에 따라 배포되는 crom-lib 접근법에 기초하고 있습니다. 소스 crom-lib : https://github.com/linuxexp/chrom-lib Copyright (C) 2011 Raja Jamwal */ #실패하다 <윈도우>h> #정의 사이즈 6 유형화된 인트 (WINAPI *pMessageBoxw)(HWND, LPCWSTR, LPCWSTR, 인트); // 메시지 상자 프로토타입 인트 WINAPI My Message Boxw(HWND, LPCWSTR, LPCWSTR, 인트); //우리의 우회로 무효 비긴 리다이렉트(LPVOID); pMessageBoxw pOrigMBaddress = 특수한 순서; // 원래 주소 바이트 구바이트[크기] = {0}; // 백업 바이트 JMP[크기] = {0}; // 6 바이트 JMP 명령 DWORD old Protect(old protect), 마이 프로텍트 = 페이지_EXECUTE_READWRITE; 인트 근원 Dll 메인(모듈 hDLL, DWORD 이유, LPVOID 예약필) { 전환하다 (이유) { 사례. DLL_PROCESS_ATTCH: // 연결된 경우 pOrigMBaddress = (pMessageBoxw) Get Proc Address(프로세서 주소)(Get Module HandleA("user32.disc"), // 원본 주소 가져오기 "메시지 박스W"); 한다면 (pOrigMBaddress != 특수한 순서) 비긴 리다이렉트(My Message Boxw); // 우회 시작 브레이크.; 사례. DLL_PROCESS_DETACH: 가상 보호((LPVOID)pOrigMBaddress, 크기, 마이 프로텍트, &old Protect(old protect)); // 읽기 쓰기 보호 할당 메모리(pOrigMBaddress, 구바이트, 크기); // 백업 복원 가상 보호((LPVOID)pOrigMBaddress, 크기, old Protect(old protect), &마이 프로텍트); // 보호 재설정 사례. DLL_THREAD_부착하다: 사례. DLL_THREAD_DETACH: 브레이크.; } 돌아가다 진실의; } 무효 비긴 리다이렉트(LPVOID 신기능) { 바이트 온도 JMP[크기] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3}; // 0xE9 = JMP 0x90 = NOP 0xC3 = RET 메모리(JMP, 온도 JMP, 크기); // JMP에 jmp 명령 저장 DWORD JMPSize = ((DWORD)신기능 - (DWORD)pOrigMBaddress - 5); // 점프 거리 계산 가상 보호((LPVOID)pOrigMBaddress, 크기, // 읽기 쓰기 보호 할당 페이지_EXECUTE_READWRITE, &old Protect(old protect)); 메모리(구바이트, pOrigMBaddress, 크기); // 백업을 만듭니다. 메모리(&JMP[1], &JMPSize, 4); // 점프 거리(JMP, 거리(4바이트),재시도) 메모리(pOrigMBaddress, JMP, 크기); // 원래 기능의 시작 부분에 점프 명령을 설정합니다. 가상 보호((LPVOID)pOrigMBaddress, 크기, old Protect(old protect), &마이 프로텍트); // 보호 재설정 } 인트 WINAPI My Message Boxw(HWND hwnd, LPCWSTR lpText, LPCWSTR lpCaption, 인트 ui 타입) { 가상 보호((LPVOID)pOrigMBaddress, 크기, 마이 프로텍트, &old Protect(old protect)); // 읽기 쓰기 보호 할당 메모리(pOrigMBaddress, 구바이트, 크기); // 백업 복원 인트 리트밸류 = 메시지 박스w(hwnd, lpText, lpCaption, ui 타입); // 원래 함수의 반환 값 가져오기 메모리(pOrigMBaddress, JMP, 크기); // 점프 명령을 다시 설정합니다. 가상 보호((LPVOID)pOrigMBaddress, 크기, old Protect(old protect), &마이 프로텍트); // 보호 재설정 돌아가다 리트밸류; // 원래 반환값 반환 } 넷필터 훅
다음으로 Netfilter를 사용하여 Linux 커널의 네트워크트래픽을 변경하는 예를 나타냅니다.
#실패하다 <linux/inux.h> #실패하다 <linux/inux.h> #실패하다 <linux/skbuff.h> #실패하다 <linux/ip.h> #실패하다 <linux/inux.h> #실패하다 <linux/in.h> #실패하다 <linux/netfilter.h> #실패하다 <linux/netfilter_syslog4>.h> /* 패킷을 드롭하는 포트 */ 정적인 컨스턴트 uint16_t 항구 = 25; /* 이것은 후크 기능 자체입니다 */ 정적인 서명되어 있지 않다 인트 후크_펑크(서명되어 있지 않다 인트 훅 번호, 구조 sk_filengths **PSKB, 컨스턴트 구조 net_device *에, 컨스턴트 구조 net_device *나가., 인트 (*OK.)(구조 sk_filengths *)) { 구조 ipdr *iph = ip_hdr(*PSKB); 구조 tcpdr *tcph, tcpbuf; 한다면 (iph->프로토콜 != IPPROTO_TCP) 돌아가다 NF_ACCEPT; tcph = skb_skb_skb_sknowledge(*PSKB, ip_hdren(*PSKB), 크기(*tcph), &tcpbuf); 한다면 (tcph == 특수한 순서) 돌아가다 NF_ACCEPT; 돌아가다 (tcph->증류 == 항구) ? NF_DROP : NF_ACCEPT; } /* 후크 기능 등록에 사용 */ 정적인 구조 nf_hook_ops nfho = { .후크 = 후크_펑크, .훅 번호 = NF_IP_PRE_ROUTING, .pf = NFPROTO_IPv4, .우선 순위. = NF_IP_PRI_FIRST, }; 정적인 __init 인트 my_init(무효) { 돌아가다 nf_register_훅(&nfho); } 정적인 __개요 무효 my_my_my_my_my_my_my(무효) { nf_unregister_훅(&nfho); } module_init(my_init); module_module_module_syslogs(my_my_my_my_my_my_my); 내부 IAT 후크
다음 코드는 다른 모듈에서 가져온 기능을 후크하는 방법을 보여 줍니다.이것은 호출 프로세스와 다른 프로세스에서 함수를 후크하기 위해 사용할 수 있습니다.이를 위해 코드를 DLL 파일로 컴파일한 후 임의의 DLL 주입 방법을 사용하여 대상 프로세스에 로드해야 합니다.이 방법의 장점은 안티바이러스소프트웨어나 부정행위 방지 소프트웨어에서 검출할 수 없기 때문에 악의적인 콜을 사용하지 않는 외부 후크로 만들 수 있습니다.Portable Executable 헤더에는 Import Address Table(IAT; Import Address Table)이 포함되어 있습니다.IAT는 아래 소스에 나타나듯이 조작할 수 있습니다.다음의 소스는, Microsoft Windows 로 동작합니다.
#실패하다 <윈도우>h> 유형화된 인트(__stdcall *pMessageBoxa) (HWND hwnd, LPCTR lpText, LPCTR lpCaption, 인트 uType(유형)); //이것은 MessageBoxA 호출의 '타입'입니다. pMessageBoxa Real Message Boxa; //원래 기능에 대한 포인터가 저장됩니다. 무효 우회 IATtr(컨스턴트 차* 기능., 무효* 신기능, 모듈 모듈); 인트 __stdcall New Message Boxa(HWND hwnd, LPCTR lpText, LPCTR lpCaption, 인트 uType(유형)) { //우리의 가짜 기능 인쇄물("MessageBoxA로 전송된 문자열: %s\n", lpText); 돌아가다 Real Message Boxa(hwnd, lpText, lpCaption, uType(유형)); //실제 함수를 호출합니다. } 인트 주된(인트 argc, 문자 *argv[]) { 우회 IATtr("메시지 박스A",(무효*)New Message Boxa,0); //함수 후크 메시지 박스a(특수한 순서, "Just A Message Box", "Just A Message Box", 0); //함수 호출 - 가짜 후크를 호출합니다. 돌아가다 0; } 무효 **검색(컨스턴트 차 *기능., 모듈 모듈) { //지정된 기능에 고유한 IAT(Import Address Table) 엔트리를 검색합니다. 인트 아이피 = 0; 한다면 (모듈 == 0) 모듈 = Get Module 핸들(0); PIMAGE_DOS_HEADER pimgDosHeaders = (PIMAGE_DOS_HEADER)모듈; PIMAGE_NT_HEADers PimgNTHeaders(PINGNTHeaders) = (PIMAGE_NT_HEADers)((LP바이트)pimgDosHeaders + pimgDosHeaders->e_lfanew); PIMAGE_Import_Descriptor pimg Import Desc = (PIMAGE_Import_Descriptor)((LP바이트)pimgDosHeaders + PimgNTHeaders(PINGNTHeaders)->옵션 헤더.데이터 디렉토리[IMAGE_Directory_ENTRY_Import].가상 어드레스); 한다면 (pimgDosHeaders->e_module != 이미지_DOS_SIGNATURE) 인쇄물("libPE 오류: e_magic은 유효한 DOS 시그니처가 없습니다.\n"); 위해서 (Image_Import_Descriptor *아이디 = pimg Import Desc; 아이디->이름. != 특수한 순서; 아이디++) { 위해서 (인트 기능 Idx = 0; *(기능 Idx + (LPVOID*)(아이디->퍼스트 트렁크 + (사이즈_T)모듈)) != 특수한 순서; 기능 Idx++) { 차 *modFuncName(모드 펑크명) = (차*)(*(기능 Idx + (사이즈_T*)(아이디->오리지널 퍼스트퉁크 + (사이즈_T)모듈)) + (사이즈_T)모듈 + 2); 컨스턴트 uintptr_t nModFuncName = (uintptr_t)modFuncName(모드 펑크명); 부울 문자열 = !(nModFuncName & (크기(nModFuncName) == 4 ? 0x80000000 : 0x8000000000000000)); 한다면 (문자열) { 한다면 (!_stricmp(기능., modFuncName(모드 펑크명))) 돌아가다 기능 Idx + (LPVOID*)(아이디->퍼스트 트렁크 + (사이즈_T)모듈); } } } 돌아가다 0; } 무효 우회 IATtr(컨스턴트 차 *기능., 무효 *신기능, 모듈 모듈) { 무효 **기능하다 = 검색(기능., 모듈); 한다면 (*기능하다 == 신기능) 돌아가다; DWORD 구권, 신권리 = 페이지_읽기; //보호 기능을 READWRITE로 업데이트합니다. 가상 보호(기능하다, 크기(LPVOID), 신권리, &구권); Real Message Boxa = (pMessageBoxa)*기능하다; //컴파일러에 따라서는 MSVC에 대해 확실하지 않은 "MinGW"와 같은 캐스트가 필요합니다. *기능하다 = 신기능; //이전 메모리 보호 플래그를 복원합니다. 가상 보호(기능하다, 크기(LPVOID), 구권, &신권리); } 「 」를 참조해 주세요.
레퍼런스
- ^ psyfl, [1]
- ^ 상세한 것에 대하여는, http://ntvalk.blogspot.nl/2013/11/hooking-explained-detouring-library.html 를 참조해 주세요.
- Jonathan Daniel (2013-11-27). "Hooking explained: detouring library calls and vtable patching in Windows/Linux/MAC-OSX". Retrieved 2014-01-01.
- Binh Nguyen (2004-08-16). "Hacking-Lexicon / Linux Dictionary V 0.16". Retrieved 2008-02-23.
Hook
- [2012-06-29: 링크가 끊긴 것 같습니다] Author: Holy Father (2002-06-10). "Hooking Windows API - Technics of hooking API functions on Windows 1.1 english" (PDF). Archived from the original (PDF) on 2009-12-29. Retrieved 2008-02-21.
{{cite web}}:author=범용명(도움말)이 있습니다.
외부 링크
창문들
- 주소 테이블 가져오기 기능 후크에 대한 정보입니다.
- 후크에 관한 Microsoft로부터의 정보
- x86 후크에 관한 정보와 다양한 기술.
- APISpy32는 win32 API를 후크하기 위한 어플리케이션입니다.
- Durtours는 C/C++에서 작동하는 Microsoft Research에서 만든 범용 함수 후킹 라이브러리입니다.
- winspy 다른 프로세스에 코드를 주입하는 세 가지 방법.
- HookTool SDK(ACF SDK) API 후킹 및 코드 주입에 대한 포괄적인 개요를 제공합니다.시판 상품도 있습니다.
- madCodeHook은 C++ 및 델파이용 x86 및 x64 API 후킹 및 DLL 주입 라이브러리입니다.
- EasyHook은 Windows에서 사용자 및 커널 랜드 모두에서 x86 및 x64를 지원하는 오픈소스 후킹엔진입니다
- Spy Studio Application Trace Spy Studio는 콜을 후크하는 애플리케이션 트레이서이며 결과를 구조적으로 표시합니다.
- rohitab.com API Monitor는 32비트 및 64비트 응용 프로그램과 서비스에서 10,000개 이상의 Windows API와 COM 인터페이스를 후크 및 표시할 수 있는 프리웨어 응용 프로그램입니다.
- Devare API Hook Devare는 다른 프로세스의 API 호출을 대행 수신하여 전체 파라미터 정보를 보여주거나 API 모니터를 만들 때 사용할 수 있는 프리웨어 프로세스 간 훅 프레임워크입니다.
- WinAPIOverride WinAPIOverride는 비상업용 프리웨어입니다.win32 API, COM, OLE, ActiveX 등을 후크할 수 있습니다.32비트 및 64비트 프로세스에서의 NET.여기에는 사후 분석 도구 모니터링이 포함됩니다.
- 메모리 작업용 urmem C++11 크로스 플랫폼 라이브러리(x86) (훅, 패치, 포인터 래퍼, 시그니처 스캐너 등)
리눅스
- 【2】후킹을 활용한 학생 연구 프로젝트.
- [3] 소프트웨어가 다른 프로세스의 실행을 감시하고 제어할 수 있는 기능.
- [4] LD_PRELOAD를 사용하여 공유 라이브러리 콜을 후크합니다.
에맥스
- Emacs 훅은 Emacs 맞춤에 중요한 메커니즘입니다.후크는 함수의 목록을 유지하는 리스프 변수이며, 잘 정의된 경우에 호출할 수 있습니다.(이것은 후크 실행이라고 불립니다).
OS X 및 iOS
- Cydia Strate는 탈옥한 iOS 기기를 위한 프레임워크로 개발자는 다른 프레임워크나 애플리케이션에 접속할 수 있습니다.
- harpoon은 런타임 함수 후크를 위한 OS X 라이브러리입니다.