在一个样本中看到的:通过进程id获取对应的用户名,来确定需要注入的目标进程。通过ProcessHacker工具可以查看进程对应的用户名,如下图:
可以看到,User name这一栏里面,有NT AUTHORITY\SYSTEM,NT AUTHORITY\LOCAL SERVICE,HKS\1909等。不同的用户名拥有不同的权限。下面的代码获取的用户名与ProcessHacker的结果有一点不同。下面代码获取的是SYSTEM,LOCAL SERVICE,1909等,如下图:
实际结果中SYSTEM对应的是HKS$(HKS是设备名称,后面跟着'$‘,来表示SYSTEM);
其他的LOCAL SERVICE,1909是一样的。
代码如下:
NTSTATUS GetProcessUserName(HANDLE pid)
{
NTSTATUS status = STATUS_SUCCESS;
PEPROCESS TargetProcess = NULL;
PACCESS_TOKEN ProcessToken = NULL;
LUID AuthenticationId = { 0 };
PSecurityUserData UserInfo = NULL;
DbgPrint("pid:%d\n", pid);
status = PsLookupProcessByProcessId((HANDLE)pid, &TargetProcess);
if (NT_SUCCESS(status))
{
ProcessToken = PsReferencePrimaryToken(TargetProcess);
if (ProcessToken)
{
status = SeQueryAuthenticationIdToken(ProcessToken, &AuthenticationId);
if (NT_SUCCESS(status))
{
status = GetSecurityUserInfo(&AuthenticationId, UNDERSTANDS_LONG_NAMES, &UserInfo);
if (NT_SUCCESS(status))
{
DbgPrint("UserInfo->UserName:%wZ\n", &(UserInfo->UserName));
LsaFreeReturnBuffer(UserInfo);
}
else
{
DbgPrint("GetSecurityUserInfo fails,status:0x%x\n", status);
}
}
else
{
STATUS_ACCESS_DENIED;
DbgPrint("SeQueryAuthenticationIdToken fails,status:0x%x\n", status);
}
}
}
else
{
DbgPrint("PsLookupProcessByProcessId fails,status:0x%x\n", status);
}
if (ProcessToken)
{
PsDereferencePrimaryToken(ProcessToken);
}
if (TargetProcess)
{
ObDereferenceObject(TargetProcess);
}
return status;
}