Anti API Hooking technique 시스템 프로그래밍

hook_shield.zip

이 프로그램은 API 후킹을 분석하고, 복원이 가능함을 보여주기 위한 예제입니다.
다른 용도로 사용하다가 발생하는 불이익에 대해서는 책임지지 않습니다.


만든지 꽤 된 건데 이번에 소스코드 전체 리팩토링도 하고.. 미뤄두었던 기능들 추가해서 새로 만들었답니다.
포스팅 제목처럼 .. API 후킹을 탐지하고, 후킹을 무력화 시키는 기능을 가지고 있습니다. 물론 RING 3 에서의 API 후킹만요(그냥 윈도우 API 후킹이라고 생각하심 됩니다.)
여기에 적용된 똑 같은 기법으로 커널의 SSDT 훅 같은 것도 복원이 가능할 겁니다.
또 SDT relocation 이 아닌 다른 방식으로 SSDT 훅을 우회하는 무력화 하는 것도 가능하지요..


볼랜드 계열의 링커로 만든 PE 포맷을 대상으로 실행하면 뻑나고 죽습니다. -_-;;
이건 볼랜드 계열 링커들이 Import Name Table 을 뭉개기 때문에 그런건데요... INT 복원 기능도 다 만들어 놨지만 귀찮아서 안 붙였습니다. 생각보다 어렵답니다. :D

또 하나 패킹된 PE 인 경우도 문제의 소지가 있습니다. 당연히 그렇겠죠..

뭐 어차피 라이브러리 개발한거 테스트용이기 때문에 크게 신경 안썼습니다.
블로그에 들르시는 분들에게.. 이런것도 있다.. 라는걸 보여주고 싶어서 ;-)

압축을 풀고 hook_shield.exe 를 실행하시면 실행중인 프로세스 목록이 보일겁니다.
맨앞의 인덱스 번호를 입력하시면 해당 프로세스가 로드한 모든 dll 들에 대한 API 후킹 여부를 탐지하고, API 후킹이 탐지되면 변조된 코드를 후킹당하기 이전 상태로 만든후 종료합니다.

모든 결과는 C:\hook.shield.log 파일에 저장됩니다.

나름 대로 번쩍이는 아이디어를 몇개 집어넣은 작품입니다.
괴상 망측한 PE 파일들 때문에 삽이 부러지도록 삽질한 적도 많구요... :-D













===============================================================
hookshield report for [C:\WINDOWS\explorer.exe]
===============================================================
== hooked api list
C:\WINDOWS\system32\ntdll.dll (0x7c930000 - 0x7c9cc000) - 0 api hooked
C:\WINDOWS\system32\kernel32.dll (0x7c800000 - 0x7c92e000) - 17 api hooked
LoadLibraryA (ord: 578, org_addr: 0x7c801d77)
hook_type: code patched by cave
cur_addr: 0x7c882fc4, detour: 0x00000000
original code:
7C801D77: 8BFF mov edi, edi ;
7C801D79: 55 push ebp ;
7C801D7A: 8BEC mov ebp, esp ;
7C801D7C: 837D0800 cmp Dword ptr SS:[ebp+08h],00h ;
current code:
7C882FC4: E9 1717AE3B jmp B83646E0 ;
7C882FC9: 90 nop ;
7C882FCA: 90 nop ;
7C882FCB: 90 nop ;
LoadLibraryExA (ord: 579, org_addr: 0x7c801d4f)
hook_type: code patched by cave
cur_addr: 0x7c882fd3, detour: 0x00000000
original code:
7C801D4F: 8BFF mov edi, edi ;
7C801D51: 55 push ebp ;
7C801D52: 8BEC mov ebp, esp ;
7C801D54: FF7508 push Dword ptr SS:[ebp+08h] ;
current code:
7C882FD3: E9 4818AE3B jmp B8364820 ;
7C882FD8: 90 nop ;
7C882FD9: 90 nop ;
7C882FDA: 90 nop ;
LoadLibraryExW (ord: 580, org_addr: 0x7c801af1)
hook_type: code patched by cave
cur_addr: 0x7c882ff1, detour: 0x00000000
original code:
7C801AF1: 6A34 push 34 ;
7C801AF3: 68 58E0807C push 7C80E058 ;
7C801AF8: E8 00000000 call 7C801AFD ;
current code:
7C882FF1: E9 EA18AE3B jmp B83648E0 ;
7C882FF6: 90 nop ;
7C882FF7: 90 nop ;
7C882FF8: 90 nop ;
LoadLibraryW (ord: 581, org_addr: 0x7c80ae4b)
hook_type: code patched by cave
cur_addr: 0x7c882fe2, detour: 0x00000000
original code:
7C80AE4B: 8BFF mov edi, edi ;
7C80AE4D: 55 push ebp ;
7C80AE4E: 8BEC mov ebp, esp ;
7C80AE50: 6A00 push 00 ;
7C80AE52: 6A00 push 00 ;
current code:
7C882FE2: E9 9917AE3B jmp B8364780 ;
7C882FE7: 90 nop ;
7C882FE8: 90 nop ;
7C882FE9: 90 nop ;
LeaveCriticalSection (ord: 577, org_addr: 0x7c80911b)
hook_type: forwarded api
cur_addr: 0x7c9310ed, detour: 0x00000000
forwarded to: NTDLL.RtlLeaveCr
EnterCriticalSection (ord: 151, org_addr: 0x7c80900f)
hook_type: forwarded api
cur_addr: 0x7c931005, detour: 0x00000000
forwarded to: NTDLL.RtlEnterCr
LoadLibraryExA (ord: 579, org_addr: 0x7c801d4f)
hook_type: iat hook
cur_addr: 0x7c882fd3, detour: 0x00000000
LoadLibraryExW (ord: 580, org_addr: 0x7c801af1)
hook_type: iat hook
cur_addr: 0x7c882ff1, detour: 0x00000000
SetLastError (ord: 788, org_addr: 0x7c809241)
hook_type: forwarded api
cur_addr: 0x7c940340, detour: 0x00000000
forwarded to: NTDLL.RtlSetLast
HeapFree (ord: 521, org_addr: 0x7c80905e)
hook_type: forwarded api
cur_addr: 0x7c94043d, detour: 0x00000000
forwarded to: NTDLL.RtlFreeHea
HeapReAlloc (ord: 525, org_addr: 0x7c809070)
hook_type: forwarded api
cur_addr: 0x7c9479fd, detour: 0x00000000
forwarded to: NTDLL.RtlReAlloc
.........

