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);
} |