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

当我们遇到类似情况下,如何获取保存在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来进行解密:

代码如下:

  1. // Encode.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include <Windows.h>
  5. #include <stdio.h>
  6. #include <iostream>
  7. #include <cstdlib>
  8. #include <stdio.h>
  9. #pragma comment(lib, "crypt32.lib")
  10. using namespace std;
  11.  
  12. int Base64Decoder(char *input, unsigned char *output)
  13. {
  14. char base64string[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  15. BYTE dataBuffer[];
  16. BYTE outputBuffer[];
  17. BYTE finalBuffer[];
  18. int count=;
  19. int padCount=;
  20. int length;
  21.  
  22. length = strlen(input);
  23.  
  24. //Validate the data for BASE64
  25. if( length % )
  26. {
  27. printf("%s - Invalid base64 data is supplied %s (%d) ", input, length);
  28. return ;
  29. }
  30.  
  31. //count the no of padding
  32. if (input[length-] == '=')
  33. padCount++;
  34.  
  35. if (input[length-] == '=')
  36. padCount++;
  37.  
  38. // Process 4 chars in each loop to produce 3 chars
  39. for (int i=; i < length; i += )
  40. {
  41.  
  42. // Populate data buffer with position of Base64 characters for
  43. // next 4 bytes from encoded data
  44. for (int j=; j < && (i + j < length); j++)
  45. dataBuffer[j] = ( (int)strchr(base64string, input[i+j]) - (int)base64string );
  46.  
  47. //Decode data buffer back into bytes
  48. outputBuffer[] = (dataBuffer[] << ) + ((dataBuffer[] & 0x30) >> );
  49. outputBuffer[] = ((dataBuffer[] & 0x0f) << ) + ((dataBuffer[] & 0x3c) >> );
  50. outputBuffer[] = ((dataBuffer[] & 0x03) << ) + dataBuffer[];
  51.  
  52. // Add all non-padded bytes in output buffer to decoded data
  53. for (int k = ; k < ; k++)
  54. finalBuffer[count++]=outputBuffer[k];
  55.  
  56. }
  57.  
  58. count = count-padCount;
  59.  
  60. //copy the decoded data into input buffer
  61. memcpy(output, finalBuffer, count);
  62. output[count]='\0';
  63.  
  64. printf("Base64 decoded string is [%s] (%d) ", output, count);
  65. // std::cout << "11111" << std::endl;
  66. std::cout << finalBuffer << std::endl;
  67. return count;
  68. }
  69.  
  70. int main(int argc,char** argv)
  71. {
  72. unsigned char output[] = {};
  73. //Base64Decoder("ZnVja3lvdQ==",output);
  74. int i=Base64Decoder("AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAfKVVCtCkz0SDfRfzGeyufQAAAAAQAAAARABlAGYAYQB1AGwAdAAAABBmAAAAAQAAIAAAAIDhFHSsCl9qoM1CbxlSVXqLXSDUuBs5sCx2hzy+tnkuAAAAAA6AAAAAAgAAIAAAAAdEQoQTYAeQGJYMsDfuOJdLHMGK4VtTu6SOzbla/TZFEAAAAACxb3rEQZjUHOpYTlkfwnhAAAAASc5uN4LAZ9A2IZadYsBRG87JhQjbWaQLY18FKf0fbyRlxIEQmxJm+1FLBCep32aWY4qkPy+1aELhj6IjnbCq/A==",output);
  75. if (i == )
  76. {
  77. printf("Encode error\r\n");
  78. return -;
  79. }
  80.  
  81. DATA_BLOB DataPassword;
  82. DATA_BLOB DataOutput;
  83. DataPassword.cbData = i;
  84. DataPassword.pbData = output;
  85.  
  86. if(CryptUnprotectData(&DataPassword,,,,,CRYPTPROTECT_UI_FORBIDDEN,&DataOutput)) //Crypt Mssql password
  87. {
  88. wcout << "Mssql credence Password Length: " << DataOutput.cbData << "\r\n";
  89. wcout << "Mssql credence Password: " << (wchar_t*)DataOutput.pbData;
  90. }else
  91. {
  92. wcout << "Error";
         return -1;
  93. }
  94. return ;
  95.  
  96. }

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

  1. using System;
  2. using System.Collections.Generic;
  3. //using System.Linq;
  4. using System.Text;
  5.  
  6. namespace Mssql
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. 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)));
  13. }
  14. }
  15. }

还原后:

VC

C#

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

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

    编写内容保存为bat @echo off &setlocal enabledelayedexpansion Rem '/*========获取本机的IP地址(局域网)=========*/ e ...

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

    getifaddrs()和struct ifaddrs的使用,获取本机IP 博客分类: Linux C编程   ifaddrs结构体定义如下: struct ifaddrs { struct ifad ...

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

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

  4. 用 shell 获取本机的网卡名称

    用 shell 获取本机的网卡名称 # 用 shell 获取本机的网卡名称 ls /sys/class/net # 或者 ifconfig | grep "Link" | awk ...

  5. Linux中获取本机的最新IPv6地址_更新ddns的脚本

    Linux中获取本机的最新IPv6地址_更新ddns的脚本 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-07. 运营商提供ipv6地址. 路由器后有台linux机器,通过e ...

  6. Docker容器获取宿主机信息

    最近在做产品授权的东西,开始宿主机为Window,程序获取机器硬件信息相对简单些,后来部署时发现各种各样的的环境问题,所有后来改用dokcer部署,docker方式获取宿主机信息时花了些时间,特此记录 ...

  7. 【Win 10 应用开发】获取本机的IP地址

    按照老规矩,也是朋友的建议,老周今天在吹牛之前,先讲一个小故事. 有朋友问我,老周,你现在还发短信吗,你每个月用多少电话费?唉,实话说,现在真的发短信不多了,套餐送的130条短信,每月都发不了一条.至 ...

  8. 获取本机IP地址

    这里有两种方法: //获取本机IP - (NSString *)localIPAddress { NSString *localIP = nil; struct ifaddrs *addrs; ) { ...

  9. python未知网卡名情况下获取本机IP

    import socket def get_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # doesn't even ...

随机推荐

  1. POI1999(仓库管理员)

    题目链接:传送门

  2. Building Shops

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...

  3. Oracle备份一张表

    数据库:myOnly 创建表:myTable 的备份表 myTable_tmpe create table myTable_tmpe as select * from myTable ; 补充: -- ...

  4. python系列二:python3基本数据类型

    #标准数据类型——number(数字)a, b, c = 1, 2.2, "hello"print(a, end = ", ")print(b, end = & ...

  5. window 注册表上下文菜单如何配置?

    注册表结构? Keys Abbreviation Description 描述 HKEY_CLASSES_ROOT HKCR Stores file association and COM objec ...

  6. RabbitMQ_消息队列基本使用_1

    什么叫消息队列 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象. 消息队列(Message Queue)是一种应用间的通信方式,消 ...

  7. javascript实例:显示时间

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. CentOS中yum安装Java

    查看CentOS自带JDK是否已安装.◆输入:yum list installed |grep java. 若有自带安装的JDK,如何卸载CentOS系统自带Java环境?◆卸载JDK相关文件输入:y ...

  9. linux增加 路由使两个不同的网段可以访问

    举例:在交换机上有2个vlan 地址分别是192.168.10.1/24 192.168.20.1/24 2台server:一台A:server地址是192.168.10.3/24,一台B:serve ...

  10. Hadoop权威指南读书笔记

    本书中提到的Hadoop项目简述 Common:一组分布式文件系统和通用I/O的组件与接口(序列化.javaRPC和持久化数据结构). Avro:一种支持高效.跨语言的RPC以及永久存储数据的序列化系 ...