API Hook의 유형별 구조



API Hook의 유형별 구조



간단한 API Hook의 구조에 대해 살펴보겠습니다.
물론 Hooking을 한번이라도 구현해보신 분들은 대략 다 알만한 내용이지만
간단한 정리 차원에서 (심심한데 블로그에 쓸것도 없기도 하고 ㅋ)
끄적거려 봅니다.

1) inject jump code

가장 교과서적인 후킹 방법입니다.
타겟의 entry point에 jump code 를 삽입하는 기술이죠.

이때 사용되는 opcode는 0xE9가 쓰이는데요,
이것은 long jump를 의미합니다(short jump는 후킹에 잘 사용되지 않습니다.
후킹의 목적이 자신의 함수를 호출하기 위함인데, 겨우 255byte밖에 점프를
못하는 short jump로 뛰어가본들 현재 함수의 끝까지나 갈 수 있겠습니까 :p)

물론 꽁수로 쓰려면 shot jmp로도 쓸 순 있겠지만, 원하는 목적을 이루기 위해서는 결국엔
중간에 또 점프코드를 삽입해야 할거고 여러모로 효용성이 없죠 :(

암튼 0xE9이후에 사용될 4byte는 점프할 주소가 기록됩니다

  E9    +    XX XX XX XX
  --         -----------
  점프해라   여기루

머 저런식으로 총 5byte code modifiction이 필요합니다.

점프할 번지가 기록되는 4byte는 상대 번지가 사용됩니다.

사용자 삽입 이미지


계산방법은 머 간단한데, 위 화면에 보이는 이미지로 해보겠습니다.
현재 화면은 0x719E428A번지이고 opcode는 E9 21 D0 3A 8F 입니다.
역WORD로 읽어야 하니까 점프할 4byte는 8F3AD021 이 되겠네요.

그럼 걍 더하면 됩니다. 0x719E428A + 0x8F3AD021 + 5(5byte명령어도 더해줘야죠)
그래서 나온 값은 0x100D912B0인데, DWORD로 짜르면 되니까 결국 0xD912B0번지가
됩니다. 화면에 나온 값을 보시면 Olly가 해석해준 jmp aaaaaa.00D912B0 이랑
일치하네요 :p

대표적으로 WPE 같은 넘들이 jump code를 주입하는 후킹 방법을 사용하죠.
(화면도 WPE가 send()를 후킹한 이미지입니다) 또, 많은 분들이 애독하는
"해킹, 파괴의 광학"에도 같은 방법의 후킹 테크닉이 서술되어 있습니다.

반면에 madCodeHook 라이브러리 같은 경우는 jump 형태의 훅을 사용하긴 하지만,
일반 롱 점프의 E9가 아닌 jmp near dword ptr 을 사용합니다.
이 경우는 opcode 가  0xFF 0x25 가 사용됩니다.

FF 25 + XX XX XX XX 로, 6byte의 inline code patching을 해야 합니다.

이미지를 보시면 아시겠지만, 이 경우는 상대번지가 아니고 절대번지가 들어가기
때문에 따로 계산하실 필요 없이 역워드로 바로 읽으면 확인 가능합니다 :)


사용자 삽입 이미지

madCodeHook 을 이용하여 CreateFileA를 후킹한 모습입니다



2) inject call function

두번째로 hooking code를 삽입하기 위해 call 문을 주입하는 방법이 있습니다.

이때 call문의 opcode 는 0xE8 이 사용됩니다.

사실 jump code hook 보다는 많이 쓰이지 않는 방법이지만, AmesianX님이
D2hackIt님의 소스를 범용으로 사용하시면서 좀 알려진것 같네요 :p

화면 이미지는 AmesianX님 만드신 Charm 예제 프로그램을 넣어봤습니다.
TerminateProcess를 후킹한 모습입니다(번지 계산 방법은 위와 같습니다)

사용자 삽입 이미지

3) Table Hook

이번에는 Table 종류의 Hook 입니다.
앞의 두 경우가 inline code patching의 범주라면, 이 경우는 테이블의
포인터를 바꾸는 방식입니다.
따라서 4byte의 modifiction이 필요합니다 (당연히 code는 아니겠죠 :p)

예를 들어서 어떤 함수가 80123456번지에 위치해 있고 그 값이
어딘가의 테이블에 저장되어 있다면,
그 테이블의 80123456이라는 값이 담긴 곳을 자신이 만든 함수의 위치인
80ABCDEF로 바꿔버리는 겁니다.

대표적인 경우로 IAT Hook, EAT Hook, SDT Hook 등이 있습니다.

사용자 삽입 이미지

IceSword로 확인해본 SDT Hook


그외 많은 hooking 기법이 있는데요, 가장 보편적으로 쓰이는 방법은
대부분 이 유형을 따르는 것 같습니다 :)

일단 다른 후킹 테크닉은 아직 범용화되지 않았거나, 구현 자체가 정상적이지
못해서(혹은 위험해서) 바이러스나 해커들이 꽁수로만 사용하거나 머 그다지
알려지지 않은.... 대략 그런거 같습니다.

다음에 기회가 되면 또 다른 hooking 방법에 대해 살펴보겠습니다 :p


window31. 2007년 7월


신고
Posted by window31


댓글을 달아주세요

  1. 2007.07.18 23:22 신고
    댓글 주소 수정/삭제 댓글
    나테온 보고 와밨어용.
    엄선된 양질의 좋은 정보들이 많군요 ㅋㅋㅋ
    자주 놀러올께요. ^^
  2. 2007.07.19 20:21 신고
    댓글 주소 수정/삭제 댓글
    ㅎㅎ 저도 codewiz님 홈피 자주 가서 재미있게 보고 있어요 ㅋㅋ
  3. AmesianX
    2012.07.07 01:30 신고
    댓글 주소 수정/삭제 댓글
    국내로 돌아오세요..
    미워요.. 혼자만 가고..

BLOG main image
by window31

카테고리

분류 전체보기 (285)
Reverse Engineering (22)
C, C++ (20)
Kernel (8)
Guitar (19)
잡담 (79)
etc (8)
who am i (8)
보안 이야기 (89)
Tools (3)
월간 마이크로소프트웨어/그.. (28)

글 보관함