현재 위치 - 법률 상담 무료 플랫폼 - 특허 조회 - 시스템에서 API 를 연결하기 위해 전역 후크를 작성하는 방법
시스템에서 API 를 연결하기 위해 전역 후크를 작성하는 방법
HOOK API 는 영원한 화제이다. HOOK 이 없다면, 많은 기술들이 실현하기 어렵거나 아예 실현되지 못할 것이다. 여기서 말하는 API 는 DOS 의 인터럽트, WINDOWS 의 API, 인터럽트 서비스, IFS 및 NDIS 필터 등을 포함한 광범위한 API 입니다. 예를 들어 익숙한 인스턴트 번역 소프트웨어는 HOOK TextOut () 또는 ExtTextOut () 을 통해 이루어집니다. 운영 체제는 이 두 가지 기능을 사용하여 텍스트를 출력하기 전에 해당 영어를 중국어로 대체하여 즉각적인 번역을 수행합니다. IFS 및 NDIS 필터링에 대해서도 마찬가지입니다. 디스크를 읽고 쓰기 전에 시스템은 제 3 자가 제공한 콜백 함수를 호출하여 작업을 해제할 수 있는지 확인합니다. 일반 HOOK 과는 달리 운영 체제에서 허용하는 운영 체제는 콜백 함수를 설치하는 인터페이스를 제공합니다. DOS 와 WINDOWS 의 바이러스는 HOOKint21감염 파일 (파일 바이러스), hookint/kloc-을 통해 DOS 의 바이러스가 hookint2/kloc-을 통해 작동하기 때문에 hook 이 없어도 바이러스가 없습니다. WINDOWS 의 바이러스는 시스템 API 연결 (RING0 및 RING3 계층 포함) 또는 ifs 설치 (cih 바이러스가 사용하는 방법) 를 통해 파일을 감염시킵니다. 따라서 "HOOK 없이는 오늘의 다채로운 소프트웨어 세계가 없다" 고 할 수 있다. 특허와 지적재산권, 또는 영업기밀과 관련해 마이크로소프트는 사람들이 시스템 API 를 연결하도록 독려하지 않고 IFS, NDIS 등 기타 필터링 인터페이스를 제공하고 백신 소프트웨어와 방화벽의 요구를 충족시키기 위해 개방하고 있다. 그래서 많은 경우 HOOK API 는 스스로 해야 한다. HOOK API 에는 연결된 API 의 원래 기능에 어떤 방식으로도 영향을 줄 수 없다는 원칙이 있습니다. 의사가 병을 치료하고 사람을 구하는 것처럼, 환자의 체내에 있는 바이러스를 죽이면 환자가 죽는다면, 이' 병을 치료하고 사람을 구하는 것' 은 의미가 없다. API 를 연결하면 목적이 달성되지만 API 의 원래 기능이 고장나서 후크가 아니라 교체가 되고 운영 체제의 정상적인 기능이 영향을 받거나 붕괴될 수 있습니다. HOOK API 기술은 복잡하지 않고 프로그램 흐름을 바꾸는 기술이다. CPU 의 명령 중 JMP, CALL, INT, RET, RETF, IRET 등 프로세스의 흐름을 변경할 수 있는 몇 가지 명령이 있습니다. 이론적으로 API 입구 및 출구를 변경하는 기계 코드를 연결할 수 있지만 1, CPU 명령어의 길이, 32 비트 시스템에서는 JMP/CALL 명령어의 길이가 5 바이트이므로 API 에서 5 바이트 이상을 교체해야 하기 때문에 실제로 구현하는 것이 훨씬 더 복잡합니다. 2, 매개 변수 문제, 원래 API 매개 변수에 액세스하려면 EBP 또는 ESP 를 통해 매개 변수를 참조해야 하므로 후크 코드에서 EBP/ESP 의 값을 잘 알아야 합니다. 3, 타이밍, 일부 훅은 API 의 시작 부분에 있어야 하고, 일부는 API 의 끝 부분에 있어야 합니다 (예: HOOK CreateFilaA ()). API 의 끝에 API 를 연결하면 파일을 쓸 수 없으며 파일에 액세스할 수도 없습니다. 갈고리 RECV (), API 갈고리 꼭대기에 있는데 아직 데이터를 받지 못했다면 RECV () 의 수신 버퍼를 확인할 수 있습니다. 물론 원하는 데이터는 없습니다. RECV () 가 제대로 실행될 때까지 기다린 다음 RECV () 의 버퍼를 검사하여 필요한 데이터를 확인해야 합니다. 4, 컨텍스트의 문제, 일부 후크 코드는 특정 작업을 수행할 수 없습니다. 그렇지 않으면 원래 API 의 컨텍스트가 손상되고 원래 API 가 무효화됩니다. 5, 동기화 문제, 후크 코드에서 글로벌 변수를 사용하지 말고 로컬 변수를 사용해야 합니다. 이것이 모듈식 프로그램의 필요성입니다. 6. 마지막으로, 대체된 CPU 명령어의 원래 함수는 후크 코드 어딘가에서 시뮬레이션해야 한다는 점에 유의해야 한다. Ws2_32.dll 에 있는 send () 를 예로 들어 이 함수를 연결하는 방법을 보여 줍니다. Exported fn (). : send-Ord:00 13h 주소 기계 코드 어셈블리 코드: 71a21af455 pushe BP//보류 후크 기계 코드 ( ESP// 후크 보류 기계 코드 (방법 2): 71a2100065438+) dwordptr [ebp-08]: 7/ Kloc-0/2e869f7fff 호출 71a21280: 71a21B6 54330 Kloc-0/A2 1B43 57 푸시 EDI: 71a21b44ff7514 푸시 [ A21b6b5bpopebx: 71a21b6c 0f855f94000jne71a2afd Dwordptr [ebp+08]: 71a265448 이 방법은 Sofice 와 같은 DEBUGER 에서 널리 사용되며 BPX 를 통해 해당 위치에 INT 3 명령을 설정하여 중단점을 만듭니다. 그러나 WINDOWS 또는 디버그 도구와 충돌하기 때문에 어셈블리 코드는 기본적으로 디버깅되기 때문에 권장되지 않습니다. 2. 두 번째 mov ebp, esp 명령어 (기계 코드 8BEC, 2 바이트) 를 INT F0 명령어 (기계 코드 CDF0) 로 대체한 다음 IDT 에 인터럽트문이 우리를 가리키는 코드를 설정합니다. Lea ebp, [esp+ 12] // 모의 모브 EBP, esp pushfd 함수//장면 저장 pushad // 장면 저장//여기 이 방법은 좋지만 단점은 IDT 에 인터럽트 문을 설정했다는 것입니다. 3. 호출 디렉티브의 상대 주소를 변경합니다 (호출은 각각 7 1A2 1B 12, 71a2/kloc-) 왜 통화 지시를 찾아야 합니까? 모두 5 바이트 명령이고 모두 호출 명령이기 때문에 Opcode 0xE8 을 그대로 유지하는 한, 뒤에 있는 상대 주소를 변경하여 우리의 갈고리 코드로 가서 실행할 수 있습니다. 그리고 우리 갈고리 코드 뒤에 있는 대상 주소로 가서 실행할 수 있습니다. (존 F. 케네디, Northern Exposure (미국 TV 드라마), 자기관리명언) 우리의 후크 코드가 7 1A20400 에 있다고 가정하면 7 1A2 1A64 에서 호출 명령을 7 1A20400 (원본 여기서 네가 하고 싶은 일을 해라. Popad jmp 71a21230/원래 호출된 명령의 대상 주소로 이동합니다. 원래 명령은 다음과 같습니다: call 7 1A2 1230 이 방법은 매우 숨겨져 있지만 5 바이트 call 명령을 찾기가 어렵고 상대 주소 계산이 복잡합니다. 4. 주소가 7 1A265438 인 CMP dword ptr [71A3201c] 및 71을 교체합니다 10 바이트) 가 Call 7 1a 20400 nopnoponop (기계 코드: e8xxxxxx90 90 90 90, 10 바이트) 으로 변경됨 7 1A20400 의 훅은 Pushed MOVEDX 입니다. 7 1A320 1Ch // 시뮬레이션 기본 명령 CMP dword ptr [71A3201c], 시뮬레이션 7 1a 2 193h// 시뮬레이션 기본 명령 CMP dword ptr [71A3201c],, 시뮬레이션 위의 방법은 모두 상용적이다. 흥미롭게도, 많은 사람들이 API 의 처음 5 바이트를 수정하지만, 현재 많은 바이러스 백신 소프트웨어는 API 가 체크되었는지, 또는 다른 바이러스 목마가 나중에 처음 5 바이트를 수정했는지 확인하기 위해 이 방법을 사용하고 있습니다. 이렇게 하면 서로 덮어씌워집니다. 마지막 확인 API 의 조작은 효과적이다. (알버트 아인슈타인, Northern Exposure (미국 TV 드라마), 성공명언)