Leaked source code of windows server 2003
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.
 
 
 
 
 
 

204 lines
4.4 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: decode.c
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 8-10-95 RichardW Created
//
//----------------------------------------------------------------------------
#include <windows.h>
#include <ntsdexts.h>
#include "ber.h"
#include "rsa.h"
PNTSD_EXTENSION_APIS pExtApis;
HANDLE hDbgThread;
HANDLE hDbgProcess;
extern BOOL BerVerbose;
#define DebuggerOut (pExtApis->lpOutputRoutine)
#define GetSymbol (pExtApis->lpGetSymbolRoutine)
#define GetExpr (PVOID) (pExtApis->lpGetExpressionRoutine)
#define InitDebugHelp(hProc,hThd,pApis) {hDbgProcess = hProc; hDbgThread = hThd; pExtApis = pApis;}
#define ExitIfCtrlC() if (pExtApis->lpCheckControlCRoutine()) return;
#define BreakIfCtrlC() if (pExtApis->lpCheckControlCRoutine()) break;
int
ReadMemory( PVOID pvAddress,
ULONG cbMemory,
PVOID pvLocalMemory)
{
SIZE_T cbActual = cbMemory;
if (ReadProcessMemory(hDbgProcess, pvAddress, pvLocalMemory, cbMemory, &cbActual))
{
if (cbActual != cbMemory)
{
return(-1);
}
return(0);
}
return(GetLastError());
}
void
BERDecode(HANDLE hProcess,
HANDLE hThread,
DWORD dwCurrentPc,
PNTSD_EXTENSION_APIS lpExt,
LPSTR pszCommand)
{
PUCHAR pbBuffer;
PVOID pRemote;
DWORD cb;
UCHAR Short[8];
DWORD len;
DWORD i;
DWORD Length;
CHAR Buf[80];
PSTR pBuf;
PUCHAR End;
UCHAR Type;
PSTR pszNext;
DWORD Flags;
DWORD headerLength ;
PUCHAR Scan ;
InitDebugHelp(hProcess, hThread, lpExt);
Flags = 0;
while ( *pszCommand == '-' )
{
pszCommand++;
if ( *pszCommand == 'v' )
{
Flags |= DECODE_VERBOSE_OIDS ;
}
if ( *pszCommand == 'n' )
{
Flags |= DECODE_NEST_OCTET_STRINGS ;
}
pszCommand++;
pszCommand++;
}
pszNext = strchr(pszCommand, ' ');
if (pszNext)
{
*pszNext++ = '\0';
}
pRemote = GetExpr(pszCommand);
if (pszNext)
{
cb = (DWORD)((ULONG_PTR)GetExpr(pszNext));
}
else
{
ReadMemory(pRemote, 4, Short);
if (Short[1] & 0x80)
{
headerLength = Short[1] & 0x7F ;
cb = 0 ;
Scan = &Short[2];
ReadMemory( pRemote, headerLength + 1, Short );
while ( headerLength )
{
cb = (cb << 8) + *Scan ;
headerLength-- ;
Scan++ ;
}
}
else
{
cb = Short[1];
}
}
pbBuffer = LocalAlloc(LMEM_FIXED, cb + 4);
if (!pbBuffer)
{
DebuggerOut("Failed to alloc mem\n");
return;
}
DebuggerOut("Size is %d (%#x) bytes\n", cb, cb);
ReadMemory(pRemote, cb + 4, pbBuffer);
ber_decode(lpExt->lpOutputRoutine,
lpExt->lpCheckControlCRoutine,
pbBuffer,
Flags,
0, 0, cb + 4, 0);
}
void
DumpKey(HANDLE hProcess,
HANDLE hThread,
DWORD dwCurrentPc,
PNTSD_EXTENSION_APIS lpExt,
LPSTR pszCommand)
{
BSAFE_PUB_KEY Pub;
BSAFE_PRV_KEY Prv;
PVOID Key;
DWORD KeyType;
DWORD Bits;
BSAFE_KEY_PARTS Parts;
DWORD PubSize;
DWORD PrvSize;
InitDebugHelp(hProcess, hThread, lpExt);
Key = GetExpr(pszCommand);
ReadMemory( Key, sizeof(DWORD), &KeyType );
if ((KeyType != RSA1) && (KeyType != RSA2))
{
DebuggerOut("not an rsa key\n");
return;
}
ReadMemory( Key, sizeof(BSAFE_PUB_KEY), &Pub );
Bits = Pub.bitlen;
}