라이프로그


[WDK]Scanner File System Minifilter Driver #1/ Kernel

주님 파일에 대해서 알고 싶어요

주님 파일에 대해서 알고 싶어요…

성령님 파일에 대해서 알려주세요…

음…WDK 의 샘플들을 보거라…..

예? WDK에 뭐...샘플들이 있나요???

그딴 것 ..봐봤자....소용 있을 까죠?

제 나이가 이제 40입니다….

이런..믿음 없는 친구..

그럼 파일에 대해서 알고 싶다는 말을 하지 말던지

그거라도 목숨걸고 보거라..

속지말라...마귀에게..나이의 마귀에게 속지말거라 미친감자~~~

그렇죠? 나이때문에 WDK 샘플을 보지못한다는것...의미가 없다는것~

마귀짓이죠?

예수님의 이름으로 명하노니~~나이탓을 하게 하는 귀신아

이 시간 묶음을 놓고 떠나갈 지어다~~

할렐루야~~

이제 볼수 있는 에너지가 생기네요…

주님

http://code.msdn.microsoft.com/windowshardware/Scanner-File-System-426c8cbe

이제 WDK 소스를 웹에서 구할 수 있군요..주님~~

주님 소스에 대한 설명도 있네요

열심히 읽거라….

주님 보시다 시피 다 영어입니다.

겁먹지 말거라...밥이라고 생각해라..

겁먹을 거면..나를 떠라라…

흐..알겠습니다.

겁먹지 않습니다..밥이라고 생각하고 먹겠습니다.

The Scanner minifilter comprises both kernel-mode and user-mode components. The kernel-mode component recognizes appropriate moments for scanning a file's data and passes it to the user-mode component for further validation. The user-mode component creates a number of threads that await validation requests and corresponding data from the kernel-mode component. After scanning the data for occurrences of a "foul" string, the user-mode component sends an appropriate response to the kernel-mode component.

음…밥이라구요..? 그냥 먹으면 되는건가요? 소화가 되지 않을 것도 있을 수 도 있지만

일단 먹겠습니다.

The Scanner minifilter comprises both kernel-mode and user-mode components.

스캐너 미니필터는 말이죠~ 컴프라이즈(comprises) 합니다. 구성한다~이 말이죠~~~뭘로 구성하냐?

커널모드와 유저모 컴포넌트로 말이죠~~ㅋㅋ 맛있다~!

The kernel-mode component recognizes appropriate moments for scanning a file's data and passes it to the user-mode component for further validation.

커널 모드 컴포넌트는 말이죠~~~네코그나이즈 합니다. 인식한다는 말이죠~~ 뭘~~뭘 인식할까요??

appropriate 어프로프리에이티 모먼트...적절한 순간을 말이죠...적절한 순간을 인식한다는 말입니다.^~

무슨 적절한 시간일까요? for 포~ scanning a file’s data 음...파일의 데이타를 스캔하기 위한 순간을 말하는 것입니다…. 파일 내용을 까보는 거죠^^~ 말이 너무 거친가요~ ㅋ..파일 내용을 확인한다는 거죠~ ㅋ~

앤드~ 그리고 말이죠~~~ 또...하는 게 있다는 것이죠~ 뭘할까요?

passes 통과를 시킵니다...뭘요???? it 그것을 말이죠..to the user-mode component에게 말이죠~~

for 포~~ 뭐를 하기 위해서냐~~!! further 좀더 … validation 검증을 하기위해서 말이죠…

정리 되셨죠~~.. 점도 많은 검증을 위해서 유저모드 컴포넌트에게 전달한다는 말입니다…

“커널모드 컴포넌트는 파일내용을 스캔하기 가장 적함한 순간을 인식하고, 유저모드컴포넌트에게 파일 검증을위해 전달을 한다”

자 다음 문장~~

The user-mode component creates a number of threads that await validation requests and corresponding data from the kernel-mode component.

유저모드 컨포넌트는 만듭니다...뭐를요?? a number of threads를 말이죠~~ 스레드를 만든다는 거죠...음...커널모드 컨포넌트로 부터 요청이 오면..그때 스레드를 만드는군요..암튼…~넘어갑시다…

 그 스레드는 뭘하는 거냐? await 기다립니다...뭐를? valiation requests 검증 요청을 말이죠~~그리고

corresponding 코레스폰딩~~data 일치하는 대응하는~~데이타~~를 말이죠..그런데 그놈은 from 커널모드 컨포넌트에게 온것입니다...음..

음..

제가 잘못 이해했네요…

스레드를 만드는 시점은 커널모드로 부터 요청이 올때 만드는 것이 아니고..유저모드 컴포넌트는 무조건 스레드를 만들어야 하고. 그 스레드는 커널이 검증을 요청과 데이타를  기다는 것이군요~

“유저모드 컴포넌트는 커널모드 컴포넌트로 부터 오는 검증요청과 데이타를 받기위한 스레드를 하나 만듭니다.”

After scanning the data for occurrences of a "foul" string, the user-mode component sends an appropriate response to the kernel-mode component.

다음 문장~~ 스캐닝을 하고 나서...뭘 스캔했냐?? 데이타를 말이죠~~ 했다 이겁니다…”foul”이라는 문자가 나오는지 occurrence 하는지 말이죠~~~ occurrence 가 명사군요...출현..등장… occurrnces 이니까..출현들~~! 여러번 등장하는지 확인하는 것입니다…

그리고, 유저모드 컨포넌트는 전달합니다… 뭐를요? an appropriate response를 말이죠~~ 적당한 응답을 말이죠~~

“ ‘foul’이라는 문자열이 커널에서 보내준 데이타 안이 있는지 검사하고, 그 검사 결과를 커널에 전달합니다.”

The kernel-mode component scans files with specific extensions only. The file is first scanned on a successful open. If the file was opened with write access, it is scanned again before a close. Scanning is also performed on data that is about to be written to a file. Writes will be rejected if any occurrences of a "foul" string are found in the data. If a "foul" string is detected during the closing of a file, a debug message is printed.

The kernel-mode component scans files with specific extensions only.

커널모드 컴포넌트는 스캔합니다. 파일을..with 과 함게 말이죠~ 특별한 확장자들에 한해서 말이죠~~ㅋㅋ

“ 커널모드 컴포넌트는 특별한 확장에 대해서만 스캔합니다.”

The file is first scanned on a successful open.

그 파일이 말이죠~~ 아니 그 파일은...입니다. 처음 스캔된….on a successful open...성공적으로 열은? 음…

“처음 스캔은 해당 파일이 성공적으로 열렸을 때 합니다.”

If the file was opened with write access, it is scanned again before a close.

만일 그 파일이...열렸다면...뭘료? 쓰기 접근으로~~, 그러면, 그것은 스캔됩니다. 닫히기 전에..말이죠~~

“그런데 해당 파일이 쓰기속성으로 오픈되었으면, 파일 닫을때 다시 검사합니다. 파일이 변경되었을 수 있으니까요~”

 Scanning is also performed on data that is about to be written to a file.

스캐닝을 말이죠~~입니다(is) ..물론...실행됩니다...on data..데이타에 말이죠~~그 데이타는 뭐냐?? that is 입니다. 대해서~~~~ 파일에 쓰여진 데이타~~!!!!

“당연히 파일에 쓰여진 데이타에 대해서 검사를 하는 것이죠~”

Writes will be rejected if any occurrences of a "foul" string are found in the data.

쓰는것~~은 일것입니다...리젝되는 것 말입니다...만일...어떤...출현이있으면 말입니다..뭐냐? “foul”문자열 말입니다~~~

“만일 데이타 안에 ‘foul’이라는 단어가 나타나면, 쓰기를 거절합니다.”

 If a "foul" string is detected during the closing of a file, a debug message is printed.

”foul’ 문자열이 탐지되면 말이죠….파일을 닫는 동안 말이죠...그러면 디버그 메시지가 출력될것입니다…….

“그리고, 디버그 스트링으로 ‘foul’이 발견되었다고 표시하죠~”

주님...일단 설명은 봤습니다. 그런데..

‘fou’ ‘악취’ 라는 단어가 있는지 검사하는 거네요..그런데 신기하게...검사를 유저모드에서 한다고 하네요...커널모드에서 하지 않고...그렇다면, 커널모드에서는 계속해서 데이타를 유저모드에 전달해야 할텐데...성능에 문제가 생기지 않을까요? 걱정이 되네요…

그런 걱정할 필요없느니라...소스나 보거라~~

예 이제 소스를 확인해볼께요….

그런데, MS에서는 소스도 웹을통해 잘 확인할 수 있도록 서비스를 하고 있네요..

언제 이렇게 바뀌었대요^^~

참 편하고 좋네요~~

http://code.msdn.microsoft.com/windowshardware/Scanner-File-System-426c8cbe/sourcecode?fileId=51303&pathId=1839969052

scanner.c 먼저 봅니다. 주님~~

아니 헤더먼저 보겠습니다. 주님~~

typedef struct _SCANNER_DATA { 
    
// 
   
//  The object that identifies this driver. 
   
// 
    PDRIVER_OBJECT DriverObject; 

   
// 
   
//  The filter handle that results from a call to 
   
//  FltRegisterFilter. 
   
// 
    PFLT_FILTER Filter; 

   
// 
   
//  Listens for incoming connections 
   
// 
    PFLT_PORT ServerPort; 

   
// 
   
//  User process that connected to the port 
   
// 
    PEPROCESS UserProcess; 

   
// 
   
//  Client port for a connection to user-mode 
   
// 
    PFLT_PORT ClientPort; 
} SCANNER_DATA, *PSCANNER_DATA;

