c++ setWindowHookEx함수에 대해서...

조회수 560회
DWORD getProcessId() {
    PROCESSENTRY32 process_infor;
    process_infor.dwSize = sizeof(PROCESSENTRY32);

    HANDLE snap_handle = CreateToolhelp32Snapshot(
        TH32CS_SNAPALL, //스냅 단계
        NULL //스냅할 pid
    );

    if (snap_handle != INVALID_HANDLE_VALUE) {
        Process32First(snap_handle, &process_infor);

        do {
            wchar_t* temp = process_infor.szExeFile;
            wstring ws(temp);
            string name(ws.begin(), ws.end());

            if (name == process_name) {
                cout << name << " : " << process_infor.th32ProcessID << endl;
                return process_infor.th32ProcessID;
            }

        } while (Process32Next(snap_handle, &process_infor));
    }

    CloseHandle(snap_handle);
    return FALSE;
}

BOOL inject() {
    HMODULE dll_handle;
    HOOKPROC func;
    HHOOK process_hook;

    dll_handle = LoadLibrary(L"hello.dll");
    func = (HOOKPROC) GetProcAddress(dll_handle, "injectSuccess");

    cout << "handle : " << dll_handle << endl;
    cout << "pid : " << getProcessId() << endl;

    process_hook = SetWindowsHookEx(
        WH_KEYBOARD,
        func,
        dll_handle,
        getProcessId("notepad.exe")
    );

    cout << "pook : " << process_hook << endl;
    cout << "err : " << GetLastError() << endl;
    FreeLibrary(dll_handle);

    return FALSE;
}

dll 파일

#include <Windows.h>

using namespace std;

int injectSuccess(int code, WPARAM wParam, LPARAM lParam) {
    MessageBox(nullptr, L"dll파일 심기 성공(dll injection)", L"알림", MB_OK);

    return CallNextHookEx(nullptr, code, wParam, lParam);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {

    switch (ul_reason_for_call) {
        case DLL_PROCESS_ATTACH:
            MessageBox(nullptr, L"안녕", L"알림", MB_OK);

        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }

    return TRUE;
}

요기서 맨위의 inject함수에서 dll파일도 잘 로드되고 안의 injectSuccess함수까지도 잘 가져와지고 실행도 잘 되는데 setWindowHookEx에서 막히네요 ㅜㅜ. 함수 인자값들로 뭘 넣어야하는지 게속 찾아보면서 비교했는데 아무리 찾아도 문제는 없는거같고, 메모장에 dll을 심으려고 해서 메모장의 pid가 문제가 있나 싶어서 콘솔에 찍어봤는데 그것마져 잘 구해지고 있고 아무리봐도 문제가 없는거같아요 ㅜㅜ. 게속 setWindowHookEx반환값은 0이고 오류를 찍어보니(getLastError()) 87이 나왔는데 검색해보니 정확한 결과가 게속 안나오네요ㅜㅜ. 제가 초보라서 못알아먹은걸수도있는데 혹시 아시면 알려주세욤 ㅜㅜ.

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • setWindowHookEx Return value 는 HHOOK 형태이고 일반적으로 CallNextHookEx 와 chain 형태로 쓰는걸 MS 에서 강력히 권장한다네요. 질문자님과 비슷한 내용으로 진행한 블로그가 있어서 공유드립니다. https://yokang90.tistory.com/60 김호원 2020.10.23 13:27
  • 헉...한번 읽어보겠습니닷 알 수 없는 사용자 2020.10.23 14:13

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)