来自http://www.msning.com/bbs/index.php?showtopic=15654

/* MSNMessenger的口令是经过DPAPI加密后保存在注册表中的
* 这个程序演示解码过程
* tombkeeper[0x40]nsfocus[0x2e]com
* tombkeeper[0x40]xfocus[0x2e]net
* 2004.08.11
*/
#include <Windows.h>

#pragma comment(lib, "Advapi32.lib")
#define FCHK(a) if (!(a)) {printf(#a " failed\n"); return 0;}
typedef struct _CRYPTOAPI_BLOB {
DWORD cbData;
BYTE* pbData;
} DATA_BLOB;
typedef struct _CRYPTPROTECT_PROMPTSTRUCT {
DWORD cbSize;
DWORD dwPromptFlags;
HWND hwndApp;
LPCWSTR szPrompt;
} CRYPTPROTECT_PROMPTSTRUCT, *PCRYPTPROTECT_PROMPTSTRUCT;
typedef BOOL (WINAPI *PCryptUnprotectData)(
DATA_BLOB* pDataIn,
LPWSTR* ppszDataDescr,
DATA_BLOB* pOptionalEntropy,
PVOID pvReserved,
CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct,
DWORD dwFlags,
DATA_BLOB* pDataOut
);
PCryptUnprotectData CryptUnprotectData = NULL;

int main(void)
{
int ret;
HMODULE hNtdll;
HKEY hKey;
DWORD dwType;
char Data[0x100] = {0};
DWORD dwSize;
DATA_BLOB DataIn;
DATA_BLOB DataOut;
ret = RegOpenKeyEx
(
HKEY_CURRENT_USER,
"Software\\Microsoft\\MSNMessenger",
0,
KEY_READ,
&hKey
);
if( ret != ERROR_SUCCESS ) return 1;
ret = RegQueryValueEx
(
hKey,
"Password.NET Messenger Service",
NULL,
&dwType,
Data,
&dwSize
);
if( ret != ERROR_SUCCESS ) return 1;
FCHK ((hNtdll = LoadLibrary ("Crypt32.dll")) != NULL);
FCHK ((CryptUnprotectData = (PCryptUnprotectData)
GetProcAddress (hNtdll, "CryptUnprotectData")) != NULL);
DataIn.pbData = Data + 2; //口令密文从第二位开始
DataIn.cbData = dwSize-2;
CryptUnprotectData
(
&DataIn,
NULL,
NULL,
NULL,
NULL,
1,
&DataOut
);
base64_decode (DataOut.pbData, Data, strlen(DataOut.pbData));
printf ( "MSN Password: %s\n", Data);
return 0;
}
//copied from GNU libc - libc/resolv/base64.c
int base64_decode (char const *src, char *target, size_t targsize)
{
static const char Base64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const char Pad64 = ‘=‘;
int tarindex, state, ch;
char *pos;
state = 0;
tarindex = 0;
while ((ch = *src++) != ‘\0‘)
{
if (isspace (ch)) /* Skip whitespace anywhere. */
continue;
if (ch == Pad64)
break;
pos = strchr (Base64, ch);
if (pos == 0) /* A non-base64 character. */
return (-1);
switch (state)
{
case 0:
if (target)
{
if ((size_t) tarindex >= targsize)
return (-1);
target[tarindex] = (pos - Base64) << 2;
}
state = 1;
break;
case 1:
if (target)
{
if ((size_t) tarindex + 1 >= targsize)
return (-1);
target[tarindex] |= (pos - Base64) >> 4;
target[tarindex + 1] = ((pos - Base64) & 0x0f) << 4;
}
tarindex++;
state = 2;
break;
case 2:
if (target)
{
if ((size_t) tarindex + 1 >= targsize)
return (-1);
target[tarindex] |= (pos - Base64) >> 2;
target[tarindex + 1] = ((pos - Base64) & 0x03) << 6;
}
tarindex++;
state = 3;
break;
case 3:
if (target)
{
if ((size_t) tarindex >= targsize)
return (-1);
target[tarindex] |= (pos - Base64);
}
tarindex++;
state = 0;
break;
default:
abort ();
}
}
/*
* We are done decoding Base-64 chars. Let‘s see if we ended
* on a byte boundary, and/or with erroneous trailing characters.
*/
if (ch == Pad64)
{ /* We got a pad char. */
ch = *src++; /* Skip it, get next. */
switch (state)
{
case 0: /* Invalid = in first position */
case 1: /* Invalid = in second position */
return (-1);
case 2: /* Valid, means one byte of info */
/* Skip any number of spaces. */
for ((void) NULL; ch != ‘\0‘; ch = *src++)
if (!isspace (ch))
break;
/* Make sure there is another trailing = sign. */
if (ch != Pad64)
return (-1);
ch = *src++; /* Skip the = */
/* Fall through to "single trailing =" case. */
/* FALLTHROUGH */
case 3: /* Valid, means two bytes of info */
/*
* We know this char is an =. Is there anything but
* whitespace after it?
*/
for ((void) NULL; ch != ‘\0‘; ch = *src++)
if (!isspace (ch))
return (-1);
/*
* Now make sure for cases 2 and 3 that the "extra"
* bits that slopped past the last full byte were
* zeros. If we don‘t check them, they become a
* subliminal channel.
*/
if (target && target[tarindex] != 0)
return (-1);
}
}
else
{
/*
* We ended by seeing the end of the string. Make sure we
* have no partial bytes lying around.
*/
if (state != 0)
return (-1);
}
return (tarindex);
}
//透视木马开发技术

