본문 바로가기
기타/토이 프로젝트

아두이노로 키보드 입력 방지 우회하기

by Hwan,. 2021. 9. 10.
728x90
반응형

목적

아두이노 Leonardo Beetle(CJMCU-Beetle)로 OS에서 키보드로 인식되게 하여 입력 방지 프로그램을 우회


 

부품 구매

디바이스 마트
엘레파츠

 

제작

OS에서 시리얼 통신 방식으로 입력할 문자열을 아두이노에 전송해주면, 내부의 스크립트가 문자열을 읽어 키보드로 입력해주는 원리로 파워쉘 스크립트와 아두이노 스크립트를 작성하여 제작함.

 

1) COM포트에 문자열을 전송해주는 파워쉘

# COM1 부분은 Leonardo Beetle이 연결된 포트에 해당, 두번째 인자는 Baud Rate
$port = new-Object System.IO.Ports.SerialPort COM3,115200,None,8,one

$port.open()

# 열려진 포트에 HELLO. 문자열 Write
$port.WriteLine("HELLO.")

# 열려진 포트에 한글로 문자열 Write (한영키(Right Alt 키)를 누르면 한글로 조합됨)
$port.WriteLine("xptmxm answkduf")

$port.Close()

 

2) 아두이노 코드

// Arduino Leonardo, 115200, COM3
// 보드를 Leonardo로 설정해주고 업로드해야함
// 설정하지 않을 경우 Keyboard.h를 찾을 수 없음
#include "Keyboard.h"

void setup() {
  Serial.begin(115200);
  Keyboard.begin();
}

void my_keyinput(char ch)
{
  // delay 10ms 후 키보드 Press
  delay(10);
  Keyboard.press(ch);
  
  // delay 10ms 후 키보드 Release
  delay(10);
  Keyboard.releaseAll();
}

void loop() 
{
  // 1초 딜레이 후 시작
  delay(1000);
  Serial.println("loop start");
  
  // 입력전에 혹시 눌려진 키가 있을 수 있어 전체 Release 해줌
  delay(100);
  Keyboard.releaseAll();
  
  char temp[100];
  if(Serial.available())
  {
    // `문자열이 존재할 때까지 100bytes 씩 시리얼 포트를 읽어옴.
    byte leng = Serial.readBytesUntil('`', temp, 100); 
    
    delay(200); 
    
    // 한글자씩 분해하고 키 입력
    for(int i = 0; i < leng; i++)
    {
      Serial.print(temp[i]);
      my_keyinput(temp[i]);
    }
    Serial.println();
  }    
  
  delay(100);
  Keyboard.releaseAll();
  
  delay(1000);
  Serial.println("loop end");
}

 

 

참고사항

  • Leonardo Beetle은 아두이노 레오나르도의 Beetle 버전
  • 위의 코드는 Leonardo Beetle만 구매하면 사용이 가능함

 

728x90
반응형

댓글