본문 바로가기

오토핫키 강좌

오토핫키에서 하드웨어 신호 입력(AHI)를 사용해보기

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

반갑습니다~ 오랜만입니다


이번에는 오토핫키(AutoHotKey)에서 하드웨어 신호 입력 우회를 통해

소프트웨어 신호가 차단된 프로그램이나 게임에서 키입력을 주는 방법에 대해서 알아볼려고 합니다.


우선 하드웨어(Hardware) 신호와 소프트웨어(Software) 신호에 대해서 간단하게 알려드리자면은

기본적으로 윈도우에서는 키, 마우스 입력에 2가지 종류가 있는데

하나는 실제 키보드, 마우스를 통해서 윈도우로 전달되는 하드웨어 신호이고

 

나머지 하나는 소프트웨어 신호라고해서

윈도우 내의 프로그램에서 전달되는 소프트웨어 신호로 구분됩니다.

 



그리고 요즘에 하드웨어 입력 방식이 선호되는 이유를 크게 말씀드리자면은

원래 옛날에는 보안사나 게임에서 소프트웨어 신호를 막지 않았지만

시대가 발전함에 따라 게임사나 보안 프로그램에서 비정상, 비인가 프로그램을

검출 및 차단하기 위해서 소프트웨어 신호와 하드웨어 신호를 구별함으로써

비정상적인 플레이와 정상적인 플레이를 구별해내기 시작했기 때문입니다.

 


그러면 본격적으로 오토핫키 AHI(AutoHotInterception)를 사용하는 방법에 대해서 알려드리겠습니다!


먼저 AHI의 홈페이지인 https://github.com/evilC/AutoHotInterception 주소로 접속하셔서

파일을 다운로드 해주고 해야하지만 약간 복잡함으로 제가 이미 쓰고 있는 파일에서

설치만 하시고 바로 사용 가능하게 구글 드라이브 링크를 드리겠습니다.

https://drive.google.com/file/d/1kQg3kJT4W5Y-1zwEeLTwrGOFv3wO3mJi/view?usp=sharing


해당 파일을 다운로드하시고 압축 푸시면 안에 "command line installer" 이라는

 

폴더가 있는데 해당 주소를 텍스트로 복사해줍니다.

 

그리고 나서 cmd 명령 프롬프트를 관리자 권한으로 실행시킨 다음에

 

아래 명령어들을 차례로 입력해줍니다.

 

 

1. cd 아까 복사했던 주소 붙여넣기

 

2. install-interception.exe /install 입력하고 엔터

 

3. 재부팅 (필수!!)

 

 

이렇게 재부팅하고 나서 폴더 안에 있는 "Monitor.ahk" 파일을 실행시키시면

 

현재 사용되고 있는 키보드와 마우스의 하드웨어 ID 번호가 출력되는데

 

 

여기서 키보드 번호와 마우스 번호를 기억해줍니다.

 

 

그리고 폴더 안에 있는 "Script.ahk" 파일이 여러분들이 사용하실 스크립트 파일입니다.

 

안에 모든 키보드/마우스 입력 함수들이 모두 간단하게 정리되어있으니

 

필요에 따라서 사용하시면됩니다.

 

 

아래 움짤은 오토핫키 AutoHotInterception을 통해서

 

한글 문자열을 입력해본 예시입니다.

 

 

아래는 오토핫키 AHI의 모든 키보드, 마우스 입력을

 

간단하게 함수로 만든 목록들입니다.

#include Lib\AutoHotInterception.ahk

#InstallKeybdHook

Global AHI := new AutoHotInterception() ; 전역 AutoHotInterception Class 객체 선언




Global KeyBoard_ID := "1"
Global Mouse_ID := "13"



; 시작 부분




; 끝 부분




;###########################################################################################


; 오토핫키 AHI 하드웨어 입력 함수 간단화 목록

Key_Press_And_Up(Key)
{
    AHI.SendKeyEvent(KeyBoard_ID, GetKeySC(Key), 1)
    AHI.SendKeyEvent(KeyBoard_ID, GetKeySC(Key), 0)
}

Key_Press_And_Up_Combined(Key, Key2)
{
    AHI.SendKeyEvent(KeyBoard_ID, GetKeySC(Key), 1)
    AHI.SendKeyEvent(KeyBoard_ID, GetKeySC(Key2), 1)

    AHI.SendKeyEvent(KeyBoard_ID, GetKeySC(Key2), 0)
    AHI.SendKeyEvent(KeyBoard_ID, GetKeySC(Key), 0)
}




; 문자열을 입력합니다 예) Key_Press_And_Up_String("12345")
Key_Press_And_Up_String(KeyString)
{

    ;Length := StrLen(KeyString)

    StringLen, Length, KeyString


    Loop, %Length%
    {
        StringMid, Sender, KeyString, A_Index, 1

        Key_Press_And_Up(Sender)

        RandomSleep(50, 200)
    }

}



Key_Press(Key, Stats)
{
    IF ( Stats = "Down" )
    {
        AHI.SendKeyEvent(KeyBoard_ID, GetKeySC(Key), 1)
    }
    IF ( Stats = "Up" )
    {
        AHI.SendKeyEvent(KeyBoard_ID, GetKeySC(Key), 0)
    }
}




Mouse_Click_Drag(StartX, StartY, EndX, EndY)
{
    StartDragX := 65535 / 1920 * StartX
    StartDragY := 65535 / 1080 * StartY

    EndDragX := 65535 / 1920 * EndX
    EndDragY := 65535 / 1080 * EndY

    
    AHI.SendMouseMoveAbsolute(Mouse_ID, StartDragX, StartDragY)
    RandomSleep(100, 200) 
    AHI.SendMouseButtonEventAbsolute(Mouse_ID, 0, 1, StartDragX, StartDragY)
    RandomSleep(100, 200) 
    AHI.SendMouseMoveAbsolute(Mouse_ID, EndDragX, EndDragY)
    RandomSleep(100, 200) 
    AHI.SendMouseButtonEventAbsolute(Mouse_ID, 0, 0, EndDragX, EndDragY)
    RandomSleep(400, 500)
}