.......... 중간 생략 .......

.........

C:\WINDOWS\system32\nview.dll (0x00b30000 - 0x00c9f000) - 26 api hooked
NVUnregisterNotificationWindow (ord: 207, org_addr: 0x00b6deb0)
hook_type: code modified (self modified code)
cur_addr: 0x00b6deb0, detour: 0x00000000
original code:
00B6DEB0: 56 push esi ;
00B6DEB1: 8B3534390E10 mov esi,Dword ptr DS:[100E3934] ;
00B6DEB7: 57 push edi ;
current code:
00B6DEB0: 56 push esi ;
00B6DEB1: 8B353439C100 mov esi,Dword ptr DS:[00C13934] ;
00B6DEB7: 57 push edi ;
NVZoomWindowRun (ord: 208, org_addr: 0x00b6cec0)
hook_type: code modified (self modified code)
cur_addr: 0x00b6cec0, detour: 0x00000000
original code:
00B6CEC0: 53 push ebx ;
00B6CEC1: 8B1DE0E20E10 mov ebx,Dword ptr DS:[100EE2E0] ;
00B6CEC7: 56 push esi ;
current code:
00B6CEC0: 53 push ebx ;
00B6CEC1: 8B1DE0E2C100 mov ebx,Dword ptr DS:[00C1E2E0] ;
00B6CEC7: 56 push esi ;
.........

.......... 중간 생략 .......

.........



