//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995. // // File: decode.c // // Contents: // // Classes: // // Functions: // // History: 8-10-95 RichardW Created // //---------------------------------------------------------------------------- #include #include #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; }