Ada 2.
1) INT 2E > Lama (Win 2000 dan sebelum)
ntdll!NtWriteFile:
77f8c552 mov eax, 0xed
77f8c557 lea edx, [esp+0x4]
77f8c55b int 2e
77f8c55d ret 0x24
eax: index dalam array KiServiceTable
edx: pointer kpd parameter pertama utk function kernel-mode
interupt akan buat os baca IDT(interupt descriptor table). int 2e akan point kepada code KiSystemService dalam NTOSKRNL(kernel-mode).
KiSystemService akan baca KiServiceTable base dari nilai eax.
Dalam contoh ni, sebab eax ialah 0xed, function NtWriteFile akan dipanggil.
2) SYSENTER(High-performance kernel-mode switch instruction) > Baru (sejak Windows 2003)
ntdll!NtWriteFile:
77f4302f mov eax, 0xbf
77f4302f mov edx, 0x7ffe0300
77f4302f call edx
77f4302f ret 0x24
0x7ffe0300 adalah SharedUserData!SystemCallStub
Semua system call akan panggil function ni.
SharedUserData!SystemCallStub:
7ffe0300 mov edx, esp
7ffe0302 sysenter
7ffe0304 ret
Bila dah masuk kernel, sama je, kena lalu KiSystemService dan KiServiceTable juga.
SYSENTER kena buat extra call utk simpan EIP dan EFLAGS. Kalau int 2e, otomatik value tersebut disimpan(dalam stack rasanya).
Bila kernel-mode punya function dah habis, eip akan diambil dari dalam stack(user mode) yang disimpan masa call edx pada alamat 0x77f4302f dilaksanakan.
Jadi ret pada 0x7ffe0304 takkan di execute pun waimma sampai kiamat.
ref:
1.Reversing: Secrets of Reverse Engineering
2. thehackademy.net: DefeatingKernelNativeAPIHookersByDirect_KiServiceTable_Restoration.pdf
No comments:
Post a Comment
Terima kasih