You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
316 lines
7.1 KiB
316 lines
7.1 KiB
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
crack.cxx
|
|
|
|
Abstract:
|
|
|
|
crack
|
|
|
|
Author:
|
|
|
|
Larry Zhu (LZhu) June 1, 2002 Created
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.hxx"
|
|
#pragma hdrstop
|
|
|
|
#include "crack.hxx"
|
|
#include <Ntdsapi.h>
|
|
|
|
#define SKIP_WSPACE(s) while (*s && (*s == TEXT(' ') || *s == TEXT('\t'))) { ++s; }
|
|
#define SKIP_NON_WSPACE(s) while (*s && (*s != TEXT(' ') && *s != TEXT('\t') && *s != TEXT('\n'))) { ++s; }
|
|
|
|
VOID
|
|
Usage(
|
|
IN PCTSTR pszApp
|
|
)
|
|
{
|
|
SspiPrint(SSPI_ERROR,
|
|
TEXT("\n\nUsage: %s [-domaincontroller <domaincontroller>] [-dnsdomainname <dnsdomainname>]\n")
|
|
TEXT("[-flags <flags>] [-formatoffered <formatoffered>] [-formatdesired <formatdesired>]\n")
|
|
TEXT("[-names <names>]\n\n"), pszApp);
|
|
exit(-1);
|
|
}
|
|
|
|
VOID
|
|
ReleaseArgumentList(
|
|
IN ULONG cArgs,
|
|
IN PTSTR* ppszArgs
|
|
)
|
|
{
|
|
if (ppszArgs)
|
|
{
|
|
for (ULONG i = 0; i < cArgs; i++)
|
|
{
|
|
delete [] ppszArgs[i];
|
|
}
|
|
delete [] ppszArgs;
|
|
}
|
|
}
|
|
|
|
HRESULT
|
|
String2ArgumentList(
|
|
IN PTSTR pszArgs,
|
|
OUT ULONG* pcArgs,
|
|
OUT PTSTR** pppszArgs
|
|
)
|
|
{
|
|
HRESULT hRetval = S_OK;
|
|
|
|
ULONG cArgs = 0;
|
|
PTSTR* ppszArgs = NULL;
|
|
PTSTR pszSave = pszArgs;
|
|
|
|
*pcArgs = NULL;
|
|
*pppszArgs = NULL;
|
|
|
|
while (pszArgs && *pszArgs)
|
|
{
|
|
SKIP_WSPACE(pszArgs);
|
|
++cArgs;
|
|
|
|
// check for quote
|
|
if (*pszArgs == TEXT('"'))
|
|
{
|
|
++pszArgs;
|
|
if (*pszArgs == TEXT('"'))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
while (*pszArgs && (*pszArgs++ != TEXT('"'))) /* empty */;
|
|
|
|
if (*(pszArgs - 1) != TEXT('"'))
|
|
{
|
|
hRetval = E_INVALIDARG;
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SKIP_NON_WSPACE(pszArgs);
|
|
}
|
|
}
|
|
|
|
if (cArgs)
|
|
{
|
|
pszArgs = pszSave;
|
|
ppszArgs = new PTSTR[cArgs];
|
|
|
|
if (!ppszArgs)
|
|
{
|
|
hRetval = E_OUTOFMEMORY;
|
|
goto Cleanup;
|
|
}
|
|
RtlZeroMemory(ppszArgs, cArgs * sizeof(PTSTR));
|
|
|
|
ULONG argc = 0;
|
|
|
|
while (pszArgs && *pszArgs)
|
|
{
|
|
SKIP_WSPACE(pszArgs);
|
|
|
|
PTSTR pStart = pszArgs;
|
|
PTSTR pEnd = pStart;
|
|
|
|
// check for quote
|
|
if (*pszArgs == TEXT('"'))
|
|
{
|
|
++pszArgs;
|
|
pStart = pszArgs;
|
|
if (*pszArgs == TEXT('"'))
|
|
{
|
|
pEnd = pStart;
|
|
}
|
|
else
|
|
{
|
|
while (*pszArgs && (*pszArgs++ != TEXT('"'))) /* empty */;
|
|
|
|
pEnd = pszArgs - 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SKIP_NON_WSPACE(pszArgs);
|
|
pEnd = pszArgs;
|
|
}
|
|
|
|
TCHAR* pszItem = new TCHAR[pEnd - pStart + 1];
|
|
|
|
if (!pszItem)
|
|
{
|
|
hRetval = E_OUTOFMEMORY;
|
|
goto Cleanup;
|
|
}
|
|
|
|
RtlCopyMemory(
|
|
pszItem,
|
|
pStart,
|
|
(pEnd - pStart) * sizeof(TCHAR)
|
|
);
|
|
|
|
pszItem[pEnd - pStart] = TEXT('\0');
|
|
|
|
ppszArgs[argc] = pszItem;
|
|
|
|
++argc;
|
|
}
|
|
}
|
|
|
|
*pppszArgs = ppszArgs;
|
|
*pcArgs = cArgs;
|
|
|
|
cArgs = 0;
|
|
ppszArgs = NULL;
|
|
|
|
Cleanup:
|
|
|
|
ReleaseArgumentList(cArgs, ppszArgs);
|
|
|
|
return hRetval;
|
|
}
|
|
|
|
VOID __cdecl
|
|
_tmain(
|
|
IN INT argc,
|
|
IN PTSTR argv[]
|
|
)
|
|
{
|
|
THResult hRetval = S_OK;
|
|
|
|
HANDLE hDs = NULL;
|
|
|
|
PTSTR pszDomainController = NULL;
|
|
PTSTR pszDnsDomainName = NULL;
|
|
PTSTR pszNames = NULL;
|
|
ULONG FormatOffered = DS_USER_PRINCIPAL_NAME;
|
|
ULONG FormatDesired = DS_NT4_ACCOUNT_NAME;
|
|
ULONG Flags = 0;
|
|
ULONG cNames = 0;
|
|
PTSTR* rpNames = NULL;
|
|
DS_NAME_RESULT* pResult = NULL;
|
|
|
|
ULONG mark = 1;
|
|
|
|
argc--;
|
|
|
|
while (argc)
|
|
{
|
|
if (!lstrcmp(argv[mark], TEXT("-domaincontroller")) && argc > 1)
|
|
{
|
|
argc--; mark++;
|
|
pszDomainController = argv[mark];
|
|
argc--; mark++;
|
|
}
|
|
else if (!lstrcmp(argv[mark], TEXT("-dnsdomainname")) && argc > 1)
|
|
{
|
|
argc--; mark++;
|
|
pszDnsDomainName = argv[mark];
|
|
argc--; mark++;
|
|
}
|
|
else if (!lstrcmp(argv[mark], TEXT("-formatoffered")) && argc > 1)
|
|
{
|
|
argc--; mark++;
|
|
FormatOffered = lstrtol(argv[mark], NULL, 0);
|
|
argc--; mark++;
|
|
}
|
|
else if (!lstrcmp(argv[mark], TEXT("-formatdesired")) && argc > 1)
|
|
{
|
|
argc--; mark++;
|
|
FormatDesired = lstrtol(argv[mark], NULL, 0);
|
|
argc--; mark++;
|
|
}
|
|
else if (!lstrcmp(argv[mark], TEXT("-flags")) && argc > 1)
|
|
{
|
|
argc--; mark++;
|
|
Flags = lstrtol(argv[mark], NULL, 0);
|
|
argc--; mark++;
|
|
}
|
|
else if (!lstrcmp(argv[mark], TEXT("-names")) && argc > 1)
|
|
{
|
|
argc--; mark++;
|
|
pszNames = argv[mark];
|
|
argc--; mark++;
|
|
}
|
|
else if (!lstrcmp(argv[mark], TEXT("-h"))
|
|
|| !lstrcmp(argv[mark], TEXT("-?"))
|
|
|| !lstrcmp(argv[mark], TEXT("/h"))
|
|
|| !lstrcmp(argv[mark], TEXT("/?")))
|
|
{
|
|
argc--; mark++;
|
|
Usage(argv[0]);
|
|
}
|
|
else
|
|
{
|
|
Usage(argv[0]);
|
|
}
|
|
}
|
|
|
|
hRetval DBGCHK = String2ArgumentList(pszNames, &cNames, &rpNames);
|
|
|
|
SspiPrint(SSPI_LOG,
|
|
TEXT("DC \"%s\", DnsDomain \"%s\", Flags %#x, Names \"%s\", FormatOffered %#x, FormatDesired %#x, cNames %#x\n"),
|
|
pszDomainController,
|
|
pszDnsDomainName,
|
|
Flags,
|
|
pszNames,
|
|
FormatOffered,
|
|
FormatDesired,
|
|
cNames);
|
|
|
|
if (SUCCEEDED(hRetval))
|
|
{
|
|
hRetval DBGCHK = HResultFromWin32(
|
|
DsBind(
|
|
pszDomainController,
|
|
pszDnsDomainName,
|
|
&hDs
|
|
));
|
|
}
|
|
|
|
if (SUCCEEDED(hRetval))
|
|
{
|
|
hRetval DBGCHK = HResultFromWin32(
|
|
DsCrackNames(
|
|
hDs,
|
|
(DS_NAME_FLAGS) Flags,
|
|
(DS_NAME_FORMAT) FormatOffered,
|
|
(DS_NAME_FORMAT) FormatDesired,
|
|
cNames ,
|
|
rpNames,
|
|
&pResult
|
|
));
|
|
}
|
|
|
|
|
|
if (pResult)
|
|
{
|
|
for (ULONG i = 0; i < pResult->cItems; i++)
|
|
{
|
|
SspiPrint(SSPI_LOG,
|
|
TEXT("Item %#x: status %#x, domain \"%s\", name \"%s\"\n"),
|
|
i,
|
|
pResult->rItems[i].status,
|
|
pResult->rItems[i].pDomain,
|
|
pResult->rItems[i].pName);
|
|
}
|
|
DsFreeNameResult(pResult);
|
|
}
|
|
|
|
if (hDs)
|
|
{
|
|
DsUnBind(&hDs);
|
|
}
|
|
}
|
|
|