
whoami 없이 현재 사용자 이름을 얻는 다양한 방법
whoami.exe나 유사한 바이너리를 호출하지 않고 현재 사용자 이름을 검색하기 위한 몇 가지 실험입니다.
PEB 구조에서 환경 변수를 가져와 구문 분석하여 사용자 이름을 찾습니다.
NtQueryInformationProcess 함수는 PEB 기본 주소에 대한 포인터를 포함하는 "PROCESS_BASIC_INFORMATION" 구조체를 반환합니다.
PEB 구조체는 RTL_USER_PROCESS_PARAMETERS 구조체에 대한 "ProcessParameters" 포인터를 포함합니다.
해당 구조체에서 환경 변수에 대한 "Environment" 포인터와 환경 변수 크기에 대한 "EnvironmentSize" 포인터를 얻을 수 있습니다.
"Environment" 주소에서 "EnvironmentSize"에 표시된 바이트 수를 UNICODE 텍스트로 읽어 환경 변수를 구문 분석하고 "USERNAME"이라는 변수를 출력합니다. 모든 환경 변수를 원한다면 이 저장소를 확인하세요.


토큰에 접근하여 사용자 SID를 문자열 형식으로 찾고 LookupAccountSid 함수를 사용하여 변환합니다.
NtOpenProcessToken 함수는 현재 프로세스와 연결된 액세스 토큰을 생성합니다.
NtQueryInformationToken 함수는 생성된 토큰에서 정보를 가져오며, "TOKEN_INFORMATION_CLASS" 필드에서 "tokenUser"(1) 값을 사용하여 사용자 이름에 대한 정보를 얻고, 이는 "TokenInformation" 포인터에 저장됩니다.
ConvertSidToStringSid 함수는 사용자 SID를 이진 형식에서 문자열 형식으로 변환합니다.
LookupAccountSid 함수는 문자열 형식의 SID를 받아 사용자 이름을 반환합니다.


토큰과 Policy 개체에 접근하여 LsaLookupSids 함수로 사용자 이름을 가져옵니다.
NtOpenProcessToken 및 NtQueryInformationToken 함수는 방법 2와 같이 사용되어 사용자 SID를 이진 형식으로 포함하는 "TokenInformation" 포인터를 반환합니다.
LsaOpenPolicy 함수는 현재 시스템의 Policy 개체에 대한 핸들을 생성합니다.
LsaLookupSids 함수는 SID에 대한 포인터를 받아 사용자 이름을 포함하는 LSA_TRANSLATED_NAME 구조체를 반환합니다.


명명된 파이프와 보조 스레드를 생성하고, 명명된 파이프에서 쓰고 읽어 문서화되지 않은 함수 NpGetUsername에서 사용자 이름을 가져옵니다.


컴퓨터가 도메인에 가입된 경우 MSDN 예제에서와 같이 CoCreateInstance 함수를 사용하여 사용자 이름을 가져옵니다. ActiveDS.dll의 ADSystemInfoClass 클래스와 ADSystemInfo 및 IADsADSystemInfo 인터페이스를 사용하며, 이들은 프로젝트 폴더에 이미 있으므로 DLL이 필요하지 않습니다.
AD와 연결되지 않은 경우:

연결된 경우:
