从注册表中还原MSNMessenger口令

原创 2004年09月13日 15:08:00
版权声明:CSDN是本Blog托管服务提供商。如本文牵涉版权问题,CSDN不承担相关责任,请版权拥有者直接与文章作者联系解决。


演示从注册表中还原MSNMessenger口令


作者:tombkeeper (t0mbkeeper_at_hotmail.com)

/* 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);
}

oracle 忘记用户名和口令怎么办

1.在程序中 查找 sql plus,点击进入; 2.以系统身份登录:                 用户名:sys          密  码 :manager as sysdba ...
  • qq_20370185
  • qq_20370185
  • 2015年04月17日 17:08
  • 1842

【收藏】内部优惠券之淘口令使用篇

最近很多亲们都进过微信QQ购物群,以及内部优惠券网站吧,今天分享下手机端内部优惠券网站淘口令版怎么用的?淘口令怎么用的?       大家可能会问,为什么要用淘口令呢,首先,此网站也支持...
  • sinat_38802820
  • sinat_38802820
  • 2017年05月18日 18:31
  • 850

ssh基本原理,口令登陆和秘钥(免密)登陆

SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专...
  • yimingsilence
  • yimingsilence
  • 2016年08月09日 11:54
  • 1926

一次性口令机制java实现(信息安全)

在信息学中,密码也叫口令,要实现登录验证,每次网络传输的口令都不一致,故称为一次性口令机制。 这里实现简单的一次性口令机制:(SpringMVC实现) 思路:用验证码代替时间戳,将密码(口令)通过...
  • ldw201510803006
  • ldw201510803006
  • 2017年10月24日 19:56
  • 168

支付宝吱口令自动复制脚本,自动复制 JavaScript 代码介绍

本文转自:http://www.sojson.com/blog/262.html 最近支付宝#吱口令#的信息随处可见,可谓是铺天盖地,群里发这样的信息给被踢了不少。我开始还在鄙视这些人,有几...
  • u013322323
  • u013322323
  • 2018年01月08日 10:17
  • 572

动态口令卡(口令牌)原理解读

1.动态口令牌的原理简单分析         该装置有一颗内置小芯片和一个可以显示多达6位阿拉伯数字的长方形LCD窗口,其体积很小,可以系在钥匙环上。动态口令牌使用唯一的128位种子将其初始化;其内...
  • wangjianno2
  • wangjianno2
  • 2014年02月16日 00:24
  • 1471

支付宝吱口令的截取

最近支付宝扫码领红包,复制邀请码领红包的活动开展得如火如荼,期间层出不迭一些套路,将自己的支付宝邀请码混杂在一段有趣的文字中,让用户打开支付宝,以此获得奖金,比如这样式的:受朋友之托征婚 女,唐紫,2...
  • pzhu_lcx
  • pzhu_lcx
  • 2017年12月27日 14:43
  • 4068

ORA-28001: 口令已经失效

Oracle报错,ORA-28001: 口令已经失效   Oracle11G创建用户时缺省密码过期限制是180天(即6个月), 如果超过180天用户密码未做修改则该用户无法登录。 Oracle公...
  • rmnjava
  • rmnjava
  • 2017年01月19日 14:51
  • 346

JAVA版QQ动态口令

简单实现QQ动态口令一、突发奇想近日由于登录想登陆某游戏,要验证我的QQ动态口令,所以我对这个每30秒刷新一次的口令产生了兴趣,这篇博客权当是我的一个记录,大神们不要喷我,毕竟我只是一个小小的菜鸟。根...
  • dutchcat
  • dutchcat
  • 2017年04月23日 00:45
  • 630

防扫描配置与弱口令利用,检测和防御

弱口令利用,检测和防御
  • pygain
  • pygain
  • 2016年08月27日 09:48
  • 1333
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从注册表中还原MSNMessenger口令
举报原因:
原因补充:

(最多只允许输入30个字)