mirror of https://github.com/x64dbg/TitanEngine
fix handler
This commit is contained in:
parent
05531296e3
commit
2fcbd5d76b
|
|
@ -70,119 +70,47 @@ __declspec(dllexport) bool TITCALL HandlerIsHandleOpen(DWORD ProcessId, HANDLE h
|
||||||
|
|
||||||
return HandleActive;
|
return HandleActive;
|
||||||
}
|
}
|
||||||
__declspec(dllexport) void* TITCALL HandlerGetHandleName(HANDLE hProcess, DWORD ProcessId, HANDLE hHandle, bool TranslateName)
|
|
||||||
{
|
|
||||||
|
|
||||||
bool NameFound = false;
|
|
||||||
HANDLE myHandle = NULL;
|
|
||||||
ULONG RequiredSize = NULL;
|
|
||||||
ULONG TotalHandleCount = NULL;
|
|
||||||
PNTDLL_QUERY_HANDLE_INFO HandleInfo;
|
|
||||||
PUBLIC_OBJECT_BASIC_INFORMATION ObjectBasicInfo;
|
|
||||||
char ObjectNameInfo[0x2000] = {0};
|
|
||||||
PPUBLIC_OBJECT_NAME_INFORMATION pObjectNameInfo = (PPUBLIC_OBJECT_NAME_INFORMATION)ObjectNameInfo;
|
|
||||||
LPVOID HandleFullName = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
|
|
||||||
LPVOID tmpHandleFullName = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
DynBuf hinfo;
|
|
||||||
if (!NtQuerySysHandleInfo(hinfo))
|
|
||||||
return 0;
|
|
||||||
LPVOID QuerySystemBuffer = hinfo.GetPtr();
|
|
||||||
|
|
||||||
|
|
||||||
RtlMoveMemory(&TotalHandleCount, QuerySystemBuffer, sizeof ULONG);
|
|
||||||
QuerySystemBuffer = (LPVOID)((ULONG_PTR)QuerySystemBuffer + 4);
|
|
||||||
HandleInfo = (PNTDLL_QUERY_HANDLE_INFO)QuerySystemBuffer;
|
|
||||||
while(TotalHandleCount > NULL)
|
|
||||||
{
|
|
||||||
if(HandleInfo->ProcessId == ProcessId && (HANDLE)HandleInfo->hHandle == hHandle)
|
|
||||||
{
|
|
||||||
//if(!(HandleInfo->GrantedAccess & SYNCHRONIZE) || ((HandleInfo->GrantedAccess & SYNCHRONIZE) && ((WORD)HandleInfo->GrantedAccess != 0x19F9))){// && (WORD)HandleInfo->GrantedAccess != 0x89))){
|
|
||||||
if(HandleInfo->GrantedAccess != 0x0012019F)
|
|
||||||
{
|
|
||||||
if(DuplicateHandle(hProcess, hHandle, GetCurrentProcess(), &myHandle, NULL, false, DUPLICATE_SAME_ACCESS))
|
|
||||||
{
|
|
||||||
RtlZeroMemory(&ObjectBasicInfo, sizeof PUBLIC_OBJECT_BASIC_INFORMATION);
|
|
||||||
NtQueryObject(myHandle, ObjectBasicInformation, &ObjectBasicInfo, sizeof PUBLIC_OBJECT_BASIC_INFORMATION, &RequiredSize);
|
|
||||||
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, 8, &RequiredSize);
|
|
||||||
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, RequiredSize, &RequiredSize);
|
|
||||||
RtlZeroMemory(HandleFullName, 0x1000);
|
|
||||||
if(pObjectNameInfo->Name.Length != NULL)
|
|
||||||
{
|
|
||||||
WideCharToMultiByte(CP_ACP, NULL, (LPCWSTR)pObjectNameInfo->Name.Buffer, -1, (LPSTR)HandleFullName, 0x1000, NULL, NULL);
|
|
||||||
NameFound = true;
|
|
||||||
if(TranslateName)
|
|
||||||
{
|
|
||||||
tmpHandleFullName = TranslateNativeName((char*)HandleFullName);
|
|
||||||
if(tmpHandleFullName != NULL)
|
|
||||||
{
|
|
||||||
VirtualFree(HandleFullName, NULL, MEM_RELEASE);
|
|
||||||
HandleFullName = tmpHandleFullName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EngineCloseHandle(myHandle);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
HandleInfo = (PNTDLL_QUERY_HANDLE_INFO)((ULONG_PTR)HandleInfo + sizeof NTDLL_QUERY_HANDLE_INFO);
|
|
||||||
TotalHandleCount--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!NameFound)
|
|
||||||
{
|
|
||||||
VirtualFree(HandleFullName, NULL, MEM_RELEASE);
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return(HandleFullName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
__declspec(dllexport) void* TITCALL HandlerGetHandleNameW(HANDLE hProcess, DWORD ProcessId, HANDLE hHandle, bool TranslateName)
|
__declspec(dllexport) void* TITCALL HandlerGetHandleNameW(HANDLE hProcess, DWORD ProcessId, HANDLE hHandle, bool TranslateName)
|
||||||
{
|
{
|
||||||
|
|
||||||
bool NameFound = false;
|
bool NameFound = false;
|
||||||
HANDLE myHandle = NULL;
|
HANDLE myHandle = NULL;
|
||||||
ULONG RequiredSize = NULL;
|
ULONG RequiredSize = NULL;
|
||||||
ULONG TotalHandleCount = NULL;
|
OBJECT_BASIC_INFORMATION ObjectBasicInfo = {0};
|
||||||
PNTDLL_QUERY_HANDLE_INFO HandleInfo;
|
char ObjectNameInfo[0x1000] = {0};
|
||||||
PUBLIC_OBJECT_BASIC_INFORMATION ObjectBasicInfo;
|
POBJECT_NAME_INFORMATION pObjectNameInfo = (POBJECT_NAME_INFORMATION)ObjectNameInfo;
|
||||||
char ObjectNameInfo[0x2000] = {0};
|
|
||||||
PPUBLIC_OBJECT_NAME_INFORMATION pObjectNameInfo = (PPUBLIC_OBJECT_NAME_INFORMATION)ObjectNameInfo;
|
|
||||||
LPVOID HandleFullName = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
|
LPVOID HandleFullName = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
|
||||||
LPVOID tmpHandleFullName = NULL;
|
LPVOID tmpHandleFullName = NULL;
|
||||||
|
|
||||||
|
|
||||||
DynBuf hinfo;
|
DynBuf hinfo;
|
||||||
if (!NtQuerySysHandleInfo(hinfo))
|
if (!NtQuerySysHandleInfo(hinfo))
|
||||||
|
{
|
||||||
|
VirtualFree(HandleFullName, NULL, MEM_RELEASE);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
LPVOID QuerySystemBuffer = hinfo.GetPtr();
|
LPVOID QuerySystemBuffer = hinfo.GetPtr();
|
||||||
|
|
||||||
|
PSYSTEM_HANDLE_INFORMATION HandleInfo = (PSYSTEM_HANDLE_INFORMATION)QuerySystemBuffer;
|
||||||
|
PSYSTEM_HANDLE_TABLE_ENTRY_INFO pHandle = HandleInfo->Handles;
|
||||||
|
|
||||||
RtlMoveMemory(&TotalHandleCount, QuerySystemBuffer, sizeof ULONG);
|
for (ULONG i = 0; i < HandleInfo->NumberOfHandles; i++)
|
||||||
QuerySystemBuffer = (LPVOID)((ULONG_PTR)QuerySystemBuffer + 4);
|
|
||||||
HandleInfo = (PNTDLL_QUERY_HANDLE_INFO)QuerySystemBuffer;
|
|
||||||
while(TotalHandleCount > NULL)
|
|
||||||
{
|
{
|
||||||
if(HandleInfo->ProcessId == ProcessId && (HANDLE)HandleInfo->hHandle == hHandle)
|
if((DWORD)pHandle->UniqueProcessId == ProcessId && (HANDLE)pHandle->HandleValue == hHandle)
|
||||||
{
|
{
|
||||||
//if(!(HandleInfo->GrantedAccess & SYNCHRONIZE) || ((HandleInfo->GrantedAccess & SYNCHRONIZE) && ((WORD)HandleInfo->GrantedAccess != 0x19F9))){// && (WORD)HandleInfo->GrantedAccess != 0x89))){
|
//if(!(HandleInfo->GrantedAccess & SYNCHRONIZE) || ((HandleInfo->GrantedAccess & SYNCHRONIZE) && ((WORD)HandleInfo->GrantedAccess != 0x19F9))){// && (WORD)HandleInfo->GrantedAccess != 0x89))){
|
||||||
if(HandleInfo->GrantedAccess != 0x0012019F)
|
if(pHandle->GrantedAccess != 0x0012019F)
|
||||||
{
|
{
|
||||||
if(DuplicateHandle(hProcess, hHandle, GetCurrentProcess(), &myHandle, NULL, false, DUPLICATE_SAME_ACCESS))
|
if(DuplicateHandle(hProcess, hHandle, GetCurrentProcess(), &myHandle, NULL, FALSE, DUPLICATE_SAME_ACCESS))
|
||||||
{
|
{
|
||||||
RtlZeroMemory(&ObjectBasicInfo, sizeof PUBLIC_OBJECT_BASIC_INFORMATION);
|
RtlZeroMemory(&ObjectBasicInfo, sizeof(OBJECT_BASIC_INFORMATION));
|
||||||
NtQueryObject(myHandle, ObjectBasicInformation, &ObjectBasicInfo, sizeof PUBLIC_OBJECT_BASIC_INFORMATION, &RequiredSize);
|
NtQueryObject(myHandle, ObjectBasicInformation, &ObjectBasicInfo, sizeof(OBJECT_BASIC_INFORMATION), &RequiredSize);
|
||||||
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, 8, &RequiredSize);
|
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, sizeof(ObjectNameInfo), &RequiredSize);
|
||||||
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, RequiredSize, &RequiredSize);
|
|
||||||
RtlZeroMemory(HandleFullName, 0x1000);
|
RtlZeroMemory(HandleFullName, 0x1000);
|
||||||
if(pObjectNameInfo->Name.Length != NULL)
|
if(pObjectNameInfo->Name.Length != NULL)
|
||||||
{
|
{
|
||||||
//WideCharToMultiByte(CP_ACP, NULL, (LPCWSTR)pObjectNameInfo->Name.Buffer, -1, (LPSTR)HandleFullName, 0x1000, NULL, NULL);
|
//WideCharToMultiByte(CP_ACP, NULL, (LPCWSTR)pObjectNameInfo->Name.Buffer, -1, (LPSTR)HandleFullName, 0x1000, NULL, NULL);
|
||||||
|
wcscpy((wchar_t*)HandleFullName, (wchar_t*)pObjectNameInfo->Name.Buffer);
|
||||||
NameFound = true;
|
NameFound = true;
|
||||||
lstrcpyW((wchar_t*)HandleFullName, (wchar_t*)pObjectNameInfo->Name.Buffer);
|
|
||||||
if(TranslateName)
|
if(TranslateName)
|
||||||
{
|
{
|
||||||
tmpHandleFullName = TranslateNativeNameW((wchar_t*)HandleFullName);
|
tmpHandleFullName = TranslateNativeNameW((wchar_t*)HandleFullName);
|
||||||
|
|
@ -198,8 +126,8 @@ __declspec(dllexport) void* TITCALL HandlerGetHandleNameW(HANDLE hProcess, DWORD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
HandleInfo = (PNTDLL_QUERY_HANDLE_INFO)((ULONG_PTR)HandleInfo + sizeof NTDLL_QUERY_HANDLE_INFO);
|
|
||||||
TotalHandleCount--;
|
pHandle++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!NameFound)
|
if(!NameFound)
|
||||||
|
|
@ -211,8 +139,21 @@ __declspec(dllexport) void* TITCALL HandlerGetHandleNameW(HANDLE hProcess, DWORD
|
||||||
{
|
{
|
||||||
return(HandleFullName);
|
return(HandleFullName);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
__declspec(dllexport) void* TITCALL HandlerGetHandleName(HANDLE hProcess, DWORD ProcessId, HANDLE hHandle, bool TranslateName)
|
||||||
|
{
|
||||||
|
wchar_t * name = (wchar_t *)HandlerGetHandleNameW(hProcess, ProcessId, hHandle, TranslateName);
|
||||||
|
|
||||||
return(NULL);
|
if (name)
|
||||||
|
{
|
||||||
|
LPVOID HandleFullName = VirtualAlloc(NULL, wcslen(name) + 1, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
|
||||||
|
WideCharToMultiByte(CP_ACP, NULL, name, -1, (LPSTR)HandleFullName, wcslen(name) + 1, NULL, NULL);
|
||||||
|
VirtualFree(name, NULL, MEM_RELEASE);
|
||||||
|
|
||||||
|
return HandleFullName;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
__declspec(dllexport) long TITCALL HandlerEnumerateOpenHandles(DWORD ProcessId, LPVOID HandleBuffer, DWORD MaxHandleCount)
|
__declspec(dllexport) long TITCALL HandlerEnumerateOpenHandles(DWORD ProcessId, LPVOID HandleBuffer, DWORD MaxHandleCount)
|
||||||
{
|
{
|
||||||
|
|
@ -252,7 +193,7 @@ __declspec(dllexport) long long TITCALL HandlerGetHandleDetails(HANDLE hProcess,
|
||||||
ULONG RequiredSize = NULL;
|
ULONG RequiredSize = NULL;
|
||||||
ULONG TotalHandleCount = NULL;
|
ULONG TotalHandleCount = NULL;
|
||||||
PNTDLL_QUERY_HANDLE_INFO HandleInfo;
|
PNTDLL_QUERY_HANDLE_INFO HandleInfo;
|
||||||
PUBLIC_OBJECT_BASIC_INFORMATION ObjectBasicInfo;
|
OBJECT_BASIC_INFORMATION ObjectBasicInfo;
|
||||||
char HandleFullData[0x1000] = {0};
|
char HandleFullData[0x1000] = {0};
|
||||||
LPVOID HandleNameData = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
|
LPVOID HandleNameData = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
|
||||||
PPUBLIC_OBJECT_TYPE_INFORMATION pObjectTypeInfo = (PPUBLIC_OBJECT_TYPE_INFORMATION)HandleFullData;
|
PPUBLIC_OBJECT_TYPE_INFORMATION pObjectTypeInfo = (PPUBLIC_OBJECT_TYPE_INFORMATION)HandleFullData;
|
||||||
|
|
@ -274,8 +215,8 @@ __declspec(dllexport) long long TITCALL HandlerGetHandleDetails(HANDLE hProcess,
|
||||||
{
|
{
|
||||||
if(DuplicateHandle(hProcess, hHandle, GetCurrentProcess(), &myHandle, NULL, false, DUPLICATE_SAME_ACCESS))
|
if(DuplicateHandle(hProcess, hHandle, GetCurrentProcess(), &myHandle, NULL, false, DUPLICATE_SAME_ACCESS))
|
||||||
{
|
{
|
||||||
RtlZeroMemory(&ObjectBasicInfo, sizeof PUBLIC_OBJECT_BASIC_INFORMATION);
|
RtlZeroMemory(&ObjectBasicInfo, sizeof OBJECT_BASIC_INFORMATION);
|
||||||
NtQueryObject(myHandle, ObjectBasicInformation, &ObjectBasicInfo, sizeof PUBLIC_OBJECT_BASIC_INFORMATION, &RequiredSize);
|
NtQueryObject(myHandle, ObjectBasicInformation, &ObjectBasicInfo, sizeof OBJECT_BASIC_INFORMATION, &RequiredSize);
|
||||||
if(InformationReturn == UE_OPTION_HANDLER_RETURN_HANDLECOUNT)
|
if(InformationReturn == UE_OPTION_HANDLER_RETURN_HANDLECOUNT)
|
||||||
{
|
{
|
||||||
ReturnData = (ULONG_PTR)ObjectBasicInfo.HandleCount;
|
ReturnData = (ULONG_PTR)ObjectBasicInfo.HandleCount;
|
||||||
|
|
@ -375,9 +316,9 @@ __declspec(dllexport) long TITCALL HandlerEnumerateLockHandlesW(wchar_t* szFileO
|
||||||
DWORD LastProcessId = NULL;
|
DWORD LastProcessId = NULL;
|
||||||
|
|
||||||
PNTDLL_QUERY_HANDLE_INFO HandleInfo;
|
PNTDLL_QUERY_HANDLE_INFO HandleInfo;
|
||||||
PUBLIC_OBJECT_BASIC_INFORMATION ObjectBasicInfo;
|
OBJECT_BASIC_INFORMATION ObjectBasicInfo;
|
||||||
char ObjectNameInfo[0x2000] = {0};
|
char ObjectNameInfo[0x2000] = {0};
|
||||||
PPUBLIC_OBJECT_NAME_INFORMATION pObjectNameInfo = (PPUBLIC_OBJECT_NAME_INFORMATION)ObjectNameInfo;
|
POBJECT_NAME_INFORMATION pObjectNameInfo = (POBJECT_NAME_INFORMATION)ObjectNameInfo;
|
||||||
char HandleFullNameB[0x1000] = {0};
|
char HandleFullNameB[0x1000] = {0};
|
||||||
LPVOID HandleFullName = HandleFullNameB;
|
LPVOID HandleFullName = HandleFullNameB;
|
||||||
int LenFileOrFolderName = lstrlenW(szFileOrFolderName);
|
int LenFileOrFolderName = lstrlenW(szFileOrFolderName);
|
||||||
|
|
@ -410,8 +351,8 @@ __declspec(dllexport) long TITCALL HandlerEnumerateLockHandlesW(wchar_t* szFileO
|
||||||
{
|
{
|
||||||
if(DuplicateHandle(hProcess, (HANDLE)HandleInfo->hHandle, GetCurrentProcess(), &myHandle, NULL, false, DUPLICATE_SAME_ACCESS))
|
if(DuplicateHandle(hProcess, (HANDLE)HandleInfo->hHandle, GetCurrentProcess(), &myHandle, NULL, false, DUPLICATE_SAME_ACCESS))
|
||||||
{
|
{
|
||||||
RtlZeroMemory(&ObjectBasicInfo, sizeof PUBLIC_OBJECT_BASIC_INFORMATION);
|
RtlZeroMemory(&ObjectBasicInfo, sizeof OBJECT_BASIC_INFORMATION);
|
||||||
NtQueryObject(myHandle, ObjectBasicInformation, &ObjectBasicInfo, sizeof PUBLIC_OBJECT_BASIC_INFORMATION, &RequiredSize);
|
NtQueryObject(myHandle, ObjectBasicInformation, &ObjectBasicInfo, sizeof OBJECT_BASIC_INFORMATION, &RequiredSize);
|
||||||
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, 8, &RequiredSize);
|
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, 8, &RequiredSize);
|
||||||
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, RequiredSize, &RequiredSize);
|
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, RequiredSize, &RequiredSize);
|
||||||
RtlZeroMemory(HandleFullName, 0x1000);
|
RtlZeroMemory(HandleFullName, 0x1000);
|
||||||
|
|
@ -481,9 +422,9 @@ __declspec(dllexport) bool TITCALL HandlerCloseAllLockHandlesW(wchar_t* szFileOr
|
||||||
ULONG TotalHandleCount = NULL;
|
ULONG TotalHandleCount = NULL;
|
||||||
DWORD LastProcessId = NULL;
|
DWORD LastProcessId = NULL;
|
||||||
PNTDLL_QUERY_HANDLE_INFO HandleInfo;
|
PNTDLL_QUERY_HANDLE_INFO HandleInfo;
|
||||||
PUBLIC_OBJECT_BASIC_INFORMATION ObjectBasicInfo;
|
OBJECT_BASIC_INFORMATION ObjectBasicInfo;
|
||||||
char ObjectNameInfo[0x2000] = {0};
|
char ObjectNameInfo[0x2000] = {0};
|
||||||
PPUBLIC_OBJECT_NAME_INFORMATION pObjectNameInfo = (PPUBLIC_OBJECT_NAME_INFORMATION)ObjectNameInfo;
|
POBJECT_NAME_INFORMATION pObjectNameInfo = (POBJECT_NAME_INFORMATION)ObjectNameInfo;
|
||||||
char HandleFullNameB[0x1000] = {0};
|
char HandleFullNameB[0x1000] = {0};
|
||||||
LPVOID HandleFullName = HandleFullNameB;
|
LPVOID HandleFullName = HandleFullNameB;
|
||||||
int LenFileOrFolderName = lstrlenW(szFileOrFolderName);
|
int LenFileOrFolderName = lstrlenW(szFileOrFolderName);
|
||||||
|
|
@ -517,8 +458,8 @@ __declspec(dllexport) bool TITCALL HandlerCloseAllLockHandlesW(wchar_t* szFileOr
|
||||||
{
|
{
|
||||||
if(DuplicateHandle(hProcess, (HANDLE)HandleInfo->hHandle, GetCurrentProcess(), &myHandle, NULL, false, DUPLICATE_SAME_ACCESS))
|
if(DuplicateHandle(hProcess, (HANDLE)HandleInfo->hHandle, GetCurrentProcess(), &myHandle, NULL, false, DUPLICATE_SAME_ACCESS))
|
||||||
{
|
{
|
||||||
RtlZeroMemory(&ObjectBasicInfo, sizeof PUBLIC_OBJECT_BASIC_INFORMATION);
|
RtlZeroMemory(&ObjectBasicInfo, sizeof OBJECT_BASIC_INFORMATION);
|
||||||
NtQueryObject(myHandle, ObjectBasicInformation, &ObjectBasicInfo, sizeof PUBLIC_OBJECT_BASIC_INFORMATION, &RequiredSize);
|
NtQueryObject(myHandle, ObjectBasicInformation, &ObjectBasicInfo, sizeof OBJECT_BASIC_INFORMATION, &RequiredSize);
|
||||||
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, 8, &RequiredSize);
|
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, 8, &RequiredSize);
|
||||||
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, RequiredSize, &RequiredSize);
|
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, RequiredSize, &RequiredSize);
|
||||||
RtlZeroMemory(HandleFullName, 0x1000);
|
RtlZeroMemory(HandleFullName, 0x1000);
|
||||||
|
|
@ -585,9 +526,9 @@ __declspec(dllexport) bool TITCALL HandlerIsFileLockedW(wchar_t* szFileOrFolderN
|
||||||
DWORD LastProcessId = NULL;
|
DWORD LastProcessId = NULL;
|
||||||
|
|
||||||
PNTDLL_QUERY_HANDLE_INFO HandleInfo;
|
PNTDLL_QUERY_HANDLE_INFO HandleInfo;
|
||||||
PUBLIC_OBJECT_BASIC_INFORMATION ObjectBasicInfo;
|
OBJECT_BASIC_INFORMATION ObjectBasicInfo;
|
||||||
char ObjectNameInfo[0x2000] = {0};
|
char ObjectNameInfo[0x2000] = {0};
|
||||||
PPUBLIC_OBJECT_NAME_INFORMATION pObjectNameInfo = (PPUBLIC_OBJECT_NAME_INFORMATION)ObjectNameInfo;
|
POBJECT_NAME_INFORMATION pObjectNameInfo = (POBJECT_NAME_INFORMATION)ObjectNameInfo;
|
||||||
char HandleFullNameB[0x1000] = {0};
|
char HandleFullNameB[0x1000] = {0};
|
||||||
LPVOID HandleFullName = HandleFullNameB;
|
LPVOID HandleFullName = HandleFullNameB;
|
||||||
int LenFileOrFolderName = lstrlenW(szFileOrFolderName);
|
int LenFileOrFolderName = lstrlenW(szFileOrFolderName);
|
||||||
|
|
@ -620,8 +561,8 @@ __declspec(dllexport) bool TITCALL HandlerIsFileLockedW(wchar_t* szFileOrFolderN
|
||||||
{
|
{
|
||||||
if(DuplicateHandle(hProcess, (HANDLE)HandleInfo->hHandle, GetCurrentProcess(), &myHandle, NULL, false, DUPLICATE_SAME_ACCESS))
|
if(DuplicateHandle(hProcess, (HANDLE)HandleInfo->hHandle, GetCurrentProcess(), &myHandle, NULL, false, DUPLICATE_SAME_ACCESS))
|
||||||
{
|
{
|
||||||
RtlZeroMemory(&ObjectBasicInfo, sizeof PUBLIC_OBJECT_BASIC_INFORMATION);
|
RtlZeroMemory(&ObjectBasicInfo, sizeof OBJECT_BASIC_INFORMATION);
|
||||||
NtQueryObject(myHandle, ObjectBasicInformation, &ObjectBasicInfo, sizeof PUBLIC_OBJECT_BASIC_INFORMATION, &RequiredSize);
|
NtQueryObject(myHandle, ObjectBasicInformation, &ObjectBasicInfo, sizeof OBJECT_BASIC_INFORMATION, &RequiredSize);
|
||||||
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, 8, &RequiredSize);
|
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, 8, &RequiredSize);
|
||||||
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, RequiredSize, &RequiredSize);
|
NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, RequiredSize, &RequiredSize);
|
||||||
RtlZeroMemory(HandleFullName, 0x1000);
|
RtlZeroMemory(HandleFullName, 0x1000);
|
||||||
|
|
@ -794,7 +735,7 @@ __declspec(dllexport) long TITCALL HandlerGetProcessIdWhichCreatedMutexW(wchar_t
|
||||||
char HandleNameData[0x1000] = {0};
|
char HandleNameData[0x1000] = {0};
|
||||||
PPUBLIC_OBJECT_TYPE_INFORMATION pObjectTypeInfo = (PPUBLIC_OBJECT_TYPE_INFORMATION)HandleFullData;
|
PPUBLIC_OBJECT_TYPE_INFORMATION pObjectTypeInfo = (PPUBLIC_OBJECT_TYPE_INFORMATION)HandleFullData;
|
||||||
char ObjectNameInfo[0x2000] = {0};
|
char ObjectNameInfo[0x2000] = {0};
|
||||||
PPUBLIC_OBJECT_NAME_INFORMATION pObjectNameInfo = (PPUBLIC_OBJECT_NAME_INFORMATION)ObjectNameInfo;
|
POBJECT_NAME_INFORMATION pObjectNameInfo = (POBJECT_NAME_INFORMATION)ObjectNameInfo;
|
||||||
wchar_t RealMutexName[512] = L"\\BaseNamedObjects\\";
|
wchar_t RealMutexName[512] = L"\\BaseNamedObjects\\";
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -170,16 +170,68 @@ typedef struct _SYSTEM_PROCESS_INFORMATION
|
||||||
SYSTEM_THREAD_INFORMATION Threads[1];
|
SYSTEM_THREAD_INFORMATION Threads[1];
|
||||||
} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
|
} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
|
||||||
|
|
||||||
typedef struct _PUBLIC_OBJECT_BASIC_INFORMATION
|
|
||||||
|
typedef struct _OBJECT_BASIC_INFORMATION
|
||||||
{
|
{
|
||||||
ULONG Attributes;
|
ULONG Attributes;
|
||||||
ACCESS_MASK GrantedAccess;
|
ACCESS_MASK GrantedAccess;
|
||||||
ULONG HandleCount;
|
ULONG HandleCount;
|
||||||
ULONG PointerCount;
|
ULONG PointerCount;
|
||||||
|
ULONG PagedPoolCharge;
|
||||||
|
ULONG NonPagedPoolCharge;
|
||||||
|
ULONG Reserved[ 3 ];
|
||||||
|
ULONG NameInfoSize;
|
||||||
|
ULONG TypeInfoSize;
|
||||||
|
ULONG SecurityDescriptorSize;
|
||||||
|
LARGE_INTEGER CreationTime;
|
||||||
|
} OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
|
||||||
|
|
||||||
ULONG Reserved[10]; // reserved for internal use
|
typedef struct _OBJECT_NAME_INFORMATION
|
||||||
|
{
|
||||||
|
UNICODE_STRING Name;
|
||||||
|
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
|
||||||
|
|
||||||
} PUBLIC_OBJECT_BASIC_INFORMATION, *PPUBLIC_OBJECT_BASIC_INFORMATION;
|
typedef struct _OBJECT_TYPE_INFORMATION
|
||||||
|
{
|
||||||
|
UNICODE_STRING TypeName;
|
||||||
|
ULONG TotalNumberOfObjects;
|
||||||
|
ULONG TotalNumberOfHandles;
|
||||||
|
ULONG TotalPagedPoolUsage;
|
||||||
|
ULONG TotalNonPagedPoolUsage;
|
||||||
|
ULONG TotalNamePoolUsage;
|
||||||
|
ULONG TotalHandleTableUsage;
|
||||||
|
ULONG HighWaterNumberOfObjects;
|
||||||
|
ULONG HighWaterNumberOfHandles;
|
||||||
|
ULONG HighWaterPagedPoolUsage;
|
||||||
|
ULONG HighWaterNonPagedPoolUsage;
|
||||||
|
ULONG HighWaterNamePoolUsage;
|
||||||
|
ULONG HighWaterHandleTableUsage;
|
||||||
|
ULONG InvalidAttributes;
|
||||||
|
GENERIC_MAPPING GenericMapping;
|
||||||
|
ULONG ValidAccessMask;
|
||||||
|
BOOLEAN SecurityRequired;
|
||||||
|
BOOLEAN MaintainHandleCount;
|
||||||
|
ULONG PoolType;
|
||||||
|
ULONG DefaultPagedPoolCharge;
|
||||||
|
ULONG DefaultNonPagedPoolCharge;
|
||||||
|
} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
|
||||||
|
|
||||||
|
typedef struct _OBJECT_TYPES_INFORMATION
|
||||||
|
{
|
||||||
|
ULONG NumberOfTypes;
|
||||||
|
OBJECT_TYPE_INFORMATION TypeInformation[1];
|
||||||
|
} OBJECT_TYPES_INFORMATION, *POBJECT_TYPES_INFORMATION;
|
||||||
|
|
||||||
|
//typedef struct _PUBLIC_OBJECT_BASIC_INFORMATION
|
||||||
|
//{
|
||||||
|
// ULONG Attributes;
|
||||||
|
// ACCESS_MASK GrantedAccess;
|
||||||
|
// ULONG HandleCount;
|
||||||
|
// ULONG PointerCount;
|
||||||
|
//
|
||||||
|
// ULONG Reserved[10]; // reserved for internal use
|
||||||
|
//
|
||||||
|
//} PUBLIC_OBJECT_BASIC_INFORMATION, *PPUBLIC_OBJECT_BASIC_INFORMATION;
|
||||||
|
|
||||||
typedef struct __PUBLIC_OBJECT_TYPE_INFORMATION
|
typedef struct __PUBLIC_OBJECT_TYPE_INFORMATION
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -784,42 +784,7 @@ typedef struct
|
||||||
ACCESS_MASK GrantedAccess;
|
ACCESS_MASK GrantedAccess;
|
||||||
} NTDLL_QUERY_HANDLE_INFO, *PNTDLL_QUERY_HANDLE_INFO;
|
} NTDLL_QUERY_HANDLE_INFO, *PNTDLL_QUERY_HANDLE_INFO;
|
||||||
|
|
||||||
/*typedef struct _PUBLIC_OBJECT_BASIC_INFORMATION {
|
|
||||||
ULONG Attributes;
|
|
||||||
ACCESS_MASK GrantedAccess;
|
|
||||||
ULONG HandleCount;
|
|
||||||
ULONG PointerCount;
|
|
||||||
ULONG PagedPoolUsage;
|
|
||||||
ULONG NonPagedPoolUsage;
|
|
||||||
ULONG Reserved[3];
|
|
||||||
ULONG NameInformationLength;
|
|
||||||
ULONG TypeInformationLength;
|
|
||||||
ULONG SecurityDescriptorLength;
|
|
||||||
LARGE_INTEGER CreateTime;
|
|
||||||
} PUBLIC_OBJECT_BASIC_INFORMATION, *PPUBLIC_OBJECT_BASIC_INFORMATION;*/
|
|
||||||
|
|
||||||
typedef struct _PUBLIC_OBJECT_NAME_INFORMATION // Information Class 1
|
|
||||||
{
|
|
||||||
UNICODE_STRING Name;
|
|
||||||
} PUBLIC_OBJECT_NAME_INFORMATION, *PPUBLIC_OBJECT_NAME_INFORMATION;
|
|
||||||
|
|
||||||
/*typedef struct _PUBLIC_OBJECT_TYPE_INFORMATION { // Information Class 2
|
|
||||||
UNICODE_STRING Name;
|
|
||||||
ULONG ObjectCount;
|
|
||||||
ULONG HandleCount;
|
|
||||||
ULONG Reserved1[4];
|
|
||||||
ULONG PeakObjectCount;
|
|
||||||
ULONG PeakHandleCount;
|
|
||||||
ULONG Reserved2[4];
|
|
||||||
ULONG InvalidAttributes;
|
|
||||||
GENERIC_MAPPING GenericMapping;
|
|
||||||
ULONG ValidAccess;
|
|
||||||
UCHAR Unknown;
|
|
||||||
BOOLEAN MaintainHandleDatabase;
|
|
||||||
POOL_TYPE PoolType;
|
|
||||||
ULONG PagedPoolUsage;
|
|
||||||
ULONG NonPagedPoolUsage;
|
|
||||||
} PUBLIC_OBJECT_TYPE_INFORMATION, *PPUBLIC_OBJECT_TYPE_INFORMATION;*/
|
|
||||||
|
|
||||||
typedef void (*PPEBLOCKROUTINE)(
|
typedef void (*PPEBLOCKROUTINE)(
|
||||||
PVOID PebLock
|
PVOID PebLock
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue