1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
| #include <stdio.h> #include <Windows.h> #include "samlib.h"
#pragma comment(lib, "samlib.lib") #pragma comment(lib, "ntdll.lib")
void AddUser(wchar_t* uName, wchar_t* uPass) { DWORD* pRid; DWORD* pUse; DWORD USE = 0; ULONG grantAccess; ULONG relativeId; DWORD* adminRID; PSID userSID = NULL; NTSTATUS status = STATUS_INVALID_ACCOUNT_NAME, enumDomainStatus; DWORD i, domainEnumerationContext = 0, domainCountReturned; PSAMPR_RID_ENUMERATION pEnumDomainBuffer = NULL, pEnumGroupBuffer = NULL; PSID builtinDomainSid = 0, accountDomainSid = 0; SAMPR_HANDLE hServerHandle = NULL, hDomainHandle = NULL, hUserHandle = NULL;
SAMPR_USER_ALL_INFORMATION userAllInfo = { 0 }; NTSTATUS enumGroupStatus; DWORD groupEnumerationContext = 0; DWORD groupCountReturned; UNICODE_STRING adminGroup; SAMPR_HANDLE hAdminGroup; UNICODE_STRING userName; UNICODE_STRING password; UNICODE_STRING uBuiltin; UNICODE_STRING serverName;
RtlInitUnicodeString(&uBuiltin, L"Builtin"); RtlInitUnicodeString(&userName, uName); RtlInitUnicodeString(&password, uPass); RtlInitUnicodeString(&serverName, L"localhost");
status = SamConnect(&serverName, &hServerHandle, SAM_SERVER_CONNECT | SAM_SERVER_ENUMERATE_DOMAINS | SAM_SERVER_LOOKUP_DOMAIN, FALSE);
if (NT_SUCCESS(status)) { do { enumDomainStatus = SamEnumerateDomainsInSamServer(hServerHandle, &domainEnumerationContext, &pEnumDomainBuffer, 1, &domainCountReturned); for (i = 0; i < domainCountReturned; i++) { if (RtlEqualUnicodeString(&pEnumDomainBuffer[i].Name, &uBuiltin, TRUE)) SamLookupDomainInSamServer(hServerHandle, &pEnumDomainBuffer[i].Name, &builtinDomainSid); else SamLookupDomainInSamServer(hServerHandle, &pEnumDomainBuffer[i].Name, &accountDomainSid); }
} while (enumDomainStatus == STATUS_MORE_ENTRIES);
status = SamOpenDomain(hServerHandle, DOMAIN_LOOKUP | DOMAIN_CREATE_USER, accountDomainSid, &hDomainHandle); if (NT_SUCCESS(status)) { status = SamCreateUser2InDomain(hDomainHandle, &userName, USER_NORMAL_ACCOUNT, USER_ALL_ACCESS | DELETE | WRITE_DAC, &hUserHandle, &grantAccess, &relativeId); if (NT_SUCCESS(status)) { wprintf(L"[*] SamCreateUser2InDomain success. User RID: %d\n", relativeId); userAllInfo.NtPasswordPresent = TRUE; userAllInfo.WhichFields |= USER_ALL_NTPASSWORDPRESENT;
userAllInfo.UserAccountControl &= 0xFFFFFFFE; userAllInfo.UserAccountControl |= USER_NORMAL_ACCOUNT; userAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL; RtlInitUnicodeString(&userAllInfo.NtOwfPassword, password.Buffer);
status = SamSetInformationUser(hUserHandle, UserAllInformation, &userAllInfo); if (NT_SUCCESS(status)) { wprintf(L"[*] SamSetInformationUser success.\n"); } else wprintf(L"[!] SamSetInformationUser error 0x%08X\n", status); } else wprintf(L"[!] SamCreateUser2InDomain error 0x%08X\n", status);
} else wprintf(L"[!] SamOpenDomain error. 0x%0X8\n", status);
status = SamOpenDomain(hServerHandle, DOMAIN_LOOKUP, builtinDomainSid, &hDomainHandle); if (NT_SUCCESS(status)) { RtlInitUnicodeString(&adminGroup, L"administrators"); status = SamLookupNamesInDomain(hDomainHandle, 1, &adminGroup, &adminRID, &USE); if (NT_SUCCESS(status)) { status = SamOpenAlias(hDomainHandle, ALIAS_ADD_MEMBER, *adminRID, &hAdminGroup); if (NT_SUCCESS(status)) { SamRidToSid(hUserHandle, relativeId, &userSID); status = SamAddMemberToAlias(hAdminGroup, userSID); if (NT_SUCCESS(status)) { wprintf(L"[*] SamAddMemberToAlias success.\n"); } else wprintf(L"[!] AddMemberToAlias error 0x%08X\n", status); } else wprintf(L"[!] SamOpenAlias error 0x%08X\n", status); } else wprintf(L"[!] SamLookupNamesInDomain error 0x%08X\n", status); } } else wprintf(L"[!] Samconnect error\n");
SamCloseHandle(hUserHandle); SamCloseHandle(hDomainHandle); SamCloseHandle(hServerHandle); SamFreeMemory(pEnumDomainBuffer); SamFreeMemory(pEnumGroupBuffer);
}
int wmain(int argc, wchar_t* argv[]) { if (argc == 3) { AddUser(argv[1], argv[2]); } else wprintf(L"Usage: AddUserBySAMR.exe <username> <password>");
return 0; }
|