获取本机MSSQL保存凭证
首先要感谢哥们对我的指点,多谢。
当我们遇到类似情况下,如何获取保存在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[];
BYTE outputBuffer[];
BYTE finalBuffer[];
int count=;
int padCount=;
int length; length = strlen(input); //Validate the data for BASE64
if( length % )
{
printf("%s - Invalid base64 data is supplied %s (%d) ", input, length);
return ;
} //count the no of padding
if (input[length-] == '=')
padCount++; if (input[length-] == '=')
padCount++; // Process 4 chars in each loop to produce 3 chars
for (int i=; i < length; i += )
{ // Populate data buffer with position of Base64 characters for
// next 4 bytes from encoded data
for (int j=; j < && (i + j < length); j++)
dataBuffer[j] = ( (int)strchr(base64string, input[i+j]) - (int)base64string ); //Decode data buffer back into bytes
outputBuffer[] = (dataBuffer[] << ) + ((dataBuffer[] & 0x30) >> );
outputBuffer[] = ((dataBuffer[] & 0x0f) << ) + ((dataBuffer[] & 0x3c) >> );
outputBuffer[] = ((dataBuffer[] & 0x03) << ) + dataBuffer[]; // Add all non-padded bytes in output buffer to decoded data
for (int k = ; k < ; 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[] = {};
//Base64Decoder("ZnVja3lvdQ==",output);
int i=Base64Decoder("AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAfKVVCtCkz0SDfRfzGeyufQAAAAAQAAAARABlAGYAYQB1AGwAdAAAABBmAAAAAQAAIAAAAIDhFHSsCl9qoM1CbxlSVXqLXSDUuBs5sCx2hzy+tnkuAAAAAA6AAAAAAgAAIAAAAAdEQoQTYAeQGJYMsDfuOJdLHMGK4VtTu6SOzbla/TZFEAAAAACxb3rEQZjUHOpYTlkfwnhAAAAASc5uN4LAZ9A2IZadYsBRG87JhQjbWaQLY18FKf0fbyRlxIEQmxJm+1FLBCep32aWY4qkPy+1aELhj6IjnbCq/A==",output);
if (i == )
{
printf("Encode error\r\n");
return -;
} DATA_BLOB DataPassword;
DATA_BLOB DataOutput;
DataPassword.cbData = i;
DataPassword.pbData = output; if(CryptUnprotectData(&DataPassword,,,,,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 ; }
还有一份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#

获取本机MSSQL保存凭证的更多相关文章
- 获取本机的IP地址(局域网)与主机名称
编写内容保存为bat @echo off &setlocal enabledelayedexpansion Rem '/*========获取本机的IP地址(局域网)=========*/ e ...
- linux编程获取本机网络相关参数
getifaddrs()和struct ifaddrs的使用,获取本机IP 博客分类: Linux C编程 ifaddrs结构体定义如下: struct ifaddrs { struct ifad ...
- 获取本机CPU,硬盘等使用情况
早上的时候接到主管的一个任务,要获取服务器上的cpu,硬盘, 数据库等 的使用情况,并以邮件的方式发给boss, = =没办法,公司的服务器真是不敢恭维,顺便吐槽一下公司的网速,卡的时候30k左右徘徊 ...
- 用 shell 获取本机的网卡名称
用 shell 获取本机的网卡名称 # 用 shell 获取本机的网卡名称 ls /sys/class/net # 或者 ifconfig | grep "Link" | awk ...
- Linux中获取本机的最新IPv6地址_更新ddns的脚本
Linux中获取本机的最新IPv6地址_更新ddns的脚本 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-07. 运营商提供ipv6地址. 路由器后有台linux机器,通过e ...
- Docker容器获取宿主机信息
最近在做产品授权的东西,开始宿主机为Window,程序获取机器硬件信息相对简单些,后来部署时发现各种各样的的环境问题,所有后来改用dokcer部署,docker方式获取宿主机信息时花了些时间,特此记录 ...
- 【Win 10 应用开发】获取本机的IP地址
按照老规矩,也是朋友的建议,老周今天在吹牛之前,先讲一个小故事. 有朋友问我,老周,你现在还发短信吗,你每个月用多少电话费?唉,实话说,现在真的发短信不多了,套餐送的130条短信,每月都发不了一条.至 ...
- 获取本机IP地址
这里有两种方法: //获取本机IP - (NSString *)localIPAddress { NSString *localIP = nil; struct ifaddrs *addrs; ) { ...
- python未知网卡名情况下获取本机IP
import socket def get_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # doesn't even ...
随机推荐
- CentOS系统bash: groupadd: command not found问题
如果我们需要在CentOS执行新建用户组命令的时候,需要进入到ROOT权限,如果你用以下命令: 1 su2 su root 进入到ROOT账户,那么会出现上述的错误信息:“bash: groupadd ...
- 标准模板库--STL
标准模板库STL 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic progra ...
- hihocoder 1279(状压)
坑爹的题目.不过不能说不是一道挺好的题目. 坑主要坑在,妹的我一样的复杂度,写的姿势略差了点然后就一直超时. 比赛的时候我还直接就看错题目,把AND运算看成了OR...还敲完交了一发. 这题很容易想到 ...
- JS将秒转换为 天
function SecondToDate(msd) { var time =msd if (null != time && " ...
- Introduction to Mathematical Thinking - Week 2
基本数学概念 real number(实数):是有理数和无理数的总称 有理数:可以表达为两个整数比的数(a/b, b!=0) 无理数是指除有理数以外的实数 imply -- 推导出 不需要 A 能推导 ...
- coursera 《现代操作系统》 -- 第四周 处理器调度
优先级反转 这往往出现在一个高优先级任务等待访问一个被低优先级任务正在使用的临界资源,从而阻塞了高优先级任务:同时,该低优先级任务被一个次高优先级的任务所抢先,从而无法及时地释放该临界资源.这种情况下 ...
- vertical-align:middle;一般用于img和行内文字对齐方式
vertical-align:top ;文字和行内块元素的顶部对齐 vertical-align:middle;居中 vertical-align:bottom;底对齐
- MySQL二进制包安装简略过程
l 软件目录 [root@MASTER_03 ~]# mkdir -pv /data/software [root@MASTER_03 ~]# cd /data/software/ [root@MA ...
- (4.16)sql server迁移DB文件(同一DB内)
SQL Server 修改数据库物理文件存在位置 关键词:迁移文件,迁移temp库(这怎么迁移呢,用方法2即可,需要重启实例) 三种均需要离线: 一共分为(1)脱机迁移和(2)在线迁移. (1)迁移方 ...
- 印象笔记ipad端快捷键