【问题标题】:How can i protect against this bypass?我怎样才能防止这种绕过?
【发布时间】:2014-01-18 22:28:04
【问题描述】:

我有它来防止被鼠标调用的机器人。 (如果点击是否由人进行)。

我有它要保护: http://pastebin.com/SfebsEPj

但有些人做了绕过: http://pastebin.com/HK9CekzZ

有人有想法吗?

代码:

HHOOK MouseHook;

LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        if(wParam == WM_RBUTTONDOWN || wParam == WM_LBUTTONDOWN)
        {
            MSLLHOOKSTRUCT *info=(MSLLHOOKSTRUCT*)lParam;     
            if((info->flags & LLMHF_INJECTED) == LLMHF_INJECTED)
            {
                ExitProcess(-1);
            }
        }
    }
    return CallNextHookEx(MouseHook,nCode,wParam,lParam);
}


void AntiShotbotLogger()
{
    HINSTANCE hInstance = GetModuleHandle(NULL);

    MouseHook = SetWindowsHookEx( WH_MOUSE_LL, MouseHookProc, hInstance, NULL );
    MSG message;
    while (GetMessage(&message,NULL,0,0)) {
        TranslateMessage( &message );
        DispatchMessage( &message );
    }

    UnhookWindowsHookEx(MouseHook);

绕过:

HHOOK MouseHook;


LRESULT CALLBACK ReplaceMousehook(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION && (wParam  == WM_RBUTTONDOWN || wParam == WM_LBUTTONDOWN))
    {
        reinterpret_cast<MSLLHOOKSTRUCT*>(lParam)->flags = 0;
        std::cout << "Injection bypassed!" << std::endl;
    }
    return CallNextHookEx(MouseHook,nCode,wParam,lParam);
}


void ShotbotBypassExample()
{
    while(true)
    {
        if (GetAsyncKeyState(VK_NUMPAD0)&1)
        {
            std::cout << "Sending input now." << std::endl;
            INPUT input[2];
            input[0].type = INPUT_MOUSE;
            input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;    
            input[1].type = INPUT_MOUSE;
            input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
            SendInput(2, input, sizeof(INPUT));
        }


        Sleep(1);
    }
}


int main(int argc, char** argv)
{
    std::thread keybind(ShotbotBypassExample);
    keybind.joinable();


    HHOOK hook = SetWindowsHookEx( WH_MOUSE_LL, ReplaceMousehook, GetModuleHandle(0), NULL );
    MSG message;
    while (GetMessage(&message,NULL,0,0)) {
        TranslateMessage( &message );
        DispatchMessage( &message );
    }
    return 0;
}

【问题讨论】:

  • 在问题中粘贴一个小的、独立的示例。我懒得打开不受信任的外部链接。
  • '我急需'我删除了它,因为它是一个主要的downvote吸引子......
  • @H2CO3 信任,是pastebin。
  • 这两段代码都可以很容易地粘贴到这里的问题中。指向外部网站的链接会过时,从而使问题和任何可能的答案在未来对人们毫无用处。
  • @user3018746 '信任,它是 pastebin' 这不是重点!您应该在此处显示合理的代码示例,以重现问题或支持说明您的特定问题的详细解释!

标签: c++ api mouse hook


【解决方案1】:

安装您的自己的挂钩,不要致电CallNextHookEx。他们的钩子不会被调用(如果它更旧)。

此外,当您安装钩子时,请检查您的进程是否有已加载的 DLL。稍后加载的任何 DLL 都可能包含一个覆盖您的钩子的钩子。

【讨论】:

  • 如何在不调用 CallNextHookEx 的情况下安装其他挂钩?