Added DomitoGetProcessImageName
This commit is contained in:
parent
169ea6688a
commit
904ba57442
@ -180,3 +180,14 @@ DomitoCalculatePortableExecutableDigest(
|
|||||||
_Out_ LPWIN_CERTIFICATE* pCertOut,
|
_Out_ LPWIN_CERTIFICATE* pCertOut,
|
||||||
_Out_ PULONG pSizeOfSecurityDirectory
|
_Out_ PULONG pSizeOfSecurityDirectory
|
||||||
);
|
);
|
||||||
|
|
||||||
|
_Success_(return == STATUS_SUCCESS)
|
||||||
|
_Must_inspect_result_
|
||||||
|
_IRQL_requires_max_(PASSIVE_LEVEL)
|
||||||
|
EXTERN_C
|
||||||
|
NTSTATUS
|
||||||
|
DomitoGetProcessImageName(
|
||||||
|
_In_ PFN_DOMITO_ALLOCATE_ROUTINE Allocator,
|
||||||
|
_In_ ULONG ProcessId,
|
||||||
|
_Inout_ PUNICODE_STRING* ProcessImageName
|
||||||
|
);
|
||||||
|
124
src/Domito.cpp
124
src/Domito.cpp
@ -68,6 +68,16 @@ typedef PVOID(NTAPI* t_RtlImageDirectoryEntryToData)(
|
|||||||
OUT PULONG Size
|
OUT PULONG Size
|
||||||
);
|
);
|
||||||
|
|
||||||
|
typedef NTSTATUS(*QUERY_INFO_PROCESS) (
|
||||||
|
__in HANDLE ProcessHandle,
|
||||||
|
__in PROCESSINFOCLASS ProcessInformationClass,
|
||||||
|
__out_bcount(ProcessInformationLength) PVOID ProcessInformation,
|
||||||
|
__in ULONG ProcessInformationLength,
|
||||||
|
__out_opt PULONG ReturnLength
|
||||||
|
);
|
||||||
|
|
||||||
|
static QUERY_INFO_PROCESS ZwQueryInformationProcess;
|
||||||
|
|
||||||
|
|
||||||
_Success_(return == STATUS_SUCCESS)
|
_Success_(return == STATUS_SUCCESS)
|
||||||
_Must_inspect_result_
|
_Must_inspect_result_
|
||||||
@ -636,3 +646,117 @@ cleanup:
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_Success_(return == STATUS_SUCCESS)
|
||||||
|
_Must_inspect_result_
|
||||||
|
_IRQL_requires_max_(PASSIVE_LEVEL)
|
||||||
|
#pragma code_seg("PAGED")
|
||||||
|
NTSTATUS
|
||||||
|
DomitoGetProcessImageName(
|
||||||
|
_In_ PFN_DOMITO_ALLOCATE_ROUTINE Allocator,
|
||||||
|
_In_ ULONG ProcessId,
|
||||||
|
_Inout_ PUNICODE_STRING * ProcessImageName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
NTSTATUS status = STATUS_UNSUCCESSFUL;
|
||||||
|
ULONG returnedLength;
|
||||||
|
HANDLE hProcess = NULL;
|
||||||
|
|
||||||
|
PAGED_CODE(); // this eliminates the possibility of the IDLE Thread/Process
|
||||||
|
|
||||||
|
if (Allocator == NULL)
|
||||||
|
{
|
||||||
|
return STATUS_INVALID_PARAMETER_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ProcessId == 0 || ProcessId == 4)
|
||||||
|
{
|
||||||
|
return STATUS_INVALID_PARAMETER_2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ProcessImageName == NULL)
|
||||||
|
{
|
||||||
|
return STATUS_INVALID_PARAMETER_3;
|
||||||
|
}
|
||||||
|
|
||||||
|
CLIENT_ID cid = {};
|
||||||
|
cid.UniqueProcess = (HANDLE)ProcessId;
|
||||||
|
cid.UniqueThread = NULL;
|
||||||
|
|
||||||
|
OBJECT_ATTRIBUTES objAttr;
|
||||||
|
InitializeObjectAttributes(
|
||||||
|
&objAttr,
|
||||||
|
NULL,
|
||||||
|
OBJ_KERNEL_HANDLE,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(status = ZwOpenProcess(
|
||||||
|
&hProcess,
|
||||||
|
PROCESS_ALL_ACCESS,
|
||||||
|
&objAttr,
|
||||||
|
&cid
|
||||||
|
)))
|
||||||
|
{
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ZwQueryInformationProcess == NULL)
|
||||||
|
{
|
||||||
|
UNICODE_STRING routineName = RTL_CONSTANT_STRING(L"ZwQueryInformationProcess");
|
||||||
|
|
||||||
|
ZwQueryInformationProcess =
|
||||||
|
(QUERY_INFO_PROCESS)MmGetSystemRoutineAddress(&routineName);
|
||||||
|
|
||||||
|
if (ZwQueryInformationProcess == NULL)
|
||||||
|
{
|
||||||
|
status = STATUS_NOT_IMPLEMENTED;
|
||||||
|
goto cleanUp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Query the actual size of the process path */
|
||||||
|
status = ZwQueryInformationProcess(
|
||||||
|
hProcess,
|
||||||
|
ProcessImageFileName,
|
||||||
|
NULL, // buffer
|
||||||
|
0, // buffer size
|
||||||
|
&returnedLength
|
||||||
|
);
|
||||||
|
|
||||||
|
if (STATUS_INFO_LENGTH_MISMATCH != status)
|
||||||
|
{
|
||||||
|
goto cleanUp;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ProcessImageName = (PUNICODE_STRING)Allocator(returnedLength);
|
||||||
|
|
||||||
|
if (*ProcessImageName == NULL)
|
||||||
|
{
|
||||||
|
status = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto cleanUp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Retrieve the process path from the handle to the process */
|
||||||
|
if (!NT_SUCCESS(status = ZwQueryInformationProcess(
|
||||||
|
hProcess,
|
||||||
|
ProcessImageFileName,
|
||||||
|
*ProcessImageName,
|
||||||
|
returnedLength,
|
||||||
|
&returnedLength
|
||||||
|
)))
|
||||||
|
{
|
||||||
|
ExFreePool(*ProcessImageName);
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanUp:
|
||||||
|
|
||||||
|
if (hProcess)
|
||||||
|
{
|
||||||
|
ZwClose(hProcess);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
#pragma code_seg()
|
||||||
|
Loading…
Reference in New Issue
Block a user