SCANNER_DATA 구조체는 뭔가요???

파일 필터 드라이버로서 역할을 하기위해 필요한 정보를 이 구조체에 담아놓았다.

1. 이 필터 드라이버

2. 파일필터 매니저가 준 파일 필터 핸들

3. 서버(?) 포트, 이 서버는 파일 필터 매니저가 서버일 것 같다. 서비스를 받기 위해 접속해야하는 포트일        것 같지 안은가?

4. UserProcess 유저영역의 포로세스…

5. 클라이언트 포트? 유저모드에서 실행되는 프로세스가 클라이언트인가? 암튼 그 클라이언트와 연결되는 포트…

참 재미있네요.. 포트~

포트라고 하면 네트워크 TCP IP에서만 사용할 줄 알았는데..그렇지 않네요.

뭔가 데이타를 주고 받는 행위를 위해 사용하는 것을 일반적으로 사용하는 단어인가 보내요..

ㅋ~

extern SCANNER_DATA ScannerData; 
위에서 선언한 구조체를 만들고..다른 소스도 접근하개 오픈하고 있네요..ㅋ~


typedef struct _SCANNER_STREAM_HANDLE_CONTEXT { 

   
BOOLEAN RescanRequired; 
    
} SCANNER_STREAM_HANDLE_CONTEXT, *PSCANNER_STREAM_HANDLE_CONTEXT;
 
음…~ 스캐너 스트림 핸들 콘텍스트 … 리스캔요청 변수 하나 밖에 없네요~~뭘까요???

암튼...Holy Spirit~ … 다시 스캔을 요청할 지 말지만 저장하고 있군요..보통 context라고 하면..현재 상황을 저장하고 있는 것을 말하는데 말입니다. 재스캔을 요청했는지 여부를 저장하고 있군요..


#pragma warning(push) 
#pragma warning(disable:4200) // disable warnings for structures with zero length arrays.
 

typedef struct _SCANNER_CREATE_PARAMS { 

   
WCHAR String[0]; 

} SCANNER_CREATE_PARAMS, *PSCANNER_CREATE_PARAMS;
 

#pragma warning(pop)
 

스캐너..음..이제보니 SCANNER_는 그냥 접두어인것 같네요..ㅋ~

크리에이트 파람~~만들때..사용하는 인자인데..문자열을 저장하나보내요…

/////////////////////////////////////////////////////////////////////////// 
// 
//  Prototypes for the startup and unload routines used for  
//  this Filter. 
// 
//  Implementation in scanner.c 
// 
/////////////////////////////////////////////////////////////////////////// 
DRIVER_INITIALIZE DriverEntry;

선언들입니다.~ 시작하고 언로드하고...루틴들을 말이죠~~ 이 필터에서 말이죠~~

그리고...전역변수 하나 선언합니다. DriverEntry...음..신기하네요.. DRIVER_INITIALIZE 를 DriverEntry라는 이름으로 만드는군요…. 드라이버의 시작이라는 것인데..이것을 변수로 만드는군요..함수가 아니고..음...드라이버 시작할때 사용하려고 만드는 것일까요?

NTSTATUS 
DriverEntry ( 
   _In_ PDRIVER_OBJECT DriverObject, 
   _In_ PUNICODE_STRING RegistryPath 
   ); 
재미있네요.. DriverEntry 라는 함수입니다. 이상하네요...아까.. DriverEntry라는 변수는 뭘까요? 암튼..이곳이 이 드라이버의 시작입니다…. 주님~! 뭔가요??지혜의 근본님 뭔가요?


NTSTATUS 
ScannerUnload ( 
   _In_ FLT_FILTER_UNLOAD_FLAGS Flags 
   ); 
 스캐너를 언로드 할때..사용되는 분인것 같네요… FLT_FILTER_UNLOAD_FLAGS 음 파일 필터 매니저님께서 선언해주신 함수같습니다.~~

 
NTSTATUS 
ScannerQueryTeardown ( 
   _In_ PCFLT_RELATED_OBJECTS FltObjects, 
   _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags 
   ); 
제목이 왜이러죠? Teardown 음...해체..분해~~..쿼리를 하는데..해체를 쿼리한다고??왜하죠?

인자를 보니, 필터오브젝트, 그리고 플래그...를 전달하는군요~~!

 
FLT_PREOP_CALLBACK_STATUS 
ScannerPreCreate ( 
   _Inout_ PFLT_CALLBACK_DATA Data, 
   _In_ PCFLT_RELATED_OBJECTS FltObjects, 
   _Flt_CompletionContext_Outptr_ 
PVOID *CompletionContext 
   ); 
음 이친구는 그것 같네요...파일 열기 전~!!


FLT_POSTOP_CALLBACK_STATUS 
ScannerPostCreate ( 
   _Inout_ PFLT_CALLBACK_DATA Data, 
   _In_ PCFLT_RELATED_OBJECTS FltObjects, 
   _In_opt_ 
PVOID CompletionContext, 
   _In_ FLT_POST_OPERATION_FLAGS Flags 
   ); 
음..이 친구는 파일 열고 나서~~~

 
FLT_PREOP_CALLBACK_STATUS 
ScannerPreCleanup ( 
   _Inout_ PFLT_CALLBACK_DATA Data, 
   _In_ PCFLT_RELATED_OBJECTS FltObjects, 
   _Flt_CompletionContext_Outptr_ 
PVOID *CompletionContext 
   ); 
음..이친구는 지우기 전~

 
FLT_PREOP_CALLBACK_STATUS 
ScannerPreWrite ( 
   _Inout_ PFLT_CALLBACK_DATA Data, 
   _In_ PCFLT_RELATED_OBJECTS FltObjects, 
   _Flt_CompletionContext_Outptr_ 
PVOID *CompletionContext 
   );
 
 이 친구는 쓰기전~

 
#if (WINVER >= 0x0602)
 

FLT_PREOP_CALLBACK_STATUS 
ScannerPreFileSystemControl ( 
   _Inout_ PFLT_CALLBACK_DATA Data, 
   _In_ PCFLT_RELATED_OBJECTS FltObjects, 
   _Flt_CompletionContext_Outptr_ 
PVOID *CompletionContext 
   );
 
 제 이치구는 6.2 이상의 커널 버전을 가지고 있어야 하고….Windows 8 이다~~

파일시스템콘트롤  전~~ 뭔말이지??? 모르겠네요...인자를 보면~~ .. 콜백 데이타, 필터오브젝트, 그리고, 필터 완료 콘텍스트? ㅋ~ 모르겠어요~~ 주인님~~~


#endif
 

NTSTATUS 
ScannerInstanceSetup ( 
   _In_ PCFLT_RELATED_OBJECTS FltObjects, 
   _In_ FLT_INSTANCE_SETUP_FLAGS Flags, 
   _In_ DEVICE_TYPE VolumeDeviceType, 
   _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType 
   );
 

인스턴스 셋업~~~?! 필터 오브젝트, 플래그, 볼륨 디바이스 종류, 볼륨 파일시스템 종류~~~

// 
//  Constant FLT_REGISTRATION structure for our filter.  This 
//  initializes the callback routines our filter wants to register 
//  for.  This is only used to register with the filter manager 
// 

const FLT_OPERATION_REGISTRATION Callbacks[] = { 

   { IRP_MJ_CREATE, 
     
0
     ScannerPreCreate, 
     ScannerPostCreate}, 

   { IRP_MJ_CLEANUP, 
     
0
     ScannerPreCleanup, 
     NULL}, 

   { IRP_MJ_WRITE, 
     
0
     ScannerPreWrite, 
     NULL},
 

#if (WINVER>=0x0602)
 

   { IRP_MJ_FILE_SYSTEM_CONTROL, 
     
0
     ScannerPreFileSystemControl, 
     NULL 
   },
 

#endif
 

   { IRP_MJ_OPERATION_END} 
};

 필터에게 등록 할때..사용하는 구조체이군요~~

어떤 IRP 을 필터할지..그리고, 필터함수는 뭔지를 지정합니다. 그런데 재미있는것은

Pre와 Post 함수를 지정하는 군요.. Pre는 전~~에 호출 되는 함수이고 Post는 후에 호출되는 함수겠군요..

주님~!

const FLT_REGISTRATION FilterRegistration = { 

   
sizeof( FLT_REGISTRATION ),         //  Size 
   FLT_REGISTRATION_VERSION,           
//  Version 
   
0,                                  //  Flags 
   ContextRegistration,                
//  Context Registration. 
   Callbacks,                          
//  Operation callbacks 
   ScannerUnload,                      
//  FilterUnload 
   ScannerInstanceSetup,               
//  InstanceSetup 
   ScannerQueryTeardown,               
//  InstanceQueryTeardown 
   NULL,                               
//  InstanceTeardownStart 
   NULL,                               
//  InstanceTeardownComplete 
   NULL,                               
//  GenerateFileName 
   NULL,                               
//  GenerateDestinationFileName 
   NULL                                
//  NormalizeNameComponent 
}; 

오늘은 여기까지…

Google 드라이브에서 게시악용사례 신고 5분마다 자동으로 업데이트

덧글

  • Paul 2013/12/09 12:27 #

    Scanner 샘플 하나를 씹어드셨군요 ㅎㅎ 고생하셨습니다.
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.



통계 위젯 (화이트)

02
13
581237

이 이글루를 링크한 사람 (화이트)

105