whoami 的替代方案
一些无需调用 whoami.exe 或类似二进制文件即可检索当前用户名的实验。
方法 1:PRTL_USER_PROCESS_PARAMETERS
从 PEB 结构中获取环境变量并解析以找到用户名。
- 函数 NtQueryInformationProcess 返回一个包含指向 PEB 基地址指针的“PROCESS_BASIC_INFORMATION”结构。
- PEB 结构包含一个指向 RTL_USER_PROCESS_PARAMETERS 结构的指针“ProcessParameters”。
- 从该结构可以获取指向环境变量的指针“Environment”和指向环境变量大小的指针“EnvironmentSize”。
- 以 UNICODE 文本形式从地址“Environment”读取“EnvironmentSize”指定的字节数,解析环境变量并输出名为“USERNAME”的变量。如果需要所有环境变量,请查看此仓库。


方法 2:LookupAccountSid
获取一个令牌的访问权限,以字符串形式找到用户的 SID,然后使用函数 LookupAccountSid 进行转换。


方法 3:LsaLookupSids
获取一个令牌和一个 Policy 对象的访问权限,然后使用函数 LsaLookupSids 获取用户名。
- 函数 NtOpenProcessToken 和 NtQueryInformationToken 的使用方式与方法 2 相同,返回一个指向“TokenInformation”的指针,其中包含用户的二进制格式 SID。
- 函数 LsaOpenPolicy 在当前系统中创建一个指向 Policy 对象的句柄。
- 函数 LsaLookupSids 接受一个指向 SID 的指针,并返回一个包含用户名的 LSA_TRANSLATED_NAME 结构。


方法 4:命名管道
创建一个命名管道和一个辅助线程,通过命名管道写入和读取数据,然后从未公开的函数 NpGetUsername 获取用户名。


方法 5:ADSystemInfo
如果计算机已加入域,则使用 CoCreateInstance 函数获取用户名,如 MSDN 示例 所示。它使用 ActiveDS.dll 中的类 ADSystemInfoClass 以及接口 ADSystemInfo 和 IADsADSystemInfo,这些已包含在项目文件夹中,因此无需 DLL。
如果与 AD 无连接:

如果有连接:

来源
vx-underground 的 Twitter 帐户