2017-02-09 1 views
4

나는 API 훅, 인라인 및 EAT 훅을 탐지하려고 노력하고있다.API 후크를 감지하는 방법은 무엇입니까?

지금은 EAT 후크를 감지하는 방법에 대해 아무 것도 발견하지 못했습니다.

인라인 링 3 후크를 들어

, 내가 지금까지 가지고 :

FARPROC Address = GetProcAddress(GetModuleHandle("kernel32.dll"),"ExitProcess"); 
if (*(BYTE*)Address == 0xE9 || *(BYTE*)Address == 0x90 || *(BYTE*)Address == 0xC3) 
{ 
printf("Api hooked\n"); 
} 

문제는 JMP/NOP/RET를 확인하는 기능의 프롤로그를/후크 변경하는 데 사용할 수있는 여러 가지 옵 코드가 있다는 것입니다 하찮은 일이지만, PUSH RET, MOV, RETN 등과 같은 많은 후크 유형을 보았습니다 ...

API에서 이러한 후크 (우회 경로) 또는 수정 사항을 감지하는 방법을 아는 사람이 있을지 모르겠습니다. 또한 EAT 후크를 감지 할 수있는 방법이 있습니다.

감사합니다.

+7

누군가가 프로그램을 연결 한 경우 후크 감지기를 연결할 수 있습니다. –

+1

글쎄, 내보내기 주소 표가 연결되었는지 확인하는 확실한 방법은 테이블의 주소 중 하나가 EAT가 속한 DLL 외부의 어딘가를 가리키는 지 확인하는 것입니다. 비록 일부 표준 DLL은 일부 기능을 EAT를 통해 다른 DLL로 전달하기 때문에이 경우를 처리해야합니다. –

답변

1

GetProcAddress도 연결할 수 있습니다. 또한 패치가 될 정확한 API를 알 수 없으므로 가져온 모든 함수를 확인해야합니다. 이는 지루한 일입니다. 침입자가 프로세스 주소 공간에 주입하고 API 메소드를 삽입 할 수있는 충분한 권한을 가지고 있기 때문에 솔직히 모든 보호 메커니즘을 패치하지 못하게하는 방법은 거의 없습니다. 일반적으로 최신 소프트웨어 보호 시스템에는 프로그램 메모리를 검사하고 dll 주입 및 원격 메모리 수정을 방지하는 커널 모드 드라이버가 포함되어 있습니다. 또한 코드 암호화/난독 화 시스템 (예 : Themida)을 사용하거나 심지어 완전히 외계 프로세서 명령어 세트가있는 내부 가상 실행 시스템을 사용하여 코드를 패치하는 것을 꽤 어렵게 만드는 것이 일반적입니다.

+1

물론 맞습니다.하지만 디스크에서 Kernel32.dll을 수동으로로드하고 파일이 서명되었는지 확인하고 GetProcAddress와 같은 중요한 기능의 명령 전주곡 등을 비교하는 등의 효과적인 효과적인 대책을 보았습니다. GPA가 연결되면 데이터를 비교하기 전에 탐지를 피하기 위해 동적으로 unhook해야합니다. 그 후에, 당신은 디스크 대 메모리 ... 등등과 같은 기능 - 명령 - 체크섬을 비교할 수 있습니다. 그러나 네, 그 고양이 - 마우스 게임과 theres 바보 증명 방법. –

0

나는 커널의 현재 dll과 디스크의 kernel32.dll을 비교해야하며 IAT를 무시하고 재배치를 수정해야한다고 생각합니다. 그렇지 않으면 다른 해시를 얻게됩니다.

쉬운 솔루션을 원한다면 kernel32.dll의 이름을 바꾸고 이름이 바뀐 DLL에서 API를 호출하면됩니다.

0

현재 프로세스에 IAT 주소를 연결 한 다음 즉시 바이트를 저장해야합니다.

이 후에는 원래 바이트를, 그래서 나중에 그들이 다음 IAT 주소가 다른 경우, 새로운 사람과 바이트 다시 복사하려고하고 이전을 비교) ((원본)을 memcmp는 사용할 수 있습니다 다른 프로세스에 의해 연결되었습니다.

관련 문제