본문 바로가기

My Study/Programming&Theory

MoveFileEx 의 MOVEFILE_DELAY_UNTIL_REBOOT

MoveFileEx 함수를 사용해서 플래그를 MOVEFILE_DELAY_UNTIL_REBOOT를 주게되면 컴퓨터 리붓 시 파일 이름 변경 및 파일 삭제가 가능한 것을 알 수 있습니다. 이러한 파일 리네임 기능을 윈도우 자체적으로 제공을 해주지요.

그리고 위 함수로 인해 등록을 시키면 아래와 같은 레지스트리 경로에 해당 파일 경로가 등록되게 됩니다.


"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\PendingFileRenameOperations"


그러면 윈도우는 저 레지스트리 값을 언제 읽고 내부에 있는 언제 파일 리네임 처리를 언제 할까요??

간단하게 콜스택만 보면 알 수 있습니다.


해당 파일을 삭제하기 위해서는 NtOpenFile의 두 번째 인자로 DELETE 라는 플래그를 함께 주어야합니다.

그러면 그 때 BP를 걸어 콜스택을 확인해보죠


(Windows 7 x86 에서 진행되었습니다.)

1: kd> kn

 # ChildEBP RetAddr  

00 8dfa3c14 830521ea nt!NtOpenFile

01 8dfa3c14 770870b4 nt!KiFastCallEntry+0x12a

02 002bf4c8 77085ce4 ntdll!KiFastSystemCallRet

03 002bf4cc 48506a7f ntdll!NtOpenFile+0xc

04 002bf500 48509af5 smss!SmpOpenTargetFile+0x24

05 002bf598 4850a2c7 smss!SmpProcessFileRenames+0xbb

06 002bf808 4850a607 smss!SmpLoadDataFromRegistry+0x427

07 002bf978 4850c290 smss!SmpInit+0x1e4

08 002bfa18 4850e946 smss!wmain+0x1f5

09 002bfa5c 77045e7a smss!NtProcessStartupW_AfterSecurityCookieInitialized+0x21f

0a 002bfa9c 770a37c8 ntdll!__RtlUserThreadStart+0x28

0b 002bfab4 00000000 ntdll!_RtlUserThreadStart+0x1b


1: kd> dt _OBJECT_ATTRIBUTES 002bf548

ntdll!_OBJECT_ATTRIBUTES

   +0x000 Length           : 0x18

   +0x004 RootDirectory    : (null) 

   +0x008 ObjectName       : 0x001575d8 _UNICODE_STRING "\??\C:\Users\Administrator\Desktop\1.txt"

   +0x00c Attributes       : 0x40

   +0x010 SecurityDescriptor : (null) 

   +0x014 SecurityQualityOfService : (null) 


1.txt는 삭제하라고 MoveFileEx에서 등록을 해두었습니다. 호출된 콜스택을 보면
Session Manager 프로세스의 초기화 루틴에서 진행되고 있는 것을 알 수 있습니다.

그 과정을 진행하는 함수는 smss.exe의 SmpProcessFileRenames 함수가 되겠네요.
그리고 SmpProcessFileRenames 함수는 내부적으로 보면 smss!SmpFileRenameList 전역변수를 사용해서 리스트를 얻네요.
하지만 이 때는 레지스트리에 등록된 BOOT START 드라이버들이 이미 로드된 상황이라서 드라이버보단 우선순위가 낮다고 볼 수 있습니다.

아래는 관련 코드들입니다.

Windows 7 x86 에서 SmpProcessFileRenames 함수 내용


ReactOS 의 SmpProcessFileRenames


'My Study > Programming&Theory' 카테고리의 다른 글

Windows Access Tokens  (0) 2014.11.04
Dll Self Unloading  (7) 2014.07.08
Visual Studio 컴파일 속도(최적화 옵션)  (0) 2014.03.23
VirtualQuery 동작  (1) 2014.03.11
Application Verifier 로 프로그램 체크  (2) 2014.03.01