12 June 2012

System Call


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