Windows自动登录源码

近来, 无聊之极, 将 AutoLogon反汇编, 玩玩..贴出代码如下:

1. 获取用户帐户及其域.

void  CAutoLogonDlg::GetAccount( void )
{
    HANDLE hProcess 
=  GetCurrentProcess( );
    HANDLE hToken 
=  NULL;
    
if  ( OpenProcessToken( hProcess, TOKEN_QUERY,  & hToken ) ) {

        DWORD dwInfoLen 
=   0 ;
        TOKEN_USER 
* ptuUser  =   0 ;
        GetTokenInformation( hToken, TokenUser, NULL, 
0 & dwInfoLen );
        ptuUser 
=  ( TOKEN_USER *  )malloc( dwInfoLen );
        
if  ( ptuUser  ==  NULL ) {

            CloseHandle( hToken );
            CloseHandle( hProcess );
            
return  ;
        }

        
if  ( GetTokenInformation( hToken, TokenUser, ( LPVOID )ptuUser, dwInfoLen,  & dwInfoLen ) ) {

            SID_NAME_USE snu;
            DWORD dwUsernameLen 
=  MAX_PATH;
            DWORD dwDomainLen 
=  MAX_PATH;
            WCHAR szUsername[ MAX_PATH ] 
=  {  0  };
            WCHAR szDomain  [ MAX_PATH ] 
=  {  0  };

            
if  ( LookupAccountSid( NULL, ptuUser -> User.Sid, szUsername,  & dwUsernameLen, szDomain,  & dwDomainLen,  & snu ) ) {

                SetDlgItemText( IDC_EDIT_USERNAME, szUsername );
                SetDlgItemText( IDC_EDIT_DOMAIN, szDomain );
            }
        }
        free( ptuUser );
        CloseHandle( hToken );
    }
    CloseHandle( hProcess );
}

 

 

2. 设置自动登录.

void  CAutoLogonDlg::SetAutoLogon( LPTSTR szUsername, LPTSTR szDomain, LPTSTR szPassword ) 
{
    
if  ( szUsername  ==  NULL  ||  szDomain  ==  NULL  ||  szPassword  ==  NULL  ||
         lstrcmp( L
"" , szUsername )  ==   0   ||
         lstrcmp( L
"" , szDomain )  ==   0   ||
         lstrcmp( L
"" , szPassword )  ==   0  ) {

             MessageBox( L
" Set AutoLogon failed "  );
             
return  ;
    }

    LSA_OBJECT_ATTRIBUTES lsaAttr 
=  {  sizeof ( LSA_OBJECT_ATTRIBUTES ) };
    LSA_HANDLE hLsa;
    HKEY hKey;
    
if  ( ::RegOpenKeyEx( HKEY_LOCAL_MACHINE, L " SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon " ,
        
0 , KEY_ALL_ACCESS,  & hKey )  !=  ERROR_SUCCESS ) {

            MessageBox( L
" Open register failed "  );
            
return  ;
    }

    
if  ( ::RegSetValueEx( hKey, L " DefaultUserName " 0 , REG_SZ, ( BYTE *  )szUsername, lstrlen( szUsername )  *   2  )  !=  ERROR_SUCCESS ) {

        MessageBox( L
" Set register failed "  );
        RegCloseKey( hKey );
        
return  ;
    }

    
if  ( ::RegSetValueEx( hKey, L " DefaultDomainName " 0 , REG_SZ, ( BYTE *  )szDomain, lstrlen( szDomain )  *   2  )  !=  ERROR_SUCCESS ) {

        MessageBox( L
" Set register failed "  );
        RegCloseKey( hKey );
        
return  ;
    }

    
if  ( LsaOpenPolicy( NULL,  & lsaAttr, POLICY_CREATE_SECRET,  & hLsa )  ==  STATUS_SUCCESS ) {

        WCHAR
*  pszPasswordKey  =  L " DefaultPassword " ;
        DWORD dwPasswordKeyLen 
=  lstrlen( pszPasswordKey )  *   2 //  因为双字节数据点两个字节长度
        LSA_UNICODE_STRING lsaPasswordKey;
        lsaPasswordKey.Length 
=  dwPasswordKeyLen;
        lsaPasswordKey.MaximumLength 
=  dwPasswordKeyLen  +   2 //  把末尾的空加上
        lsaPasswordKey.Buffer  =  pszPasswordKey;

        LSA_UNICODE_STRING lsaPassword;
        DWORD dwPasswordLen 
=  lstrlen( szPassword )  *   2 ;
        lsaPassword.Length 
=  dwPasswordLen;
        lsaPassword.MaximumLength 
=  dwPasswordLen  +   2 ;
        lsaPassword.Buffer 
=  szPassword;

        
bool  fEncript  =   true ;
        
if  ( LsaStorePrivateData( hLsa,  & lsaPasswordKey,  & lsaPassword )  ==  STATUS_SUCCESS ) {

            RegDeleteValue( hKey, L
" DefaultPassword "  );
        } 
else  {

            
if  ( RegSetValueEx( hKey, L " DefaultPassword " 0 , REG_SZ, ( BYTE *  )szPassword, lstrlen( szPassword )  *   2  )  !=  ERROR_SUCCESS ) {

                MessageBox( L
" Set AutoLogon Failed "  );
                LsaClose( hLsa );
                RegCloseKey( hKey );
                
return ;
            } 
else  {

                fEncript 
=   false ;
            }
        }
        LsaClose( hLsa );
        
if  ( RegSetValueEx( hKey, L " AutoAdminLogon " 0 , REG_SZ, ( BYTE *  )( L " 1 "  ),  2  )  ==  ERROR_SUCCESS ) {

            
if  ( fEncript ) {

                MessageBox( L
" successfully, \nand the password is encripted "  );
            } 
else  {

                MessageBox( L
" successfully, \nbut the password is NOT encripted "  );
            }
        }
    }
    RegCloseKey( hKey );
    LsaClose( hLsa );
}

 

 

转载于:https://www.cnblogs.com/lin1270/archive/2011/01/28/1947161.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值