사실 , Nt 와 Zw,   솔직히 헷갈렸었다 -_-;
이건 뭐 유저모드에서 ZwOpenProcess 를 호출하면 시스템콜을 통해서   특권전환(SYSENTER, INT 2E , SYSCALL)
을 거친뒤,  KiFastCallEntry를 통과해서 , NtOpenProcess가 호출되는 방식이고... (ntdll.dll을 살펴본 결과)

ZwOpenProcess를 커널모드에서 호출하면 , 시스템콜을 거치지않고 ,  EAX에 서비스넘버를 넣은뒤 , 바로 KiFastCallEntry가 호출되는것같다. (ntkrnlpa.exe을 살펴본 결과)

여기서 그렇다면 ,  커널모드에서  NtOpenProcess를 호출하는것과 ,  ZwOpenProcess를 호출하는것에는 어떠한 차이점이 있는가? 궁금하였는데,
마침 MS에서  VS2010의 출시를 맞아서 MSDN을 개편(?) 했는지는 몰라도 , 친절하게 설명이 나와있었다.


Using Nt and Zw Versions of the Native System Services Routines

The Windows native operating system services API is implemented as a set of routines that run in kernel mode. These routines have names that begin with the prefix Nt or Zw. Kernel-mode drivers can call these routines directly. User-mode applications can access these routines by using system calls.

-> 윈도우 운영체제의 Native Service API는  커널모드에서 동작하도록 설계된 루틴들의 집합체다.
이러한 루틴들은 Nt와 Zw 접두어로 시작하는 이름을 가진다.
커널모드 드라이버는 이러한 루틴들을 직접적으로 바로 호출할 수가 있다.
그러나 유저모드 어플리케이션은 시스템 콜을 통해서 이 루틴들에 접근할 수가 있다.





With a few exceptions, each native system services routine has two slightly different versions that have similar names but different prefixes. For example, calls to NtCreateFile and ZwCreateFile perform similar operations and are, in fact, serviced by the same kernel-mode system routine. For system calls from user mode, the Nt and Zw versions of a routine behave identically. For calls from a kernel-mode driver, the Nt and Zw versions of a routine differ in how they handle the parameter values that the caller passes to the routine.

-> 이러한 Native Service API들 중에서 , 몇가지 루틴들은 아주 약간씩 다른 버젼과 이름을 지니고 있는것을 확인할 수 있다.
NtCreateFile과 ZwCreateFile을 예로 들면, 서로 이름이 거의 비슷한것을 확인할 수 있고, 둘다 커널모드에서 작동하는 서비스이며, 실제로 이뤄지는 동작도 거의 비슷하다.
유저모드에서는 , Nt와 Zw루틴중 어떤것을 호출하던간에,  실제로 수행되는 작업은 동일하다.
(필자 주 : NtOpenProcess를 호출하게되면 , ntdll.dll의 ZwOpenProcess가 호출되죠.)
커널모드 드라이버에서 호출되게 되면 , Nt와 Zw 루틴은 실제 핵심 루틴을 호출하기전에 , caller(호출자)가 전달한 파라메터들을 핸들링하는 방식에서 차이를 보이게 된다.






A kernel-mode driver calls the Zw version of a native system services routine to inform the routine that the parameters come from a trusted, kernel-mode source. In this case, the routine assumes that it can safely use the parameters without first validating them. However, if the parameters might be from either a user-mode source or a kernel-mode source, the driver instead calls the Nt version of the routine, which determines, based on the history of the calling thread, whether the parameters originated in user mode or kernel mode. For more information about how the routine distinguishes user-mode parameters from kernel-mode parameters, see PreviousMode.

-> 커널모드 드라이버가 Zw루틴을 호출하게되면 , 파라메터들이 이미 검증된 파라메터들이라고 핵심 루틴에 알리게 된다.
즉 , 핵심루틴은 전달된 파라메터들이 이미 검증된 파라메터이기 때문에 안전하게 사용해도 되는 파라메터라고 추측하게 되어서 , 파라메터 검증과정을 건너뛰게 되는것이다. 그러나 Nt 서비스 루틴을 호출하게되면 , 파라메터들이 유저모드이건 커널모드이건 어떠한 모드에서 전달되었더라도 , Nt루틴 내부적으로 calling thread에 근거하여,  파라메터가 유저모드에서 넘어왔는지 커널모드에서 넘어왔는지 검증하는 과정을 거치게 된다.  루틴이 어떻게 유저모드 파라메터인지 , 커널모드 파라메터인지 검증하는지 이에 대해서 좀더 자세한 정보를 확인하고싶다면 ,  PreviousMode에 관해서 찾아보길 바란다.





When a user-mode application calls the Nt or Zw version of a native system services routine, the routine always treats the parameters that it receives as values that come from a user-mode source that is not trusted. The routine thoroughly validates the parameter values before it uses the parameters. In particular, the routine probes any caller-supplied buffers to verify that the buffers are located in valid user-mode memory and are aligned properly.

-> 유저모드에서 Nt나 Zw 루틴을 호출하게되면 , 해당 루틴은 항상 파라메터들을 검증하게된다.
(유저모드에서 넘어온 파라메터들을 신뢰할 수 없기 때문)
해당 루틴은 파라메터들을 핵심루틴 내부에서 사용하기전에 , 철저하게 파라메터들을 검증한다.
검증하는 과정이 여러가지가 있겠지만 , 그중에서 특별한것은 , 해당 루틴은 caller-suppplied buffer가 
적절한 유저모드 메모리에 위치해있는지,  정렬이 적절하게 되어있는지  조사하게 된다.






Native system services routines make additional assumptions about the parameters that they receive. If a routine receives a pointer to a buffer that was allocated by a kernel-mode driver, the routine assumes that the buffer was allocated in system memory, not in user-mode memory. If the routine receives a handle that was opened by a user-mode application, the routine looks for the handle in the user-mode handle table, not in the kernel-mode handle table.

-> 시스템 서비스 루틴은 파라메터를 받으면 , 추가적으로 어떠한 추측을 내린다.
만약에 어떤 루틴이  파라메터로  커널모드 드라이버에 의해서 할당된 버퍼의 포인터를 받았다면 ,  해당 루틴은 그 버퍼가 유저모드 메모리가 아닌,  시스템 메모리에 할당되어있다고 가정하게 된다.  또한 어떤한 루틴이 파라메터로 유저모드 어플리케이션에 의해 열린 핸들을 받았다고 한다면 ,  그 루틴은 커널모드 핸들테이블을 검색하는것이 아니라, 유저모드의 핸들테이블을 검색하게 된다.






In a few instances, the meaning of a parameter value differs more significantly between calls from user mode and from kernel mode. For example, theZwNotifyChangeKey routine (or its NtNotifyChangeKey counterpart) has a pair of input parameters, ApcRoutine and ApcContext, that mean different things, depending on whether the parameters are from a user-mode or kernel-mode source. For a call from user mode, ApcRoutine points to an APC routine and ApcContext points to a context value that the operating system supplies when it calls the APC routine. For a call from kernel mode,ApcRoutine points to a WORK_QUEUE_ITEM structure, and ApcContext specifies the type of work queue item that is described by theWORK_QUEUE_ITEM structure.

-> 헷갈리네요............알듯말듯 하면서도 번역불가.
위 내용들과 비슷한거같은데...(Help me)






잘못된 내용이 있다면 알려주세요.

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
by Sone 2010.05.25 20:48
API

스크롤 압박의 관계로  보실분만 클릭.

더보기

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
by Sone 2009.09.15 22:23
API

XP 서비스 번호별 API



더보기

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
by Sone 2009.09.09 23:57

윈도우XP에서  VS2008로

OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
로 빌드 시킨후 ,  프로세스를 Open 시도하려고 했으나...

계속 실패가 뜬다.

비스타에서 실행했더니 , 잘만된다... 
무엇 때문일까?


그래서 다른 권한은 없으려나 하고 조금 더 찾아보았더니,
MAXIMUM_ALLOWED 란것이 있었다.
이상하게 MSDN 온라인 검색을 해도  MAXIMUM_ALLOWED 란것은 찾아볼수가 없었다.

일단 ,
말 그대로  가능한 한 최대한 권한을 확보하는것을 뜻하는것 같다.

XP와 비스타에서 모두 잘 작동된다!

