Zw와 Nt API차이는 뭘까? 알아보았습니다.
두개의 차이점은 유저모드와 커널모드에서 함수의 형태가 다른 것을 볼 수 있었습니다.
실제코드를 확인하기 위해 ZwCreateProcess코드와 NtCreateProcess코드를 확인해보았습니다.
유저모드 호출시!
차이를 알아보기 위해 실제 호출되는 함수의 내부를 보았습니다.
ZwCreateProcess |
NtCreateProcess |
유저레벨에서 호출시 EAX에 서비스 넘버인 0x4F를 입력하고 DEX에 스택포인터를 저장하여 KiSystemService의 Routine을 타게 됩니다.
자세히보니 호출된 함수의 주소가 같습니다.
즉! 유저레벨에서 ZwCreateProcess와 NtCreateProcess 호출시 같은 함수가 호출되는 것을 볼 수 있습니다.
커널모드 호출시!
ZwCreateProcess |
NtCreateProcess |
커널레벨 호출시 두개의 함수는 다른 함수를 호출하게 됩니다.
ZwCreateProcess호출시! 유저모드와 동일하게 KiSystemService Routine을 타고
NtCreateProcess호출시! KiSystemService Routine을 타지 않고 직접적으로 system call로 점프뛰게 된다.
(NtCreateProcessEx내부 트레이싱 결과 : PspCreateProcess로 점프)
종합해보면 유저모드에서 Zw와 Nt API는 같은 함수를 호출하게되며 KiSystemService Routine을 타게되고
커널모드에서 호출시 Zw는 유저모드와 같게 KiSystemService Routine을 Nt함수는 systemcall로 직접 점프뛴다....
솔직히 아직 아리까리합니다...추후 내용추가하며 진행해볼 예정입니다.
'Security > Reversing' 카테고리의 다른 글
[Anti-VM] - 어셈블리 STR편 (0) | 2018.01.14 |
---|---|
PEB구조체 LDR을 이용한 Kernel32.dll주소 찾기. (0) | 2017.12.07 |
[AntiVM 탐지 우회] (0) | 2017.03.27 |
※함수호출규약 (0) | 2017.03.15 |
[Win32 API] PAGE_GUARD예외 처리특성을 통한 안티디버깅 (0) | 2016.11.17 |
댓글