'IRP_MJ_SET_INFORMATION'에 해당되는 글 2건

  1. 2011/06/21 이름변경을 위한 IRP_MJ_SET_INFORMATION IRP 생성
  2. 2008/12/05 STATUS_MEDIA_WRITE_PROTECTED 1

이름변경을 위한 IRP_MJ_SET_INFORMATION IRP 생성
2011/06/21 09:58


기본적으로 ZwSetInformationFile 함수를 사용하나 rootkit등의 우회나 이름 변경시 추가 작업을 위한 hook등이 필요할때 드라이버에서 IRP_MJ_SET_INFORMATION IRP를 생성하여 파일의 이름을 변경한다.

파일명은 //device//harddiskvolume[n]//path를 포함한 file명 또는 //??//[drive]://path를 포함한 file명, //DosDevice//[drive]://path를 포함한 file명 와 같이 설정하는 점과 직접 생성한 IRP 이므로 완료루틴에서 pending 처리하지 않는다는 점을 고려한 대략의 코드는 아래와 같다.

IRP_MJ_SET_INFORMATION의 dispatch 루틴에서 특정 원본 파일의 이름을 강제로 a.ppt로 변경하는 코드이므로 원하는 파일명을 rename 하기 위해서는 추가적으로 FileObject를 구하여 한다.

XP에서 간단한 테스트는 문제없었으나 실제 사용을 위해서는 OSR의 Cracking Rename Operations 참고하여 수정하여 사용할것.(책임회피)
http://www.osronline.com/article.cfm?article=85
[code c++]
{
...

PIO_STACK_LOCATION pIrpSp;
KEVENT event;
NTSTATUS status;
PIRP pNewIrp = NULL;
PFILE_RENAME_INFORMATION pNewRename = NULL;
ULONG NewRenameLen =  wcslen(L"\\??\\c:\\a.ppt") * 2;
ULONG NewRenameSize = sizeof(FILE_RENAME_INFORMATION) + NewRenameLen;

KeInitializeEvent(&event, SynchronizationEvent, FALSE);

pNewRename = ExAllocatePoolWithTag(PagedPool, NewRenameSize, 'hong');
if(pNewRename == NULL)
  /// return 리소스부족;

memcpy(pNewRename, pRenameInfo, sizeof(FILE_RENAME_INFORMATION));
pNewRename->FileNameLength = NewRenameLen;
wcsncpy(pNewRename->FileName, L"\\??\\c:\\a.ppt", NewRenameLen/2);

pNewIrp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
if(pNewIrp == NULL)
  /// return 리소스부족;

pNewIrp->Flags |= IRP_BUFFERED_IO;
pNewIrp->RequestorMode = KernelMode;
pNewIrp->UserIosb = &pIrp->IoStatus;
pNewIrp->UserEvent = &event;
pNewIrp->Tail.Overlay.OriginalFileObject = currentIrpStack->FileObject; // 원본 File Object
pNewIrp->Tail.Overlay.Thread = PsGetCurrentThread();
pNewIrp->AssociatedIrp.SystemBuffer = (PVOID)&pNewRename;

pIrpSp = IoGetNextIrpStackLocation(pNewIrp);
pIrpSp->MajorFunction = IRP_MJ_SET_INFORMATION;
pIrpSp->FileObject = currentIrpStack->FileObject;
pIrpSp->DeviceObject = DeviceObject;
pIrpSp->Parameters.SetFile.Length = NewRenameSize;
pIrpSp->Parameters.SetFile.FileInformationClass = FileRenameInformation;
pIrpSp->Parameters.SetFile.FileObject = currentIrpStack->FileObject;
pIrpSp->Parameters.SetFile.ReplaceIfExists = pNewRename->ReplaceIfExists;

IoSetCompletionRoutine(pNewIrp, CompleteRoutine, 0, TRUE, TRUE, TRUE);
IoCallDriver( devExt->NLExtHeader.AttachedToDeviceObject, pNewIrp );
KeWaitForSingleObject( &event, Executive, KernelMode, TRUE, 0);
ExFreePoolWithTag(pNewRename, 'hong');

        ...
}
/// 직접만든 IRP는 pending을 하지 않음
NTSTATUS CompleteRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp,PVOID Context)
{
*Irp->UserIosb = Irp->IoStatus;
KeSetEvent(Irp->UserEvent, 0, FALSE);
IoFreeIrp(Irp);

return STATUS_MORE_PROCESSING_REQUIRED;
}
[/code]
2011/06/21 09:58 2011/06/21 09:58
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다


STATUS_MEDIA_WRITE_PROTECTED
2008/12/05 09:29
파일 필터 드라이버 기능중에 이동저장장치(외장하드, USB저장장치등)에 쓰기금지기능이 있다.
이동저장장치에서 자유롭게 읽기는 가능해도 쓰기는 안되게 하는 기능인데...
이 기능이 다른 프로그램에서는 제대로 동작하는 한글2007에서는 원본파일을 강제로 2KB로 만들어 버린다.

코드를 살펴보니 IRP_MJ_WRITE시 STATUS_ACCESS_DENIED를 리턴하여 쓰기금지 기능을 수행하고 있다.
대체로 양호하게 동작을 수행하는데 유독 한글2007에서만 파일이 깨진다.

Filemon, Filespy로 IRP를 들여다 봐도 별반 차이가 없고 왜 그럴까 하던차에 SD 메모리카드에 lock기능이 있길래 lock으로 설정을 하고 쓰기기능을 수행한 결과.

눈에 띄는게 IRP_MJ_SET_INFORMATION의 FileEndOfFileInformation 일때STATUS_MEDIA_WRITE_PROTECTED 값을 리턴한다.

MSDN에 이런 내용이 있다.

FileEndOfFileInformation
This is called when someone is trying to change the logical size of the stream. Note that when the cache manager’s lazy writer thread attempts to set a new end of file no oplock check is made. This is because the check will have been made previously when the real write request came in.

결국 이동저장장치에 쓰기금지를 하려면
일반적으로 IRP_MJ_WRITE에서 막으면 되겠지만 프로그램에 따라(특히 한글2007 같이 cache를 사용한다면)...
IRP_MJ_SET_INFORMATION(FileEndOfFileInformation)에서도 알맞는 처리를 해줘야 한다.

NTSTATUS.H를 참조해서 STATUS_ACCESS_DENIED를 하던지...STATUS_MEDIA_WRITE_PROTECTED를 하던지 취향에 맞게 하면 되겠다.
2008/12/05 09:29 2008/12/05 09:29
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • PROpecia 2011/09/14 04:19  댓글주소  수정/삭제  댓글쓰기
    좋은 정보 감사! ㅎㅎ
    즐거운 하루 되세요~