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
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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|