API 공부를 해본적이 없는데 ,  이런 시행착오를 겪어보면서  더 알아가게 되는것 같다..

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
by Sone 2009.03.27 15:46

출처 :   Dual 님의 블로그  (http://dual5651.hacktizen.com/new/82)


파일 열기(Open)
:파일 생성 & 여는데 쓰인다.

16-bit:
CreateFile

32-bit:
CreateFileA

wide:
CreateFileW


파일 입출력(Read&Write)
:파일을 입출력하는데 쓰인다.

ReadFile ;읽기

WriteFile ;쓰기


파일 접근(Access)

SetFilePointer ;포인터 조정


시스템 디렉토리 얻어오는 함수



16-bit:
GetSystemDirectory
32-bit:
GetSystemDirectoryA
wide:
GetSystemDirectoryW


.ini파일과 관련된 함수
:ini 구성설정에 관련된 함수들이다.

16-bit:
GetPrivateProfileString

GetPrivateProfileInt

WritePrivateProfileString

WritePrivateProfileInt

32-bit:
GetPrivateProfileStringA

GetPrivateProfileIntA

WritePrivateProfileStringA

WritePrivateProfileIntA

wide:
GetPrivateProfileStringW

GetPrivateProfileIntW

WritePrivateProfileStringW

WritePrivateProfileIntW


레지스트리와 관련된 함수
:레지스트리의 키를 생성 혹은 삭제시
16-bit:
RegCreateKey

RegDeleteKey
32-bit:
RegCreateKeyA

RegDeleteKeyA

wide:
RegCreateKeyW

RegDeleteKeyW

:현재 열려진 레지스트리 키를 읽을때
16-bit:
RegQueryValue
32-bit:
RegQueryValueA
wide:
RegQueryValueW
:레지스트리 키를 열때
16-bit:
RegCloseKey

RegOpenKey
32-bit:
RegCloseKeyA

RegOpenKeyA
wide:
RegCloseKeyW

RegOpenKeyW


객체에서 문자열을 읽을때:
16-bit:
GetWindowText

GetDlgItemText
32-bit:
GetWindowTextA

GetDlgItemTextA

wide:
GetWindowTextW

GetDlgItemTextW


정수여부에 상관됨:
GetDlgItemInt


객체의 텍스트를 지정:
16-bit:
SetWindowText

SetDlgItemText
32-bit:
SetWindowTextA

SetDlgItemTextA

wide:

SetWindowTextW

SetDlgItemTextW


메시지 박스:
16-bit:
MessageBox

MessageBeep
32bit:
MessageBoxA

MessageBoxExA

wide:
MessageBoxW

MessageBoxExW

메시지 관련:
16-bit:
SendMessage

WSPRINTF
32-bit:
SendMessageA
wide:
SendMessageW


날짜와 시간
:날짜와 시간을 구할때

GetSystemTime

GetLocalTime

SystemTimeToFileTime


윈도우(창) 생성 & 제거
:창을 생성 & 제거에 쓰이는 함수들
16-bit:
CreateWindow

DialogBoxParam

CreateWindowEx

DestroyWindow

EndDialog

showwindow

bitblt
32-bit:
CreateWindowA

CreateWindowExA

DialogBoxParamA
wide:
CreateWindowW

CreateWindowExW

DialogBoxParamW


CD-ROM 요구
:CD롬을 요구하는 함수 들입니다.
16-bit:
GetDriveType (만약 eax=5 라면 CD롬 체크 이다.)

GetLogicalDrives

GetLogicalDriveStrings
32-bit:
GetDriveTypeA

GetLogicalDrivesA

GetLogicalDriveStringsA
wide:
GetDriveTypeW

리턴 코드:


값 설명

0 Drive Cannot Be determined

1 Root Dir Does not exist

2 DriveRemoveable

3 A Fixed Disk (HardDrive)

4 Remote Drive(Network)

5 Cd-Rom Drive <==============

6 RamDisk

GetLogicalDrivesW

GetLogicalDriveStringsW


Win NumberSerial:
GETWINDOWWORD

GETWINDOWLONG


+ORC가 제안한 훌륭한 함수

BOZOSLIVEHERE

HMEMCPY

GLOBALGETATOMNAME
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
by Sone 2008.12.06 16:55
| 1 |

티스토리 툴바