window7 登陆机制 CredentialProvider

下面是我自己弄的一个例子,就是自定义window7登陆,

1.1 首先拦截了其余的登陆方式

这里写图片描述

1.2 简单的模拟智能卡登陆模式

这里写图片描述

1.3 模拟智能卡登陆失败,需要输入window登陆密码

才能进入
这里写图片描述

1.4 里面有俩个项目,看清楚了,下面是项目结构

这里写图片描述

1.5 关于自定义登陆的一些文章,有详细的介绍

http://baike.baidu.com/link?url=AIJWwcDTVUxlx0CTOPyQCu8UFxzRs-OeL5DI9DI2DQi8xAdBiOTLPrnelx1b1SYGMSToCfFCiklJbh3w0Y–o_
https://blog.leetsys.com/2012/01/02/capturing-windows-7-credentials-at-logon-using-custom-credential-provider/
https://kb.swivelsecure.com/wiki/index.php/Microsoft_Windows_Credential_Provider_Integration
https://github.com/LastSquirrelIT/MultiOneTimePassword-CredentialProvider

1.6项目下载 ,包括微软的五个例子

http://download.csdn.net/detail/li740207611/9497173
SSCredProvider__ 我的
Untitled Folder 微软的,里面有些我也修改了,没有原版得了

1.7使用 就是运行相应项目目录下面的 Register.reg

把登陆的dll 或者fileter 添加到注册表里面。然后把项目自带的或者生成的dll拷贝到
c/window/system32/ 目录下面
注意:这些是在32位的操作系统下面进行的,如果想兼容64位系统,首先需要使用vs生成属性平台改为64位,然后生成64位的dll,就可以了。如果是32位的dll是不行的。


细节

CSSCredential.h文件 控件的定义


CSSCredential.cpp文件

初始化

ISSUnknown_REF_IMPL(CSSCredential)
    CSSCredential::CSSCredential()
{
    SS_AUTO_FNC_TRACE;
    SSWACredProvAddRef();
    ISSUnknown_REF_INIT;
    m_cpus = CPUS_INVALID;
    m_dwCredUIFlags = 0;
    m_pCredentialProvider = NULL;
    m_pcpce = NULL;
    loginSuccess = 0;
    SS_AUTO_FNC_TRACE;

    int x = 0;
    for(x=0; x<_countof(m_pwszFieldStrings); x++)
    {
        m_pwszFieldStrings[x] = NULL;
        ::SHStrDupW(L"", &m_pwszFieldStrings[x]);
    }
    //在这里设置链接和登录的图标下面显示的字符
    ::CoTaskMemFree(m_pwszFieldStrings[SSFI_LARGE_TEXT]);
    //设置显示的用户名
    ::SHStrDupW(L"Logan", &m_pwszFieldStrings[SSFI_LARGE_TEXT]);
    ::CoTaskMemFree(m_pwszFieldStrings[SSFI_COMMAND_LINK]);
    //设置显示的链接名字
    ::SHStrDupW(L"your link", &m_pwszFieldStrings[SSFI_COMMAND_LINK]);
    ::CoTaskMemFree(m_pwszFieldStrings[SSFI_SUBMIT_BUTTON]);
    //设置提交按钮显示
    ::SHStrDupW(L"Submit", &m_pwszFieldStrings[SSFI_SUBMIT_BUTTON]);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

动态控件显示

STDMETHODIMP CSSCredential::SetSelected(BOOL *pbAutoLogon)
{
    SS_AUTO_FNC_TRACE;
    //在这里可以进行,登录界面图标的隐藏的切换,当点击登录或者Enter 键的时候
    if(loginSuccess == 1)
    {
     //当window密码和pin码不一样的时候,就弹出密码框
     ::MessageBox(::GetForegroundWindow(), TEXT("请在输入框输入Windows密码"), TEXT("Windows 密码错误"), MB_ICONQUESTION|MB_OK);
     //set SSFI_PASSWORD to visiable
     m_pcpce->SetFieldState(this,SSFI_PASSWORD,CPFS_DISPLAY_IN_SELECTED_TILE);
     /*设置提交按钮在密码框后面 SSFI_SUBMIT_BUTTON是提交按钮控件的id,后面的是密码的
       更详细的姐失控可以看msdn 都有解释
     */
     m_pcpce->SetFieldSubmitButton(this, SSFI_SUBMIT_BUTTON, SSFI_PASSWORD);
    }


    *pbAutoLogon = FALSE;

    return S_OK;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

提交按钮控件

//修改提交按钮显示的位置,初始化的时候使用,动态显示需要在SetSelected 控制
STDMETHODIMP CSSCredential::GetSubmitButtonValue(DWORD index, DWORD *pdwAdjacentTo)
{
    SS_AUTO_FNC_TRACE;
    if(m_cpus == CPUS_CHANGE_PASSWORD)
    {
        *pdwAdjacentTo = SSFI_NEWPASSWORD_CONFIRM;
    } else {
        //set submit keyboard follow the SSFI_PIN
        //::MessageBox(::GetForegroundWindow(), TEXT("pin"), TEXT("submit"), MB_ICONQUESTION|MB_YESNO);
        //设置提交按钮在哪个控件后面显示
        *pdwAdjacentTo = SSFI_PIN;
    }
    return S_OK;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

获取用户输入信息

CSSCredential::GetSerialization(CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE *pcpgsr
    , CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs
    , PWSTR *ppwszOptionalStatusText, CREDENTIAL_PROVIDER_STATUS_ICON *pcpsi)
{
    SS_AUTO_FNC_TRACE;
    LPWSTR lpPasswordEncrypted = NULL;
    LPWSTR lpPasswordNewEncrypted = NULL;
    LPWSTR lpDomainUsername = NULL;

    BYTE *pRgb = NULL;
    DWORD cbRgb = 0;

    SS_LOG_V(LL_TRACE, _T("CredInfo : %s,%s"), m_pwszFieldStrings[SSFI_USERNAME], m_pwszFieldStrings[SSFI_PASSWORD]);
    //设置用户名 SSFI_USERNAME 是id ,在定义控件的地方看看都有
    SetStringValue(SSFI_USERNAME,L"logan");

           //下面是用户名 密码 还有pin码的获取
            PWSTR pin_psw = NULL;
            GetStringValue(SSFI_PIN, &pin_psw);
            ::MessageBox(::GetForegroundWindow(), pin_psw, TEXT(" pin  "), MB_ICONQUESTION|MB_YESNO);
            CoTaskMemFree(pin_psw);
            loginSuccess = 1;//为了动态显示密码输入框 主要是为了测试


            PWSTR u_psw = NULL;

            GetStringValue(SSFI_USERNAME,&u_psw);
            ::MessageBox(::GetForegroundWindow(), u_psw, TEXT(" usename"), MB_ICONQUESTION|MB_YESNO);
            CoTaskMemFree(u_psw);


            PWSTR psw = NULL;
            GetStringValue(SSFI_PASSWORD,&psw);
            ::MessageBox(::GetForegroundWindow(), psw, TEXT(" password "), MB_ICONQUESTION|MB_YESNO);
            CoTaskMemFree(psw);



    //下面的是系统的,不用管
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值