首先要感谢哥们对我的指点,多谢。

当我们遇到类似情况下,如何获取保存在MSSQL工具里的凭证呢?

 //如果对方连接地址后面加了IP\sqlexpress 连接的时候你也记得加上,不然即使密码正确,也会说登录失败。

通过和哥们讨论研究分析以及查找资料,知道了密码存放的地方:

C:\Users\Administrator\AppData\Roaming\Microsoft\Microsoft SQL Server\90\Tools\ShellSEM\mru.dat (当前MSSQL 连接工具为2005)

我们通过C32来查看MRU.DAT,会发现一串BASE64编码:

这个就是我们的保存的凭证,但是并不是直接还原BASE64就可以了,需要DECODE后还需要DPAPI来进行解密:

代码如下:

// Encode.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#pragma comment(lib, "crypt32.lib")
using namespace std;int Base64Decoder(char *input, unsigned char *output)
{char base64string[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";BYTE dataBuffer[4];BYTE outputBuffer[3];BYTE finalBuffer[1000];int count=0;int padCount=0;int length;length = strlen(input);//Validate the data for BASE64if( length % 4 ){printf("%s - Invalid base64 data is supplied %s (%d) ", input, length);return 0;}//count the no of paddingif (input[length-1] == '=')padCount++;if (input[length-2] == '=')padCount++;// Process 4 chars in each loop to produce 3 charsfor (int i=0; i < length; i += 4){// Populate data buffer with position of Base64 characters for// next 4 bytes from encoded datafor (int j=0; j < 4 && (i + j < length); j++) dataBuffer[j] = ( (int)strchr(base64string, input[i+j]) - (int)base64string );//Decode data buffer back into bytesoutputBuffer[0] = (dataBuffer[0] << 2) + ((dataBuffer[1] & 0x30) >> 4);outputBuffer[1] = ((dataBuffer[1] & 0x0f) << 4) + ((dataBuffer[2] & 0x3c) >> 2);        outputBuffer[2] = ((dataBuffer[2] & 0x03) << 6) + dataBuffer[3];// Add all non-padded bytes in output buffer to decoded datafor (int k = 0; k < 3; k++)finalBuffer[count++]=outputBuffer[k];}count = count-padCount;//copy the decoded data into input buffer
    memcpy(output, finalBuffer, count);output[count]='\0';printf("Base64 decoded string is [%s] (%d) ", output, count);//    std::cout << "11111" << std::endl;std::cout << finalBuffer << std::endl;return count;
}int main(int argc,char** argv)
{unsigned char output[1000] = {0};//Base64Decoder("ZnVja3lvdQ==",output);int i=Base64Decoder("AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAfKVVCtCkz0SDfRfzGeyufQAAAAAQAAAARABlAGYAYQB1AGwAdAAAABBmAAAAAQAAIAAAAIDhFHSsCl9qoM1CbxlSVXqLXSDUuBs5sCx2hzy+tnkuAAAAAA6AAAAAAgAAIAAAAAdEQoQTYAeQGJYMsDfuOJdLHMGK4VtTu6SOzbla/TZFEAAAAACxb3rEQZjUHOpYTlkfwnhAAAAASc5uN4LAZ9A2IZadYsBRG87JhQjbWaQLY18FKf0fbyRlxIEQmxJm+1FLBCep32aWY4qkPy+1aELhj6IjnbCq/A==",output);if (i == 0){printf("Encode error\r\n");return -1;}DATA_BLOB DataPassword;DATA_BLOB DataOutput;DataPassword.cbData = i;DataPassword.pbData = output;if(CryptUnprotectData(&DataPassword,0,0,0,0,CRYPTPROTECT_UI_FORBIDDEN,&DataOutput)) //Crypt Mssql password
    {wcout << "Mssql credence Password Length: " << DataOutput.cbData << "\r\n"; wcout << "Mssql credence Password: " << (wchar_t*)DataOutput.pbData; }else{wcout << "Error";     return -1;}return 0;}

还有一份C#,是我哥们写的:

using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;namespace Mssql
{class Program{static void Main(string[] args){Console.WriteLine(Encoding.Unicode.GetString(System.Security.Cryptography.ProtectedData.Unprotect(Convert.FromBase64String("AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAfKVVCtCkz0SDfRfzGeyufQAAAAAQAAAARABlAGYAYQB1AGwAdAAAABBmAAAAAQAAIAAAAIDhFHSsCl9qoM1CbxlSVXqLXSDUuBs5sCx2hzy+tnkuAAAAAA6AAAAAAgAAIAAAAAdEQoQTYAeQGJYMsDfuOJdLHMGK4VtTu6SOzbla/TZFEAAAAACxb3rEQZjUHOpYTlkfwnhAAAAASc5uN4LAZ9A2IZadYsBRG87JhQjbWaQLY18FKf0fbyRlxIEQmxJm+1FLBCep32aWY4qkPy+1aELhj6IjnbCq/A=="), null, System.Security.Cryptography.DataProtectionScope.LocalMachine)));}}
}

还原后:

VC

C#

转载于:https://www.cnblogs.com/killbit/p/4355950.html

获取本机MSSQL保存凭证相关推荐

  1. [Qt教程] 第35篇 网络(五)获取本机网络信息

    [Qt教程] 第35篇 网络(五)获取本机网络信息 楼主  发表于 2013-9-5 11:32:58 | 查看: 278| 回复: 2 获取本机网络信息 版权声明 该文章原创于作者yafeilinu ...

  2. 第35篇 网络(五)获取本机网络信息

    导语 前面讲完了HTTP和FTP,下面本来该讲解UDP和TCP了.不过,在讲解它们之前,我们先在这一节里讲解一个以后要经常用到的名词,那就是IP地址. 对于IP地址,其实,会上网的人都应该听说过它.如 ...

  3. 计网 | C语言Socket编程获取本机IP及指定域名IP

    实验目的和要求 使用Winsock提供的API函数 ,利用Socket获得本机IP和本机名称. 使用Winsock提供的API函数 ,利用Socket获得百度域名的IP . 结果预览 环境记录 名称 ...

  4. 获取本机CPU,硬盘等使用情况

    早上的时候接到主管的一个任务,要获取服务器上的cpu,硬盘, 数据库等 的使用情况,并以邮件的方式发给boss, = =没办法,公司的服务器真是不敢恭维,顺便吐槽一下公司的网速,卡的时候30k左右徘徊 ...

  5. CPUID获取本机CPU信息

    CPUID获取本机CPU信息 目录 问题 分析 代码 运行结果 问题 请使用Visual Studio编写一个控制台程序,功能如下: 一.使用命令CPUInfo.exe -C读取本机CPU信息,并存储 ...

  6. Linux下 shell获取本机ip地址

    方法二 /sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6 | awk '{print $2}' | tr -d "add ...

  7. java windows wifi密码_java 获取本机连接过的所有WiFI密码

    windows,cmd中可以通过命令行输入指令: netsh wlan show profiles 来获取连接过的WiFi名: 然后可以输入命令:获取WiFi名为 哦 的个密码 netsh wlan ...

  8. Android 获取本机号码(收集)

    SIM卡存储的数据可分为四类: 第一类是固定存放的数据.这类数据在移动电话机被出售之前由SIM卡中心写入,包括国际移动用户识别号(IMSI).鉴权密钥(KI).鉴权和加密算法等等. 第二类是暂时存放的 ...

  9. android 扫描所有图片格式,Android获取本机各种类型文件列表(音乐、视频、图片、文档等)...

    介绍 本篇介绍Android获取本机各种类型文件的方法,已经封装成工具类,末尾有源码下载地址. 提示 获取音乐.视频.图片.文档等文件是需要有读取SD卡的权限的,如果是6.0以下的系统,则直接在清单文 ...

最新文章

  1. OCS 2007 聊天记录查看工具 OCSMessage
  2. PornHub:修复百年前情色电影
  3. 哪个星座更适合做产品经理?
  4. numpy 创建加一行_数据科学|可视化图解Python科学计算包Numpy
  5. android studio clone 方法不能先用,Android Studio中使用git功能无法clone原因分析
  6. JAVA 串口编程(二)
  7. 【DB2学习文档之七】SQL for DB2
  8. 2、Flutter 填坑记录篇
  9. vip会员管理系统c语言,路西牌会员管理系统。
  10. linux内存管理(六)-伙伴分配器
  11. JUC与JVM并发编程学习笔记04
  12. 从零实现GPT-2,瞎写笑傲江湖外传,金庸直呼内行
  13. CH341ser(usb转串口)驱动
  14. 车牌检测License Plate Detection and Recognition in Unconstrained Scenarios
  15. 量子计算机平行宇宙,量子纠缠效应揭示:每个人的行为也会影响到其它平行宇宙里的自己...
  16. Win10的系统重装
  17. 第二期:关于十大数据相关问答汇总,关注持续更新中哦~
  18. 华三模拟器实现DHCP获取地址
  19. 所谓的不撞南墙不回头
  20. Nmap命令详解(全)

热门文章

  1. 让dwz 的表格或者表单显示竖滚动条的代码
  2. [转载]VC6下安装STLport-5.2.1
  3. 内置函数sorted的10个小tips
  4. Thrift RPC 系列教程(3)——模块化
  5. 《你不知道的JavaScript》整理(四)——原型
  6. 运维:windows+python+route的一次相遇
  7. android中Logcat的TAG过滤
  8. shell脚本复制文件夹内容到另外的文件夹,如果存在则自动备份
  9. POJ 2955 (区间DP)
  10. N!的尾部连续0的个数