Fast_Click(ClickX, ClickY)
{
    MouseX := 65535 / 1920 * ClickX
    MouseY := 65535 / 1080 * ClickY

    AHI.SendMouseMoveAbsolute(Mouse_ID, MouseX, MouseY)
    AHI.SendMouseButtonEventAbsolute(Mouse_ID, 0, 1, MouseX, MouseY)
    AHI.SendMouseButtonEventAbsolute(Mouse_ID, 0, 0, MouseX, MouseY)
}



Fast_Click_Right(ClickX, ClickY)
{
    MouseX := 65535 / 1920 * ClickX
    MouseY := 65535 / 1080 * ClickY

    AHI.SendMouseMoveAbsolute(Mouse_ID, MouseX, MouseY)
    AHI.SendMouseButtonEventAbsolute(Mouse_ID, 1, 1, MouseX, MouseY)
    AHI.SendMouseButtonEventAbsolute(Mouse_ID, 1, 0, MouseX, MouseY)
}


Slow_Click(SlowClickX, SlowClickY)
{
    SlowClickMouseX := 65535 / 1920 * SlowClickX
    SlowClickMouseY := 65535 / 1080 * SlowClickY

    AHI.SendMouseMoveAbsolute(Mouse_ID, SlowClickMouseX, SlowClickMouseY)
    RandomSleep(400, 500)
    AHI.SendMouseButtonEventAbsolute(Mouse_ID, 0, 1, SlowClickMouseX, SlowClickMouseY)
    AHI.SendMouseButtonEventAbsolute(Mouse_ID, 0, 0, SlowClickMouseX, SlowClickMouseY)
}



Mouse_Move(MoveX, MoveY)
{
    X := 65535 / 1920 * MoveX
    Y := 65535 / 1080 * MoveY

    AHI.SendMouseMoveAbsolute(Mouse_ID, X, Y)
    RandomSleep(400, 500)
}


Mouse_Click_Left(ClickX, ClickY)
{
    MouseX := 65535 / 1920 * ClickX
    MouseY := 65535 / 1080 * ClickY

    AHI.SendMouseMoveAbsolute(Mouse_ID, MouseX, MouseY)
    RandomSleep(100, 200)
    AHI.SendMouseButtonEventAbsolute(Mouse_ID, 0, 1, MouseX, MouseY)
    RandomSleep(100, 200)
    AHI.SendMouseButtonEventAbsolute(Mouse_ID, 0, 0, MouseX, MouseY)
    RandomSleep(400, 500)
}

Mouse_Double_Click_Left(ClickX, ClickY)
{
    MouseX := 65535 / 1920 * ClickX
    MouseY := 65535 / 1080 * ClickY

    Loop, 2
    {
        AHI.SendMouseMoveAbsolute(Mouse_ID, MouseX, MouseY)
        RandomSleep(100, 200)
        AHI.SendMouseButtonEventAbsolute(Mouse_ID, 0, 1, MouseX, MouseY)
        RandomSleep(100, 200)
        AHI.SendMouseButtonEventAbsolute(Mouse_ID, 0, 0, MouseX, MouseY)
        RandomSleep(100, 200)
    }

    RandomSleep(400, 500)
}


Mouse_Click_Right(ClickX, ClickY)
{
    MouseX := 65535 / 1920 * ClickX
    MouseY := 65535 / 1080 * ClickY

    AHI.SendMouseMoveAbsolute(Mouse_ID, MouseX, MouseY)
    RandomSleep(100, 200)
    AHI.SendMouseButtonEventAbsolute(Mouse_ID, 1, 1, MouseX, MouseY)
    RandomSleep(100, 200)
    AHI.SendMouseButtonEventAbsolute(Mouse_ID, 1, 0, MouseX, MouseY)
    RandomSleep(400, 500)
}

Mouse_Double_Click_Right(ClickX, ClickY)
{
    MouseX := 65535 / 1920 * ClickX
    MouseY := 65535 / 1080 * ClickY

    Loop, 2
    {
        AHI.SendMouseMoveAbsolute(Mouse_ID, MouseX, MouseY)
        RandomSleep(100, 200)
        AHI.SendMouseButtonEventAbsolute(Mouse_ID, 1, 1, MouseX, MouseY)
        RandomSleep(100, 200)
        AHI.SendMouseButtonEventAbsolute(Mouse_ID, 1, 0, MouseX, MouseY)
        RandomSleep(100, 200)
    }

    RandomSleep(400, 500)
}


Mouse_Wheel_Up()
{
    AHI.SendMouseButtonEvent(Mouse_ID, 5, 1)
}

Mouse_Wheel_Down()
{
    AHI.SendMouseButtonEvent(Mouse_ID, 5, -1)
}


Mouse_Wheel_Right()
{
    AHI.SendMouseButtonEvent(Mouse_ID, 6, 1)
}

Mouse_Wheel_Left()
{
    AHI.SendMouseButtonEvent(Mouse_ID, 6, -1)
}



RandomSleep(a, b)
{
    Random, ABCDEFG, %a%, %b%
    Sleep %ABCDEFG%
}

차례대로 마우스 우클릭 좌클릭, 마우스 이동, 마우스 드래그 등등

 

키보드 입력, 문자열 입력도 있습니다

 

 

이상으로 글을 마치며 궁금하신 점은 언제든지 환영입니다