덧글

  • 미친감자 2006/11/25 22:26 # 답글

    정말 멋지십니다.... 짝짝짝~!!!!!! 박수를 드립니다.
    정말 대단하십니다.
  • chp 2006/11/26 18:39 # 삭제 답글

    이거 원본코드는 exe에서 가져오는건가요?
    엄청 신기하내요.
  • somma 2006/11/27 09:55 # 답글

    미친감자/ ^^; 따지고 보면 간단한 겁니다.
    chp/ 후킹을 탐지하는데는...여러가지 방법을 사용합니다. 원본은 파일에 있는걸 사용하는게 맞구요..
    원리는 간단한데 실제 구현에는 몇가지 어려움이 있습니다. VirtualProtect() 를 복원하기 위해서 VirtualProtect() 를 호출해야 하는 경우... 난감해 지죠..ㅋㅋ.. 이 프로그램에서는 모두 해결했지요..ㅋㅋ
  • chp 2006/12/03 17:04 # 삭제 답글

    혹시 opcode를 어셈블리로 변환해주는 라이브러리가 있나요?
    필요한일이 있어서 그런대요;
    만약 있다면 가르쳐주실수있나요?
  • somma 2006/12/04 09:55 # 답글

    chp/ 여러가지가 있습니다.
    http://www.piotrbania.com 에 가면 DISIT 라는 디스어셈블러 소스코드가 있구요..
    http://pvdasm.reverse-engineering.net/ 에는 Proview (PVDasm) Interactive Program Disassembler 가 있는데 모두 오픈 소스 입니다.
    http://www.geocities.com/~sangcho/disasm.html 요기가면 울 나라분의 디스어셈블러 코드를 구할수 있을 겁니다.
  • somma 2006/12/04 10:00 # 답글

    이거 말고도 sourceforge 같은곳 가서 disassembler 같은 단어로 검색하면 많이 나올겁니다.
  • 젊은사장 2006/12/04 18:44 # 답글

    어떻게 찾아 오다가 여기 까지 와서 아주 좋은 글 보고 갑니다.
    현재 공개되어 있는 소스로는 Windows XP 까지 SSDT 를 Restore 해주는 기법만이 있는 것 같은데 혹시 위의 기법으로 2003 도 Restore 가 가능할까요 ?
  • somma 2006/12/04 21:38 # 답글

    젊은사장/ 이 포스트에서 보여드린 예제는 ring3 에서의 후킹만 복원합니다. IAT/EAT hooking 같은 엔트리 포인트 후킹과 Detour 스타일의 후킹을 탐지하고 복원하지요. SSDT hook 의 경우 비슷한 방법을 통해서 엔트리 포인트 훅이나 Detour 스타일 훅 모두 복원가능한 걸로 알고있습니다. IDT 훅도 어차피 동일하구요.
    커널레벨에서는 훅만 해 보고 복원은 안해봤습니다만.. 2003에서도 가능하리라 보여집니다. vista 의 경우 좀 다르겠죠(패치가드 때문에...).
    지금 당장 그렇게 필요하지 않아서 계속 안하고 농땡이 치고 있습니다. ㅋㅋㅋ
    몇몇 보안 제품들의 경우 SSDT 나 IDT 훅을 복원하면 (후킹된 코드가 변조되면..) 블루스크린을 띄우는 경우도 있긴 합니다만... 결국 해당 루틴을 찾아 다시 패칭하면 되겠죠 :-)
    결론은 2003 에서도 될 것 같다...인데 안해봐서 정확히는 말씀드리지 못하겠습니다. 흐흐...
  • 2006/12/04 22:43 # 답글 비공개

    비공개 덧글입니다.
  • 이명성 2007/10/01 14:20 # 삭제 답글

    소스주시면 고맙겠네요.
  • somma 2007/10/01 19:04 # 답글

    이명성/ 코드를 보여드리고 싶어도... 공개 할 수 없는 코드들도 좀 엮여있는 것들이 좀 많아서 당장 공개하긴 좀 어렵습니다. ^^
    사실 별거 없습니다. PE 구조만 잘 알면 쉽게 할 수 있습니다.
  • 후킹공부중 2007/12/05 00:00 # 삭제 답글

    somma님아 제가 지금 프로젝트를 하고 있는데요. 커널단의 후킹을 해본적이 없습니다. 솔직히 지금부터 후킹을 공부하자니 프로젝트 기간을 못 맞추기 때문에

    감히 부탁드리오니, 제게 이프로그램 소스좀 공유해 주십사 부탁드립니다. 제 메일 주소는 scg-kts36@nate.com 입니다.
  • somma 2007/12/05 00:42 # 답글

    후킹공부중님아~ -_-;;

    이 프로그램은 커널단 후킹이 아니고, 응용프로그램 레벨의 후킹을 탐지하는 코드랍니다.
    커널단 후킹에 대한 코드는 구글에서 검색 한번만 해보시면 엄청나게 많이 나온답니다.
  • 권상훈 2008/05/25 19:02 # 삭제 답글

    ㅇㅅㅇ... cafe.naver.com/cheatenginekorea 에 출처 밝히고 퍼갈게요 ㅎ 감사합니다~
  • 권상훈 2008/05/25 19:02 # 삭제 답글

    이거 소스가 복잡하나요?... 보니까 C++같은뎀..
  • somma 2008/05/29 17:21 # 삭제 답글

    권상훈 / 소스코드는 .. 음. 좀 복잡합니다.
    PE 구조만 알면 사실 어려울것 까진 없고, 양이 좀 많다 뿐이지요.
    C++ 로 만들어진 것은 맞고요.. :-)
  • 우핫 2008/09/21 22:57 # 삭제 답글

    정말 대단하시군요. user mode의 api 후킹을 탐지해내 수정하는것이라 ..ㅎ;
    좋은 프로그램 보고 갑니다 ^^ .
    수고 하세요.
  • somma 2008/09/22 12:54 # 삭제

    PE 의 구조를 좀 보면 쉽게 만들 수 있습니다. 대단한거 아니에요. ^^
  • ^^ 2010/12/01 22:40 # 삭제 답글

    AntiHookExec Version 1.0 (Anti API Hooking Proof-Of-Concept)

    http://www.security.org.sg/code/antihookexec.html
  • 김익게 2015/04/04 01:32 # 삭제 답글

    와; 진짜 상상할수없을정도로 귀찮았겠다...
  • 김익게 2015/04/04 01:32 # 삭제 답글

    와; 진짜 상상할수없을정도로 귀찮았겠다...
  • 김익게 2015/04/04 01:33 # 삭제 답글

    와; 진짜 상상할수없을정도로 귀찮았겠다...
  • 김익게 2015/04/04 01:33 # 삭제 답글

    와; 진짜 상상할수없을정도로 귀찮았겠다...
  • 김익게 2015/04/04 01:33 # 삭제 답글

    와; 진짜 상상할수없을정도로 귀찮았겠다...
  • 김익게 2015/04/04 01:33 # 삭제 답글

    와; 진짜 상상할수없을정도로 귀찮았겠다...
  • 문이홍 2016/10/02 10:43 # 삭제 답글

    안녕하세요 API hooking 공부하고 있는 학생입니다. 혹시 소스코드를 얻을 수 있을까요?
    감사합니다.
댓글 입력 영역