东莞市汽车网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 216|回复: 0
打印 上一主题 下一主题

QQ密码输入框(防键盘钩子)的实现方式

[复制链接]
跳转到指定楼层
楼主
发表于 2012-5-26 04:08:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.网上看到的一圣元奶粉些防星号查看器的代码圣元奶粉大多是在后台维护一个圣元奶粉字符串(真实的密码)圣元奶粉密码,这样做,维护那[url=http://www.tudou.com/programs/view/aAsWRlpkNsE/]圣元奶粉[/url码,这样做,维护那个字符串很费事,就因为我之前那样做过,我才在看到WM_GETTEXT后想要重做一个
2.防键盘钩子,在做上面的功能是,突然想到,如果自己模拟发一些乱七八糟的按键消息,然后自己区分哪些是垃圾哪些是用户真正的按键,那钩子就到不取密码了,所以又加了这个功能.后来自己做了一个钩子看了一下效果不错,试了试QQ的竟然也是这样,开始以为QQ用了什么高科技
3.自我感觉貌似实现了QQ密码框的功能,不知道会有什么问题,所以帖出来,谁有兴趣自己看吧
//////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma once
//safeedit.h
// CSafeEdit
class CSafeEdit : public CEdit
{
public:
    //设置取密码时用的KEY(大于5)
    BOOL SetPassWordKey(CString & astrKey);//取密码时用的KEY
    DECLARE_DYNAMIC(CSafeEdit)
    int GetWindowTextEx(CString & astrText);//astrText 传入KEY 传出密码
public:
    CSafeEdit();
    virtual ~CSafeEdit();
protected:
    DECLARE_MESSAGE_MAP()
    LRESULT OnGetText(WPARAM wParam, LPARAM lParam);
private:
    BOOL mbCanGetText;//GetWindowTextEx:astrText == mstrKey ? TRUE : FALSE
    CString mstrKey;
    char mcLastVKey;//Timer 模拟的键
public:
    afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg void OnSetFocus(CWnd* pOldWnd);
    afx_msg void OnKillFocus(CWnd* pNewWnd);
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// SafeEdit.cpp : 实现文件
//
#include "stdafx.h"
#include "DlgTemp2.h"
#include "SafeEdit.h"
#include ".\safeedit.h"

// CSafeEdit
IMPLEMENT_DYNAMIC(CSafeEdit, CEdit)
CSafeEdit::CSafeEdit()
{
    mstrKey = "jiawei@hotmail.com";
    mbCanGetText = FALSE;
    mcLastVKey = 0;
}
CSafeEdit::~CSafeEdit()
{
}

BEGIN_MESSAGE_MAP(CSafeEdit, CEdit)
    ON_MESSAGE(WM_GETTEXT, OnGetText)
    ON_WM_CHAR()
    ON_WM_TIMER()
    ON_WM_SETFOCUS()
    ON_WM_KILLFOCUS()
END_MESSAGE_MAP()

// CSafeEdit 消息处理程序
LRESULT CSafeEdit::OnGetText(WPARAM wParam, LPARAM lParam)
{
    long lnStyle = GetWindowLong(GetSafeHwnd(),GWL_STYLE);
    if(lnStyle & ES_PASSWORD)
    {
        if(mbCanGetText)
            return DefWindowProc(WM_GETTEXT,wParam,lParam);
        else
            return -1;
    }
    return DefWindowProc(WM_GETTEXT,wParam,lParam);
}
//************************************
// Method:    SetPassWordKey
// FullName:  CSafeEdit::SetPassWordKey
// Access:    public
// Returns:   BOOL
// Qualifier: 设置取密码时用到的KEY,长度大于五
// Parameter: CString & astrKey
//************************************
BOOL CSafeEdit::SetPassWordKey(CString & astrKey)
{
    if(astrKey.GetLength() < 5)
        return FALSE;
    mstrKey = astrKey;
    return TRUE;
}
//************************************
// Method:    GetWindowTextEx
// FullName:  CSafeEdit::GetWindowTextEx
// Access:    public
// Returns:   int
// Qualifier:
// Parameter: CString & astrText 传入取密码用的KEY,如果成功返回密码
//************************************
int CSafeEdit::GetWindowTextEx(CString & astrText)
{
    if(astrText != mstrKey)
        return -1;
    astrText = "";
    DWORD ldwLen = ::SendMessage(GetSafeHwnd(),WM_GETTEXTLENGTH,0,0);
    if(ldwLen <= 0)
        return 0;
    char *lpszBuf = new char[ldwLen+1];
    if(lpszBuf == NULL)
        return 0;
    mbCanGetText = TRUE;
     ldwLen = ::SendMessage(GetSafeHwnd(),WM_GETTEXT,ldwLen+1,(LPARAM)lpszBuf);
    mbCanGetText = FALSE;
    astrText = lpszBuf;
    delete [] lpszBuf;
    return ldwLen;
}
void CSafeEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    if(mcLastVKey != nChar)
        CEdit::OnChar(nChar, nRepCnt, nFlags);
}
void CSafeEdit::OnTimer(UINT nIDEvent)
{
    //随机生成按键
    UINT lnVKey = '0' + (rand()%('Z'-'0'+1));
    UINT lnScan = MapVirtualKeyEx(lnVKey,0,NULL);
    mcLastVKey = MapVirtualKeyEx(lnVKey,2,NULL);
    if(mcLastVKey >= 'A' && mcLastVKey <= 'Z')
    {
        BOOL lbLowercase = TRUE;
        if(GetKeyState(VK_CAPITAL) & 0x01 != 0)//CapsLock ON
            lbLowercase = !lbLowercase;
        if((GetKeyState(VK_LSHIFT) & 0x80) != 0 || (GetKeyState(VK_RSHIFT) & 0x80) != 0)//Shift DOWN
            lbLowercase = !lbLowercase;
        if(lbLowercase)
            mcLastVKey += 'a' - 'A';
    }
    keybd_event(lnVKey,lnScan,KEYEVENTF_EXTENDEDKEY,0);
    CEdit::OnTimer(nIDEvent);
    keybd_event(lnVKey,lnScan,KEYEVENTF_KEYUP,0);
}
void CSafeEdit::OnSetFocus(CWnd* pOldWnd)
{
    CEdit::OnSetFocus(pOldWnd);
    long lnStyle = GetWindowLong(GetSafeHwnd(),GWL_STYLE);
    if(lnStyle & ES_PASSWORD)
        SetTimer(1,500,NULL);
}
void CSafeEdit::OnKillFocus(CWnd* pNewWnd)
{
    CEdit::OnKillFocus(pNewWnd);
    long lnStyle = GetWindowLong(GetSafeHwnd(),GWL_STYLE);
    if(lnStyle & ES_PASSWORD)
        KillTimer(1);
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|东莞市汽车网 ( 粤ICP备10001045号

GMT+8, 2025-9-10 19:00 , Processed in 0.122251 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表