오리지날 코드
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
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)]
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바이트나..더.........ㅠㅠ