предупреждение - все это не официально поддерживается. непризнанные функции!
существует 100% чистое решение, основанное на NtAreMappedFilesTheSame
NTSYSAPI
NTSTATUS
NTAPI
NtAreMappedFilesTheSame (
__in PVOID File1MappedAsAnImage,
__in PVOID File2MappedAsFile
);
так в общих словах мы должны сделать следующий
- получил File1MappedAsAnImage адрес EXE/DLL
- с
ZwQueryVirtualMemory
(, MemoryMappedFilenameInformation
,) получить имя_файла (в собственном формате). примечания: MemoryMappedFilenameInformation
всегда возвращают текущее имя файла в момент, когда называется - так что, если файл уже переименован - мы получили эти новое название
- открыть файл с помощью заданного имени
- файла карты и получил File2MappedAsFile
- вызова NtAreMappedFilesTheSame (File1MappedAsAnImage , File2MappedAsFile)
- если мы получили
STATUS_SUCCESS
мы открываем нужный файл - сделать здесь
- если мы получили
STATUS_NOT_SAME_DEVICE
потребности Unmap File2MappedAsFile и Гота 2
- , если мы получили другой статус - произошла какая-то ошибка
здесь полный рабочий пример
NTSTATUS MapModule(void* File1MappedAsAnImage, void** pFile2MappedAsFile)
{
static volatile UCHAR guz;
PVOID stack = alloca(guz);
union {
PVOID buf;
PUNICODE_STRING FileName;
};
SIZE_T cb = 0, rcb = 256, ViewSize;
NTSTATUS status, s = STATUS_UNSUCCESSFUL;
BOOL bSame;
do
{
bSame = TRUE;
do
{
if (cb < rcb)
{
cb = RtlPointerToOffset(buf = alloca(rcb - cb), stack);
}
if (0 <= (status = NtQueryVirtualMemory(NtCurrentProcess(), File1MappedAsAnImage, MemoryMappedFilenameInformation, buf, cb, &rcb)))
{
DbgPrint("%wZ\n", FileName);
OBJECT_ATTRIBUTES oa = { sizeof(oa), 0, FileName, OBJ_CASE_INSENSITIVE };
HANDLE hFile, hSection;
IO_STATUS_BLOCK iosb;
if (0 <= (s = NtOpenFile(&hFile, FILE_GENERIC_READ, &oa, &iosb, FILE_SHARE_VALID_FLAGS, FILE_SYNCHRONOUS_IO_NONALERT)))
{
s = ZwCreateSection(&hSection, SECTION_MAP_READ, 0, 0, PAGE_READONLY, SEC_COMMIT, hFile);
NtClose(hFile);
if (0 <= s)
{
*pFile2MappedAsFile = 0;
s = ZwMapViewOfSection(hSection, NtCurrentProcess(), pFile2MappedAsFile, 0, 0, 0, &(ViewSize = 0), ViewUnmap, 0, PAGE_READONLY);
NtClose(hSection);
if (0 <= s)
{
switch (s = NtAreMappedFilesTheSame(File1MappedAsAnImage, *pFile2MappedAsFile))
{
case STATUS_SUCCESS:
DbgPrint("opened original file!");
return STATUS_SUCCESS;
case STATUS_NOT_SAME_DEVICE:
DbgPrint("opened another file!");
bSame = FALSE;
break;
default:
DbgPrint("status = %x\n", s);
}
ZwUnmapViewOfSection(NtCurrentProcess(), *pFile2MappedAsFile);
}
}
}
}
} while (status == STATUS_BUFFER_OVERFLOW);
} while (!bSame);
return status < 0 ? status : s;
}
void Demo()
{
PVOID BaseAddress;
if (0 <= MapModule(GetModuleHandle(0), &BaseAddress))
{
ZwUnmapViewOfSection(NtCurrentProcess(), BaseAddress);
}
}
также вы можете посмотреть на этой topic
@ Жан-FrançoisFabre - это не так. файл можно переименовать во время работы. – RbMm
@ RbMm: вы правы. В Windows 10 это можно сделать.Я был уверен в обратном, но на окнах 10 это кажется возможным! –
@ Jean-FrançoisFabre - в чем проблема? запустите любой exe, а затем переименуйте в explorer или в любой браузер файлов. проверьте это и просмотрите результат. файл может быть восстановлен. удаленный не может – RbMm