转载于:https://www.cnblogs.com/enhydraboy/archive/2004/12/01/71533.html

[ZT]MSN Messenger的口令获取源代码, MSNMessenger的口令是经过DPAPI加密后保存在注册表中...相关推荐

  1. javascript判断并获取注册表中的可信任站点(可以为域名和IP)

    判断可信任站点,首先要在注册表中找到可信任站点在注册表中的位置,如下: (1)域名作为可信任站点在注册表中的位置: HKCU\\Software\\Microsoft\\Windows\\Curren ...

  2. 从注册表中获取文件的安装路径

    从注册表中取值(Windows平台) 本篇文章的内容是从Windows平台的注册表里取值 程序开发一般都会涉及从注册表获取相关信息,我将以从注册表获取软件的安装路径为例子 一.需求 我现在要获取微信的 ...

  3. CAD .net开发-从注册表中获取CAD安装路径

    32位系统: RegistryKey keyLocalMachine = Registry.LocalMachine; 64位系统: Microsoft.Win32.RegistryKey keyLo ...

  4. c# u盘使用记录_C# 系统应用之通过注册表获取USB使用记录(一)

    该文章是"个人电脑历史记录清除软件"项目的系统应用系列文章. 前面已经讲述了如何清除IE浏览器的历史记录.获取Windows最近访问文件记录.清除回收站等功能.现在我需要完成的是删 ...

  5. C# 系统应用之通过注册表获取USB使用记录(一)

    该文章是"个人电脑历史记录清除软件"项目的系统应用系列文章. 前面已经讲述了如何清除IE浏览器的历史记录.获取Windows最近访问文件记录.清除回收站等功能.现在我需要完成的是删 ...

  6. [Python黑帽] 一.获取Windows主机信息、注册表、U盘历史痕迹和回收站文件

    最近开始学习网络安全和系统安全,接触到了很多新术语.新方法和新工具,作为一名初学者,感觉安全领域涉及的知识好广.好杂,但同时也非常有意思.这系列文章是作者学习安全过程中的总结和探索,我们一起去躺过那些 ...

  7. C/C++注册表【4】键值的获取,设置,删除,枚举

    C/C++注册表[4]键值的获取,设置,删除,枚举 1.键值的获取: LONG WINAPI RegQueryValueEx(HKEY hKey, //一个已打开项的句柄,或者指定一个标准项名LPCT ...

  8. 。MSN Messenger 常见问题及回答

    1.Windows Messenger 和 MSN Messenger 是同一个东西吗?他们有什么区别? Windows Messenger 是 Microsoft Windows XP 和 Micr ...

  9. MSN Messenger协议 原作:bhw98

    前 言 MSN Messenger 是Microsoft开发的聊天工具,目前在国内拥有很大的用户群.使用MSN Messenger可以与他人进行文字聊天,语音对话,视频会议等即时交流,还可以通过此软件 ...

最新文章

  1. JSTL 读取数组 和 字符串连接
  2. 数位dp 的简单入门
  3. 利用 Vmware 安装 Linux 虚拟机
  4. 在线使用Octave、Matlab画单电荷等位线和电力线、matlab的nonconformant arguments错误
  5. Orange‘s 一个操作系统的实现--Bochs遇到的问题
  6. 用Windows Server Backup备份DC服务器
  7. Vue 3.1.0 的 beta 版发布
  8. 微软发布 Windows 命令行参考文档,涵盖超 250 项控制台命令
  9. 如何实现用Delphi访问Outlook Express的收发邮件箱中的邮件?
  10. spring awre的理解
  11. matleb2016A安装教程
  12. android 华为打开usb调试模式,华为H60-L01 开启USB调试模式
  13. 你不会因为实施了Scrum而变敏捷
  14. 超好玩的硬币游戏,你会玩吗?
  15. Nginx反向代理与系统参数配置conf
  16. Java开源项目管理工具大全
  17. 【2023最新】Git安装配置教程
  18. 水货三星Android手机验机方法
  19. 学习 Go 语言(Golang)读书笔记
  20. java案例----用户注册--发送邮件并激活/发送邮件验证码

热门文章

  1. 江阴南菁高考2021高考成绩查询,江阴8所四星级高中高考成绩公布 南菁高中本一进线率达到了92.97%...
  2. 4-1,4-2机器学习和神经网络的基本概念
  3. amd黑苹果万能显卡驱动_22款显卡乱战《赛博朋克2077》:AMD 4K败走麦城-显卡,赛博朋克2077,AMD,NVIDIA ——快科技(驱动之家旗下媒体)-...
  4. coreseek mysql.sock_Coreseek + Sphinx + Mysql + PHP构建中文检索引擎
  5. (六)Netty网络编程应用实例-群聊系统
  6. mysql page directory_【innodb】page directory的二分查找问题
  7. 测试kafka的连通性,自导自演生产者与消费者
  8. python安装Pillow
  9. Linux终端显示工作路径
  10. 解决Django文件表单验证forms.FileField(required=True),总是无法通过验证:这个字段是必填项