본문 바로가기
디버그

64bit DebugView의 인라인 Hook방식

by WeZZ 2010. 5. 11.

오리지날 코드
nt!DebugPrint:
fffff800`0104b360 458bc8          mov     r9d,r8d
fffff800`0104b363 448bc2          mov     r8d,edx
fffff800`0104b366 668b11          mov     dx,word ptr [rcx]
fffff800`0104b369 488b4908        mov     rcx,qword ptr [rcx+8]
fffff800`0104b36d b801000000      mov     eax,1
fffff800`0104b372 cd2d            int     2Dh
fffff800`0104b374 cc              int     3
fffff800`0104b375 c3              ret


훅 코드
nt!DebugPrint:
fffff800`0104b360 ff2500000000    jmp     qword ptr [nt!DebugPrint+0x6 (fffff800`0104b366)]
fffff800`0104b366 8c84edc6dffaff  mov     word ptr [rbp+rbp*8-5203Ah],es
fffff800`0104b36d ff01            inc     dword ptr [rcx]
fffff800`0104b36f 0000            add     byte ptr [rax],al
fffff800`0104b371 00cd            add     ch,cl
fffff800`0104b373 2dccc3cccc      sub     eax,0CCCCC3CCh

이게 무슨 코드인가 했다... 그러나..

jmp     qword ptr [nt!DebugPrint+0x6 (fffff800`0104b366)]

fffff800`0104b366 포인터 값으로 점프하란 소리인데 바로 아래의 주소다.


메모리 맵으로 보면 아래값과 같다.

2: kd> dq fffff800`0104b366
fffff800`0104b366  fffffadf`c6ed848c c3cc2dcd`00000001
fffff800`0104b376  6666cccc`cccccccc 4c024a8b`44669066

Dbgv의 hook 코드를 가르키고 있다.

2: kd> u fffffadf`c6ed848c
Dbgv+0x148c:
fffffadf`c6ed848c 48895c2408      mov     qword ptr [rsp+8],rbx
fffffadf`c6ed8491 4889742410      mov     qword ptr [rsp+10h],rsi
fffffadf`c6ed8496 57              push    rdi
fffffadf`c6ed8497 4883ec20        sub     rsp,20h
fffffadf`c6ed849b 803dcb2c000000  cmp     byte ptr [Dbgv+0x416d (fffffadf`c6edb16d)],0
fffffadf`c6ed84a2 418bf8          mov     edi,r8d
fffffadf`c6ed84a5 8bf2            mov     esi,edx
fffffadf`c6ed84a7 488bd9          mov     rbx,rcx
fffffadf`c6ed84aa 741a            je      Dbgv+0x14c6 (fffffadf`c6ed84c6)
fffffadf`c6ed84ac 488b4908        mov     rcx,qword ptr [rcx+8]
fffffadf`c6ed84b0 e863ffffff      call    Dbgv+0x1418 (fffffadf`c6ed8418)
fffffadf`c6ed84b5 803d542c000000  cmp     byte ptr [Dbgv+0x4110 (fffffadf`c6edb110)],0
fffffadf`c6ed84bc 750f            jne     Dbgv+0x14cd (fffffadf`c6ed84cd)
fffffadf`c6ed84be 448bc7          mov     r8d,edi
fffffadf`c6ed84c1 8bd6            mov     edx,esi
fffffadf`c6ed84c3 488bcb          mov     rcx,rbx
fffffadf`c6ed84c6 e83dfbffff      call    Dbgv+0x1008 (fffffadf`c6ed8008) -->proxy 주소
fffffadf`c6ed84cb eb04            jmp     Dbgv+0x14d1 (fffffadf`c6ed84d1)
fffffadf`c6ed84cd 8b442448        mov     eax,dword ptr [rsp+48h]
fffffadf`c6ed84d1 488b5c2430      mov     rbx,qword ptr [rsp+30h]
fffffadf`c6ed84d6 488b742438      mov     rsi,qword ptr [rsp+38h]
fffffadf`c6ed84db 4883c420        add     rsp,20h
fffffadf`c6ed84df 5f              pop     rdi
fffffadf`c6ed84e0 c3              ret

아래는 Dbgv의 Proxy 주소코드이다.
2: kd> u fffffadf`c6ed8008
Dbgv+0x1008:
fffffadf`c6ed8008 458bc8          mov     r9d,r8d
fffffadf`c6ed800b 448bc2          mov     r8d,edx
fffffadf`c6ed800e 668b11          mov     dx,word ptr [rcx]
fffffadf`c6ed8011 488b4908        mov     rcx,qword ptr [rcx+8]
fffffadf`c6ed8015 b801000000      mov     eax,1
fffffadf`c6ed801a ff2500000000    jmp     qword ptr [Dbgv+0x1020 (fffffadf`c6ed8020)]


2: kd> dq fffffadf`c6ed8020
fffffadf`c6ed8020  fffff800`0104b372 48c38b48`db854800




이걸 본 순간
아... 64bit는 상대주소 계산 방법이 없는것인가...
상대주소 계산 따윈 없었다.

이역시 14바이트를 사용한다.

mov rax [xxxxxxxxx]
ret   rax

보다 2바이트나..더.........ㅠㅠ