win2000/xp下,截取密码框的星号密码,解决的办法难道只能用c\c++写dll这一类的吗?vb不行吗?
请指教,谢谢!

解决方案 »

  1.   

    是这样的,一般截取密码是向密码窗口发送WM_GETTEXT消息,在9x下可以返回正确的值
    但在2000/xp下,系统首先判断执行该语句是否在密码窗口所在的进程,如果不是,则返回错误,自然取不到密码了。
    用VC写dll,是为了将该段代码注入到目标进程中,如此能使该消息执行成功
      

  2.   

    ' 这样可以做到。Option ExplicitPrivate Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Const EM_GETPASSWORDCHAR = &HD2
    Private Const EM_SETPASSWORDCHAR = &HCC
    Private Const WM_GETTEXT = &HDPrivate Sub Command1_Click()
        Dim handle As Long
        handle = 591284          ' 这里应该将 handle 赋值成要获得密码的窗口的句柄, 通常用FindWindow和FindWindowEx
        Debug.Print GetPassword(handle)
    End Sub' 获得密码文本框中的内容(密码)
    ' hwnd 为密码文本框的句柄
    Function GetPassword(ByVal hwnd As Long) As String
        Dim chars As Byte, password As String
        chars = SendMessage(hwnd, EM_GETPASSWORDCHAR, 0, 0)
        Call PostMessage(hwnd, EM_SETPASSWORDCHAR, 0, 0)
        DoEvents
        password = String(260, vbNullChar)
        Call SendMessage(hwnd, WM_GETTEXT, 260, ByVal password)
        Call PostMessage(hwnd, EM_SETPASSWORDCHAR, chars, 0)
        password = StrConv(LeftB(StrConv(password, vbFromUnicode), InStr(password, vbNullChar) - 1), vbUnicode)
        GetPassword = password
    End Function
      

  3.   

    可以利用进程注入实现
    最简单的进程注入是通过跨线程钩子注入
    跨线程钩子的回调函数必须放入普通dll中
    而VB的ActiveX DLL是基于COM,只有在COM环境中才是线程安全的
    如果跨线程钩子用的是VB的ActiveX DLL,绝对会触发一般保护性错误(就是常见“非法操作”对话框)
    goodname008(卢培培,充电中......) 的方法是发送EM_SETPASSWORDCHAR消息修改文本框模式
    普通文本框不具有进程保护的我觉得最关键的是MicroSoft设计不良
    既然保护了WM_GetText,为什么不保护EM_SETPASSWORDCHAR