-
-
[求助]inline hook NtQueryDirectoryFile遇到的问题
-
发表于: 2010-10-11 16:44 3004
-
NTSTATUS MyNtQueryDirectoryFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass,
IN BOOLEAN ReturnSingleEntry,
IN PUNICODE_STRING FileName OPTIONAL,
IN BOOLEAN RestartScan
)
{
//调用原函数
RtlInitAnsiString(&HideDirFile,"abc");
rc=OriginalNtQueryDirectoryFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,FileInformation,Length,FileInformationClass,ReturnSingleEntry,FileName,RestartScan);
if(NT_SUCCESS(rc)&&FileInformationClass==FileBothDirectoryInformation)
{
newLenth = Length;
currentDirInfo = (PFILE_BOTH_DIR_INFORMATION)FileInformation;
do
{
offset = currentDirInfo->NextEntryOffset;
RtlInitUnicodeString(&uniFileName,currentDirInfo->FileName);
RtlUnicodeStringToAnsiString(&ansiFileName,&uniFileName,TRUE);
RtlUnicodeStringToAnsiString(&ansiDirName,&uniFileName,TRUE);
//DbgPrint("文件1%s",ansiFileName.Buffer);
if( RtlCompareMemory(ansiFileName.Buffer,HideDirFile.Buffer,HideDirFile.Length ) == HideDirFile.Length)
{
DbgPrint("9");
if (0 == offset)
{
DbgPrint("8");
if (lastDirInfo)
{
DbgPrint("1");
lastDirInfo->NextEntryOffset = 0;
newLenth -= Length - position;
}
else
{
currentDirInfo->NextEntryOffset = 0;
Length = 0;
DbgPrint("2");
return rc;
//__asm
//{
//popad
//mov esp,ebp
//pop eax
//mov ebp,eax
//mov eax,rc
//ret 0x2C
//}
}
}
else
{
DbgPrint("3");
RtlCopyMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, Length - position - offset);
newLenth -= offset;
position += offset;
}
}
else
{
position += offset;
lastDirInfo = currentDirInfo;
currentDirInfo = (PFILE_BOTH_DIR_INFORMATION)((PUCHAR)currentDirInfo + offset);
}
} while (0 != offset);
//RtlFreeAnsiString(&ansiDirName);
//RtlFreeAnsiString(&ansiFileName);
Length = newLenth;
}
return rc;
//__asm
//{
//popad
//mov esp,ebp
//pop ebp
//mov eax,rc
//ret 0x2C
//}
}
Dbgview.exe中已经看到输出9,8,1了,但是打开磁盘还看得到abc目录或文件。
lastDirInfo->NextEntryOffset = 0;
好象没什么作用。
RtlCopyMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, Length - position - offset);
改成:
RtlMoveMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, Length - position - offset);
有什么区别吗?
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass,
IN BOOLEAN ReturnSingleEntry,
IN PUNICODE_STRING FileName OPTIONAL,
IN BOOLEAN RestartScan
)
{
//调用原函数
RtlInitAnsiString(&HideDirFile,"abc");
rc=OriginalNtQueryDirectoryFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,FileInformation,Length,FileInformationClass,ReturnSingleEntry,FileName,RestartScan);
if(NT_SUCCESS(rc)&&FileInformationClass==FileBothDirectoryInformation)
{
newLenth = Length;
currentDirInfo = (PFILE_BOTH_DIR_INFORMATION)FileInformation;
do
{
offset = currentDirInfo->NextEntryOffset;
RtlInitUnicodeString(&uniFileName,currentDirInfo->FileName);
RtlUnicodeStringToAnsiString(&ansiFileName,&uniFileName,TRUE);
RtlUnicodeStringToAnsiString(&ansiDirName,&uniFileName,TRUE);
//DbgPrint("文件1%s",ansiFileName.Buffer);
if( RtlCompareMemory(ansiFileName.Buffer,HideDirFile.Buffer,HideDirFile.Length ) == HideDirFile.Length)
{
DbgPrint("9");
if (0 == offset)
{
DbgPrint("8");
if (lastDirInfo)
{
DbgPrint("1");
lastDirInfo->NextEntryOffset = 0;
newLenth -= Length - position;
}
else
{
currentDirInfo->NextEntryOffset = 0;
Length = 0;
DbgPrint("2");
return rc;
//__asm
//{
//popad
//mov esp,ebp
//pop eax
//mov ebp,eax
//mov eax,rc
//ret 0x2C
//}
}
}
else
{
DbgPrint("3");
RtlCopyMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, Length - position - offset);
newLenth -= offset;
position += offset;
}
}
else
{
position += offset;
lastDirInfo = currentDirInfo;
currentDirInfo = (PFILE_BOTH_DIR_INFORMATION)((PUCHAR)currentDirInfo + offset);
}
} while (0 != offset);
//RtlFreeAnsiString(&ansiDirName);
//RtlFreeAnsiString(&ansiFileName);
Length = newLenth;
}
return rc;
//__asm
//{
//popad
//mov esp,ebp
//pop ebp
//mov eax,rc
//ret 0x2C
//}
}
Dbgview.exe中已经看到输出9,8,1了,但是打开磁盘还看得到abc目录或文件。
lastDirInfo->NextEntryOffset = 0;
好象没什么作用。
RtlCopyMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, Length - position - offset);
改成:
RtlMoveMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, Length - position - offset);
有什么区别吗?
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
赞赏
看原图
赞赏
雪币:
留言: