怎样查找QQ密码框的句柄并向其发送字符消息?请自己试过成功后再贴出这部分的源代码.我用的是QQ2008版.

解决方案 »

  1.   

    不要误会,我是想自己写一个QQ自动登录器(虽然网上可以下载),其他部分都没问题,就是不知道如何向密码框输入密码(通过句柄向密码框发送WM_CHAR)消息.现在是讨论技术问题,道德问题先放在一边.
      

  2.   

    那些讨论厚不厚道先放一边,做出东西是最重要的。
    接人气,我同问,省得我自己开新帖了。
    我已经找到了edit句柄。
    sendmessage(QQhwnd,WM_SETTEXT,0,LPARAM(szBuffer));
    不好使的。
    用sendmessage(QQhwnd,WM_CHAR,'a',0);
    发了数个消息把字符输入句柄
    发了消息后确实有星号
    然而一旦移动窗口*号全部消失?????
    输入窗口什么都没有了,希望有志于此,或对这个感兴趣的讨论以下QQ登陆窗口实现机制
    我的理解是QQ登陆框是对话框 套一个编辑窗口
    但是为什么往里面发消息星号会消失
    请高人指教如果 解释了我的疑惑小弟另开窗口加分 
      

  3.   

    nyhenry,请把查找句柄和发送消息的代码贴出来,或许我们有某些可以互补的地方.
      

  4.   

    楼上说的对,这里用到钩子。
    推荐楼主看看《windows核心编程》。
      

  5.   

    QQ有对该密码框做过特别保护的,可以发现该文本框边上有把小锁,它的实现分别在起安装目录下的三个DLL中,
    还有sendmessage(QQhwnd,WM_SETTEXT,0,LPARAM(szBuffer)); 这样是不可能拿到密码的,因为QQ中做过钩子了,劝你还是想别的方法把
      

  6.   

    还有个疑问,哪个密码框你确定是EDIT控件吗
      

  7.   

    vcf_reader 我用试验证实过用发消息给其他进程来控制其它进程的方法是可行的
    我试过发消息WM_CLOSE,WM_CHAR,WM_SETTEXT给普通notepad文件
    notepad文件可以收到消息并有相应的相应,
    所以虽然我还没想过两个进程能不能共享数据空间
    但是用发消息给其他进程来控制其它进程的方法是绝对可行的。
      

  8.   

    登陆对话框是个对话框,密码框是个子对话框,自对话框有个edit窗口
      

  9.   

    QQ中做过钩子了拦截了你的非法消息,此法不通
    那是个edit
    软键盘就可以输入,想想怎么模拟键盘操作吧
      

  10.   

    yujia你是指我吗?非法消息?
    我一直没做钩子,我也一直没说钩子可以啊
    (因为有人说QQ是通过钩子实现的那个对话框
    所以我现在正在看钩子那部分win32api的知识看看到底,早就忘了;p)
    我昨天是直接给密码框代表的子对话框的edit子子窗口发的消息
    sendmessage(QQhwnd,WM_CHAR,'a',0);
    可以显示一堆星号
    但是一旦把窗口移动位置所有星号就突然消失。
    我也不会输入回车,sendmessage(QQhwnd,WM_KEYDOWN,VK_RETURN,0)
    在文本文件中好使,到了QQ输入框中就不行了;
      

  11.   

    哦yujia120 我明白了你是说QQ做个钩子
    把我的消息拦下了是吧:)
      

  12.   

    不要想通过钩子来获得Edit控件中的密码,腾讯公司对该控件框做了处理。
      

  13.   


    先用static CWnd* PASCAL FindWindow( LPCTSTR lpszClassName, LPCTSTR lpszWindowName );找到QQ密码框,lpszClassName设为NULL,lpszWindowName设为QQ密码框的标题然后将QQ密码框置为顶层BOOL SetWindowPos( HWND hWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags );再模拟键盘输入密码即可:
    VOID keybd_event(
      BYTE bVk,               // virtual-key code
      BYTE bScan,             // hardware scan code
      DWORD dwFlags,          // function options
      ULONG_PTR dwExtraInfo   // additional keystroke data
    );
      

  14.   

    QQ中做过钩子了拦截了你的非法消息,此法不通 
    那是个edit 
    软键盘就可以输入,想想怎么模拟键盘操作吧
    -----------------------------------------------------------------------
    你说的我觉得比较有道理比如发给登陆密码框子窗口edit 的WM_TEXT会被QQ设个钩子
    截断那样的话,似乎自己程序这边再设钩子也没有用。
     那么WM_CHAR呢似乎没被截断,我现在觉得模拟键盘操作还是一条思路。因为
    不管输入的不管是什么总得有一种方法把键盘敲击的密码放进去
      

  15.   

    先用static CWnd* PASCAL FindWindow( LPCTSTR lpszClassName, LPCTSTR lpszWindowName ); 找到QQ密码框,lpszClassName设为NULL,lpszWindowName设为QQ密码框的标题 然后将QQ密码框置为顶层BOOL SetWindowPos( HWND hWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags ); 再模拟键盘输入密码即可: 
    VOID keybd_event( 
      BYTE bVk,               // virtual-key code 
      BYTE bScan,             // hardware scan code 
      DWORD dwFlags,          // function options 
      ULONG_PTR dwExtraInfo   // additional keystroke data 
    ); 
    -----------------------------------------------------------------------
    试过不成功还没有 keybd_event连星号都属不进去,
    如果你试过而且成功,请给源代码
      

  16.   

    重金诚评聘C++
    http://topic.csdn.net/u/20080227/14/8bce0844-bd15-42f0-9cda-a343d5d6601b.html?seed=2111206245
      

  17.   

    对于nyhenry说keybd_event连星号都属不进去,我不明白是什么意思.刚才抽空写一下code,我的qq是2007的,能够输入我的密码登陆。(如果你的不行,在看完我的代码后,留意你的QQ密码框的输入情况,根据实际调整,仅作参考)void CTestInputDlg::OnOK() 
    {
    //find the window
    CWnd* pwnd = FindWindow(NULL, "QQ用户登录");
    if(pwnd != NULL)
    {
    pwnd->SetWindowPos(&wndTop,50,50,335,240,SWP_SHOWWINDOW);
    //enter password
    EnterWord("weishide983823\n");
    }
    //CDialog::OnOK();
    }void CTestInputDlg::EnterWord(CString szWord)
    {
    int nLen = szWord.GetLength();
    //check if the Caps Lock key is down, if so , cancel it 
    unsigned char kbuf[256];
    GetKeyboardState(kbuf);
    if(kbuf[VK_CAPITAL]&1)
    {
    keybd_event(VK_CAPITAL,0,0,0);
    keybd_event(VK_CAPITAL,0,KEYEVENTF_KEYUP,0);
    }
    //input the words 
    for(int i=0; i<nLen; i++)
    {
    char c = szWord.GetAt(i);
    if(c>='a'&&c<='z')
    {
    keybd_event(c-'a'+65,0,0,0);
    keybd_event(c-'a'+65,0,KEYEVENTF_KEYUP,0);
    }
    else if(c>='A'&&c<='Z')
    {
    keybd_event(VK_SHIFT,0,0,0);
    keybd_event(c-'A'+65,0,0,0);
    keybd_event(c-'A'+65,0,KEYEVENTF_KEYUP,0);
    keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
    }
    else if(c=='\n')
    {
    keybd_event(13,0,0,0);
    keybd_event(13,0,KEYEVENTF_KEYUP,0);
    }
    else 
    {
    keybd_event(c,0,0,0);
    keybd_event(c,0,KEYEVENTF_KEYUP,0);
    }

    }
    }
      

  18.   

    请教nyhenry ,你是怎样找到密码编辑框句柄的?你把这部分代码贴出来.
      

  19.   

    不好意思我和大家有时差,有时候回家赶作业家里有没有搬上网没法及时和大家讨论等我周三3门作业搞完了
    再来继续讨论:)
    to lz 我是手工找的窗口句柄 暂时还没变成程序
    密码编辑框就是用spy++套上密码框,然后查找找到之后发现是dialogue类型然后点击发现有子窗口是edit类型
    我估计用findwindow  然后列举子窗口就可以找到edit
      

  20.   

    多谢代码,确实我不是很会用keybd_event等我做完烦人的作业再来试一下。
      

  21.   

    keybd_event就是模拟键盘的输入,有什么不行呢,是你不行不是什么不行.
    有点无奈有些人!
      

  22.   

    兄弟对这个这么 有兴趣, 大家讨论一下,在聊天的时候,怎么获取对方发过来的聊天信息。我用spy++ 一直跟踪不到他们所发的消息.
      

  23.   

    void EnterWord(CString szWord) 

    int nLen = szWord.GetLength(); 
    //check if the Caps Lock key is down, if so , cancel it  
    unsigned char kbuf[256]; 
    GetKeyboardState(kbuf); 
    if(kbuf[VK_CAPITAL]&1) 

    keybd_event(VK_CAPITAL,0,0,0); 
    keybd_event(VK_CAPITAL,0,KEYEVENTF_KEYUP,0); 

    //input the words  
    for(int i=0; i <nLen; i++) 

    char c = szWord.GetAt(i); 
    if(c>='a'&&c <='z') 

    keybd_event(c-'a'+65,0,0,0); 
    keybd_event(c-'a'+65,0,KEYEVENTF_KEYUP,0); 

    else if(c>='A'&&c <='Z') 

    keybd_event(VK_SHIFT,0,0,0); 
    keybd_event(c-'A'+65,0,0,0); 
    keybd_event(c-'A'+65,0,KEYEVENTF_KEYUP,0); 
    keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0); 

    else if(c=='\n') 

    keybd_event(13,0,0,0); 
    keybd_event(13,0,KEYEVENTF_KEYUP,0); 

    else  

    keybd_event(c,0,0,0); 
    keybd_event(c,0,KEYEVENTF_KEYUP,0); 
    } } 
    } void CAboutDlg::OnOK() 
    {//enter password 
        EnterWord("a"); 
     

    CDialog::OnOK();
    }
    ---------------------------------------------------------------------
    to magician 0303 谢谢你的代码这是我照你的代码改的实验的代码
    通过keybd_event函数模拟键盘向QQ登陆输入edit窗口输入一个字母a
    按理说正常结果应该和手工用键盘输入字母a相同由于setwindows的作用QQ父登陆对话框
    移动到你指定的位置并且,
    在登陆edit窗口产生一个代表输入过字母a的*号
    现在我试验你这个程序就是除了移动窗口外没有任何代表已经输入过字母的输入出现
    也就是相当于手工什么也没输入。能不能帮我看看是不是我还是什么地方没搞对,
    我开始用得是win32试验后来改到mfc直接拷代码然后改还是没成功
    你的成功了,请帮忙看看我的原因我也是QQ2007
    ----------------------------------------------------------------------
    to 那些不试验也不说为什么不行就告诉人家这种方法不行的人,如果你们知道为什么不行
    可以将原因如果原因大家都接受自然会给你分给你结帖的,如果只是简单告诉不行
    那这种话谁都可以说,说一遍也就够了,我们知道有人说不行就够了,你们让我们还觉得有可能的人
    试验以下好不好
      

  24.   

    谢谢magician0303还有支持我的朋友还有lz我另开一贴送分了!
    然后等期中考完试再回来:)
      

  25.   

    模拟键盘得保证QQ密码框有焦点吧??
    QQ自动登录也不是用这招的
    想截密码得通过其它方法,网上见过的有读内存的还有自己画个密码框
      

  26.   

    to fbiboss因为setwindowpos 一般情况就保证有焦点了,我不是做木马截密码楼主也不是这个意思
    而是在本地已知密码帐号让QQ登陆不需要输入密码就可以登陆。基本上magician0303的代码已经可以实现了
    就是不是很稳定,等期中考完试我再想一想是什么愿因。
      

  27.   

    真是不好意思
    KB_EVENT是可以,
    我之前说不可以也是试过的,只是方法上有些问题,所以没有成功
    刚才换了个方法试了下是可以.
    不好意思
      

  28.   

    之前我给过的代码只是做为参考,如果注意一下就知道问题出在哪里了,其实一般qq起动时就会跳到密码输入里,但新安装的多是直接跳到输入qq号.只要你只用键盘输入能行,然后将你的步骤模拟键盘输入就可行了.
      

  29.   

    我是用这段代码来查找密码编辑框的,但没找到.nyhenry,你的相关代码是怎样写的,你试一下再贴出来,我准备结贴.多谢大家光临.
    void CLchQQTestDlg::OnFindqqpwdedit() 
    {
    // TODO: Add your control notification handler code here
    CWnd* pWnd = FindWindow(_T("#32770"), _T("QQ用户登录"));
    CEdit *pPwd = (CEdit *)pWnd->GetDlgItem(16038);
    if(pPwd){
    MessageBox("find pwdedit");
    }
    }
      

  30.   

    这个方法对以前老版的QQ有用,最近几个版本的QQ已经解决了这种问题
    如果想找句柄,用findwindowex遍历试试
      

  31.   

    发给我吧[email protected].多谢了.
    实际上,真正的QQ登录器并不需要启动登录框,不需要查找窗口句柄等一系列复杂的操作,而是调用ShellExecute函数,其中一个参数有号码和密码信息.
      

  32.   

    HWND g_hMainHwnd = 0; //在初始化的函数中加入
     // TODO: Add extra initialization here
        g_hMainHwnd = this->GetSafeHwnd();
    #define UWM_FIND_A_CHILD_WND WM_USER+102    // 自定义消息:找到了一个子窗口BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM lParam)
    {  
        //enum the child window,find passedit
        if(hWnd)
        {
            ::SendMessage(g_hMainHwnd, UWM_FIND_A_CHILD_WND, 0, (LPARAM)hWnd);
        }
        
        return TRUE;
    }调用:
     
     ::EnumChildWindows(hCurrentWnd, EnumWndProc, wParam);遍历实现:
      
      LRESULT CWatchIEDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    // TODO: Add your specialized code here and/or call the base class
        // 消息处理函数
    if (message == UWM_FIND_A_CHILD_WND)
        {
            HWND hWnd = (HWND)lParam;
            LONG style=::GetWindowLong(hWnd,GWL_STYLE); //得到STYLE char title[255];
    ::GetClassName(hWnd, title, 255); if(!strcmp(szPass, "Edit"))
    {
    ::SendMessage(hWnd, WM_GETTEXT, 255, (LPARAM)title); //得到所有文本框内容
    CString str(szPass);
    //在下面加入操作得到的内容的语句
    }
            
            if(style&ES_PASSWORD)   //是密码框
            {
                char szPass[255];
                ::SendMessage(hWnd, WM_GETTEXT, 255, (LPARAM)szPass); //得到PASS
    CString str(szPass);
                //::SendMessage(g_hMainHwnd, WM_SETTEXT, 0, (LPARAM)szPass); //显示
                // 显示
                //在下面加入操作得到的内容的语句
            }      } return CDialog::WindowProc(message, wParam, lParam);
    } 以上代码可以遍历当前窗口所有的文本框, 但QQ2008的密码框经过处理, 用 WM_GETTEXT 得不到内容 希望有高手能给指点, 我想得到密码 纯属学习, 使用些代码非法盗QQ,与本人无关 
      

  33.   

    就算你用WM_COPYDATA亦是不行的
    QQ.com对此做了处理了
      

  34.   

    QQ271991628给我发个qq2008登录器吧,邮箱[email protected],谢了
      

  35.   

    一句话 想盗qq用钩子 消息是不可能的 不过想做登录器 兄弟不用这莫麻烦吧 我记得网上有个vbs脚本就可以实现 是用的keyboard发送键盘按键 绝对可以! 我试过!!! 不过你要想盗qq凭这些可就不行了 我也在研究!!! 看来只有用驱动了!!!
      

  36.   

    dfQQ 密码框加密了.所谓加密个人感觉两种,一是采用某种加密算法,二是填充乱码.应用层开发,密码是够强能拿到的,底层可以.我试过.DDK里有例子.关于键盘.没试可以拿到任意输入.还有个具体还没研究.QQ上有保存密码账号的功能.或许可下手.呵.