Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 17 kết quả

Đề tài: InjectDLL Sử Dụng SetWindowHook Hook KeyBoard

  1. #1
    Ngày gia nhập
    03 2008
    Bài viết
    36

    Mặc định InjectDLL Sử Dụng SetWindowHook Hook KeyBoard

    Mình có 1 đoạn DLL đơn giản sau để hook keyboard của 1 process:
    Code:
    #include "stdafx.h"
    #include <windows.h>
    
    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif
    
    HWND hMyWnd;
    HANDLE hHookKeyboard;
    HINSTANCE hInstDll;
    
    extern "C" __declspec (dllexport) LRESULT __stdcall KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
    {
        if(code == HC_ACTION) //if the wparam/lparam contains any data
        {
            if(wParam == VK_RETURN) //if wparam (which is a vk) is return
            {
                MessageBoxA(NULL,"Enter","Enter",MB_OK);
                return 1; //return 1, which means that the key event wont be processed
            }
            if (wParam == 'A')
            {
                MessageBoxA(NULL,"A","A",MB_OK);
                return 1;
            }
        }
    
        return CallNextHookEx(0, code, wParam, lParam);
    }
    
    int FAR InstallHookKeyboard(HWND hWnd) {
        hHookKeyboard = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc, hInstDll, 0);
        if (hHookKeyboard == NULL) {
            MessageBoxA(NULL,"Can't set Hook KeyboardProc","Error",MB_OK);
            return 0;
        }
        hMyWnd = hWnd;
        return 1;
    }
    
    int FAR UninstallHookKeyboard(void) {
        return UnhookWindowsHookEx((struct HHOOK__ *)hHookKeyboard);
    }
    
    
    extern "C" BOOL __declspec (dllexport) __stdcall DllMain (HINSTANCE hInst,
                                                              DWORD reason,
                                                              LPVOID reserved)
    {
        switch (reason)
        {
        case DLL_PROCESS_ATTACH:
            hInstDll= hInst;        
            if (InstallHookKeyboard(hMyWnd)==0)
                MessageBoxA(NULL,"Khong cau moc ham xu ly keyboard duoc!!","Error",MB_OK);
            else   
                MessageBoxA(NULL,"OK!!","OK",MB_OK);
    
            break; 
    
        case DLL_PROCESS_DETACH:
            MessageBox(HWND_DESKTOP, "H", "g", MB_OK);
            UninstallHookKeyboard();
            
            break;
        case DLL_THREAD_ATTACH:
            break;
    
        case DLL_THREAD_DETACH:
            break;
        }
        return TRUE;
    }
    
    #ifdef _MANAGED
    #pragma managed(pop)
    #endif
    Sau khi biên dịch thành file DLL, mình sử dụng 1 chương trình DLL Injector để inject cái DLL này vào Notepad thử và nó báo inject thành công nhưng không thể hook được keyboard (mình thử phím A, Enter mà không hiển thị messagebox)
    Đã được chỉnh sửa lần cuối bởi T4mQu0c : 08-10-2008 lúc 07:45 PM.

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn muốn hook hay subclass ? Sao lại làm nửa này nửa kia như vậy ? Trong DllMain mà lại gọi hàm installhook, hàm này cài đặt hook và thường DllMain lại được gọi thêm một lần nữa => đệ quy liên tục, rất ko an toàn.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    03 2008
    Bài viết
    36

    Cái này mình đã sửa lại và làm được.
    Cám ơn bạn nha, cho mình hỏi subclass là gì vậy và cho mình xin 1 ví dụ đơn giản được không

  4. #4
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    subclass cũng gần giống hook tuy nhiên hook tác động lên toàn hệ thống còn subclass chỉ tác động lên process hiện hành mà thôi.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  5. #5
    Ngày gia nhập
    03 2008
    Bài viết
    36

    Bạn cho mình hỏi đoạn code DLL này là subclass hay hook vậy
    Code:
    #include "DLLHookKeyboard_CreateThread_While.h"
    
    bool WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
    {
    
        hmodMyDLL = hModule;
        switch (dwReason) {
            case DLL_PROCESS_ATTACH:
                MyInit();
                break;
            case DLL_PROCESS_DETACH:
                MyCleanUp();
                break;
        }
    
        return true;
    }
    
    void MyInit()
    {  
        hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)&InstallHook,NULL,NULL,&dwThreadId);
    }
    
    void MyCleanUp()
    {
        UnhookWindowsHookEx(hKbdHook);
        CloseHandle(hThread);
    }
    
    DWORD WINAPI InstallHook(LPVOID lpParam)
    {
        hKbdHook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)&HotkeyHandler,hmodMyDLL,NULL);
        do 
        {
            Sleep(100); 
        } while (true);
        return 0;
    }
    
    LRESULT __stdcall HotkeyHandler(int nCode, WPARAM wParam, LPARAM lParam) 
    {   
        if(nCode == HC_ACTION) 
        {
            switch (wParam) 
            {  
                case 'D':
                    return 1;       // chặn phím D
            }
        }
        return (CallNextHookEx(hKbdHook,nCode,wParam,lParam));
    }
    Mình cũng sử dụng 1 DLL injector để inject vào Notepad.
    Mình đang tìm hiểu subclass như bạn nói (chỉ chặn phím D trong 1 process thôi, không chặn phím D trong những ứng dụng khác). Bạn cho mình 1 ví dụ về subclass nha

  6. #6
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mặc định InjectDLL Sử Dụng SetWindowHook Hook KeyBoard

    Trong dll này bạn vẫn dùng kỹ thuật của subclass mà áp dụng cho hook. Bạn chỉ cải tiến là tạo thread thay vì gọi hàm để tránh đệ quy.
    - Kỹ thuật hook là làm như sau :Chỉ có ứng dụng cần hook các ứng dụng khác mới gọi hàm SetWindowsHookEx mà thôi. Bạn gọi hàm trong DllMain tức là tất cả mọi ứng dụng mà có nạp dll vào đều gọi hàm SetWindowsHookEx. Tức là tụi nó hook qua lại lẫn nhau, loạn cả lên.
    - Kỹ thuật subclass thì cách thực hiện khá giống như bạn làm, chỉ khác là trong DllMain gọi hàm SetWindowLong chứ không phải SetWindowsHookEx
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  7. #7
    Ngày gia nhập
    03 2008
    Bài viết
    36

    Trước tiên xin cám ơn bạn đã tận tình giải đáp những thắc mắc của mình
    Mình đã làm xong cái subclass đơn giản là chặn phím A trong Notepad, nhưng vẫn có thể nhập phím A trong các ứng dụng khác
    Code:
    #include "stdafx.h"
    
    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif
    
    HWND	hSASWnd;
    WNDPROC	OldSASProc;
    
    LRESULT CALLBACK SASWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        // Chặn phím A
        if (uMsg == WM_KEYDOWN || uMsg == WM_CHAR)
        {
            if (wParam == 'A' || wParam == 'a')
            {
                return 1;
            }
        }
      
        return CallWindowProc(OldSASProc, hWnd, uMsg, wParam, lParam);
    }
    
    DWORD WINAPI InstallSubClass(LPVOID)
    {
        // Subclass nên ta phải chọn class Edit vì ta muốn chặn phím A không cho nhập phím A trong Notepad
        hSASWnd = FindWindowA(NULL, "Untitled - Notepad");
        hSASWnd = FindWindowEx(hSASWnd, 0, TEXT("Edit"), 0);
    
        if (hSASWnd)
        {  
            OldSASProc = (WNDPROC)SetWindowLong(hSASWnd, GWL_WNDPROC, (LONG)SASWindowProc);
        }
        return TRUE;
    }
    
    DWORD WINAPI UnSubClass()
    {
        if (hSASWnd)
            SetWindowLong(hSASWnd, GWL_WNDPROC, (LONG)OldSASProc);
        
        return TRUE;
    }
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
        switch(ul_reason_for_call)
        {
            case DLL_PROCESS_ATTACH:
                CreateThread(0, NULL, (LPTHREAD_START_ROUTINE)&InstallSubClass, NULL, NULL, NULL);
                break;
            case DLL_PROCESS_DETACH:
                UnSubClass();
                break;
        }
        return TRUE;
    }
    - Mình cũng sử dụng 1 DLL Injector để inject cái DLL này vào Notepad. Nhưng vẫn còn thủ công là khai báo tìm kiếm handle trong DLL, có cách nào trong phần đầu hàm DllMain mình có thể lấy được cái handle của chương trình mà mình inject không vậy
    - Trong hàm DllMain mình sử dụng hàm GetCurrentProcess và từ đó có thể lấy được handle từ chương trình mà mình inject được không
    - Có cách nào duyệt hết các Edit Control trong handle

  8. #8
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trích dẫn Nguyên bản được gửi bởi T4mQu0c Xem bài viết
    Trước tiên xin cám ơn bạn đã tận tình giải đáp những thắc mắc của mình
    Mình đã làm xong cái subclass đơn giản là chặn phím A trong Notepad, nhưng vẫn có thể nhập phím A trong các ứng dụng khác
    Code:
    #include "stdafx.h"
    
    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif
    
    HWND	hSASWnd;
    WNDPROC	OldSASProc;
    
    LRESULT CALLBACK SASWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        // Chặn phím A
        if (uMsg == WM_KEYDOWN || uMsg == WM_CHAR)
        {
            if (wParam == 'A' || wParam == 'a')
            {
                return 1;
            }
        }
      
        return CallWindowProc(OldSASProc, hWnd, uMsg, wParam, lParam);
    }
    
    DWORD WINAPI InstallSubClass(LPVOID)
    {
        // Subclass nên ta phải chọn class Edit vì ta muốn chặn phím A không cho nhập phím A trong Notepad
        hSASWnd = FindWindowA(NULL, "Untitled - Notepad");
        hSASWnd = FindWindowEx(hSASWnd, 0, TEXT("Edit"), 0);
    
        if (hSASWnd)
        {  
            OldSASProc = (WNDPROC)SetWindowLong(hSASWnd, GWL_WNDPROC, (LONG)SASWindowProc);
        }
        return TRUE;
    }
    
    DWORD WINAPI UnSubClass()
    {
        if (hSASWnd)
            SetWindowLong(hSASWnd, GWL_WNDPROC, (LONG)OldSASProc);
        
        return TRUE;
    }
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
        switch(ul_reason_for_call)
        {
            case DLL_PROCESS_ATTACH:
                CreateThread(0, NULL, (LPTHREAD_START_ROUTINE)&InstallSubClass, NULL, NULL, NULL);
                break;
            case DLL_PROCESS_DETACH:
                UnSubClass();
                break;
        }
        return TRUE;
    }
    - Mình cũng sử dụng 1 DLL Injector để inject cái DLL này vào Notepad. Nhưng vẫn còn thủ công là khai báo tìm kiếm handle trong DLL, có cách nào trong phần đầu hàm DllMain mình có thể lấy được cái handle của chương trình mà mình inject không vậy
    - Trong hàm DllMain mình sử dụng hàm GetCurrentProcess và từ đó có thể lấy được handle từ chương trình mà mình inject được không
    - Có cách nào duyệt hết các Edit Control trong handle
    - Bạn liệt kê process ( bằng hàm EnumProcess hay Process32First và Process32Next cũng được ), sau đó kiểm tra xem process nào có pid bằng với GetCurrentProcessId thì lấy pid đó truyền vào hàm OpenProcess để lấy handle.
    - Handle do GetCurrentProcess lấy được là handle giả, tuy nhiên vẫn có thể dùng được trong phạm vi process đang xét.
    - Dùng EnumChildWindows
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  9. #9
    Ngày gia nhập
    03 2008
    Bài viết
    36

    Cám ơn bạn
    - Mình đã sử dụng EnumChildWindows để có thể tìm được control Edit trong Notepad với sự trợ giúp của hàm GetClassName
    - Bạn hướng dẫn mình cách hook tránh sao cho các ứng dụng hook qua lại lẫn nhau nha
    p/s: hichic sao mình thấy mình được voi đòi tiên làm phiền bạn nhiều quá

  10. #10
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Muốn hook mà ko bị loạn thì bạn chỉ cần gọi hàm SetWindowsHookEx một lần trong chương trình của bạn thôi, đừng có gọi hook trong dll là được.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

Các đề tài tương tự

  1. Hook keyboard và mouse hook trong c# không cần code
    Gửi bởi tienlbhoc trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 7
    Bài viết cuối: 23-06-2013, 01:27 PM
  2. Hướng dẫn cài đặt Low-Level Keyboard Hook trong C#
    Gửi bởi Yin Yang trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 14-08-2011, 03:44 PM
  3. hook keyboard trong VC++ không được :(
    Gửi bởi Con Nít trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 1
    Bài viết cuối: 13-11-2010, 08:53 PM
  4. Hỏi xíu về Hook KeyBoard
    Gửi bởi metaldragon trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 2
    Bài viết cuối: 26-06-2010, 09:24 PM
  5. Hook API bằng Hàm Setwindowhook
    Gửi bởi Cpro trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 1
    Bài viết cuối: 24-08-2009, 12:39 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn