https://www.youtube.com/watch?v=q1sWSydrq8U
세줄 요약
1. 아이유 공식 응원봉의 원격 제어 기능을 이용해 색 바꾸기 성공
2. 공유 안함 달라고 하지 마셈
3. 어차피 별도 HW 있어야 쓸 수 있어서 그냥 못씀
Part 1 요약
아이유 공식 응원봉은 기본적으로 중앙 제어 없이는 네온옐로우 색 밖에 낼 수 없고 깜박거리는 속도 정도만 제어가 가능한데, 이게 맘에 안들기도 하고 심심해서 응원봉 색을 바꿔보기로 함. 분해해서 기판 회로를 바꿔도 LED 색은 바꿀 수 있지만, 그러면 재미 없으므로 회로는 건드리지 말고 콘서트에서 사용하는 중앙 제어 방식을 직접 구현해 보자.
Part 1에서 각종 사전 분석 끝에 실제 제어 정보를 송신하는 컨트롤러 없이는 원격 제어 방식을 파악하는게 불가능하다고 결론 났고, 응원봉 중앙 제어가 이뤄지는 콘서트 때까지 기다린 후, 콘서트 동안 제어 정보를 저장한 뒤 분석 해야겠다고 생각함.
그렇게 콘서트 공지가 뜨기까지 1년을 기다렸다.
자, 그럼 콘서트 때 중앙 제어 정보를 어떻게 따올까?
일단 모든 주파수 대역을 다 따올 수는 없으니 통신 주파수부터 알아야 한다. 문제는 파트 1에서 봤듯이 통신 주파수와 변조 방식이 상세히 나오는 FCC 인증과는 다르게 한국의 전파 인증은 그런거 안알랴줌이라는 것.
다행히 이 문제는 간단히 해결되었는데,

응원봉 판매 페이지에 '2.4Ghz 무선컨트롤 기능' 이라고 친절하게 적혀 있었기 때문.
뭐 그냥 저렇게 아무렇게나 적어놓고 실제로는 다른 주파수 대역을 쓸 수도 있지만... 일단 믿어보자.

ISM 밴드는 별도로 허가나 신고를 하지 않아도 사용할 수 있는 주파수 대역인데, 2.4Ghz 대역의 ISM 주파수 대역은 2.4~2.4835Ghz 임. Wi-Fi, Bluetooth 등이 다 이 대역을 씀.
즉, 콘서트 동안 요 주파수 대역을 저장해두면 된다는 거다.

그걸 위해 공대생의 영원한 친구 라즈베리 파이에 보조배터리, 수신 장비를 연결해놓고 콘서트 동안 가방 안에 넣고 켜둠.
내가 갖고있는 수신 장비로는 한번에 10Mhz 대역만 캡쳐가 가능해서, 1분씩 대역을 바꿔가며 저장하는 간단한 스크립트를 짠 뒤 라즈베리파이가 켜지면 자동으로 실행되도록 세팅.

특성상 주파수 캡쳐 파일은 크기가 매우 크고 아름다워서, 라즈베이파이에 256GB SD 카드를 끼워놨는데도 한시간 정도밖에 캡쳐를 못한다.
라즈베리파이 IO 성능이 너무 구려서 쓰기 속도를 못따라가길래 SD 슬롯도 오버클럭하고 메모리 버퍼 잡아주고 딜레이 넣고 하여간 튜닝에 좀 애먹음... 인텔 보드 쓰면 상관 없었을텐데 노는게 없어서 ㅠㅠ
부산콘에서 처음 돌린 뒤 부산콘에서 캡쳐된게 노이즈가 너무 많아서 서토콘때 다시 돌림
그리고 캡쳐된 파일을 그대로 다시 재생하면...

빙고!
이렇게 단순히 주파수를 캡쳐했다가 다시 재생하는걸 Replay Attack이라고 하는데, 패킷에 시간 정보만 넣어도 간단히 막히지만 응원봉에 RTC 같은걸 넣을리가....
여기까지만 해도 원하는 목표는 거의 달성함.

이제 캡쳐된 파일을 색깔별로 자르고 원하는 부분만 추출한 뒤 간단한 GUI를 만들어주면,
https://www.youtube.com/watch?v=gE12w3izLtE
이렇게 원격 제어를 통해 색깔 바꾸기가 가능함.
여기까지만 해도 목표는 달성했지만, 뭔가 2% 마음에 들지 않는다.
왜냐면 저 방식으로는 지정된 몇가지 색으로만 바꿀 수 있고 내가 원하는 색을 만들 수 없기 때문인데,
좀 더 나아가서, 패킷을 분석해서 원하는 색을 만들어보자.

먼저 캡쳐된 데이터를 FFT 돌리고 Waterfall을 뿌려보면, 위처럼 시간 대역에서 주파수의 변화를 볼 수 있다. 저렇게 생겨먹은건 딱봐도 FSK다.
자세한 내용은 꺼라위키 등에 친절히 설명되어 있으니 생략
FSK인걸 알았으니 복조를 해봅시다.

이렇게 넣고 돌리면

이렇게 복조된 파형이 나옴.
이걸 바이너리로 변환하고, 각 색깔별로 이 과정을 반복하면 색이 바뀔 때 패킷 중 가운데 일부만 변함을 알 수 있다.

이렇게.
눈치가 좋다면 바뀌는 저 3 바이트가 RGB 색상값이라는걸 알아챘을텐데, 여기까지를 통해 추측한 패킷 구조는 아래와 같다.

그럼 이제 원하는 색상 값을 넣고 다시 변조해서 송신해보자.

근데 안된다 -_-
무선 통신이니 오류를 감지하기 위한 CRC가 있는걸로 예상되니, 어떤 CRC 방식을 쓰고 있는지 때려맞춰보자.


역시 이런건 무작위 대입이 최고...
예상대로 CRC가 맞고, 방식도 찾았다.

즉 이렇게 생겨먹은 프로토콜로 추측.
...근데 이렇게 해도 안됨 -_-
가만히 보니 가운데 바뀌는 패킷이 한 바이트 더 있다.

어차피 1바이트라 2^8 = 256가지밖에 안나오므로 모든 경우의 수 무작위 대입해서 색이 바뀔 때까지 돌려보자.
그 결과 색상값 3바이트를 XOR 연산하고 offset을 조정한 일종의 checksum으로 파악됨.

따라서 최종 프로토콜 구조는 위와 같은 것으로 추정.

여기까지 얻은 정보를 바탕으로 간단한 패킷 생성 스크립트를 짜면
https://www.youtube.com/watch?v=QdMERlqQ1qY
이렇게 입력받은 색상값으로 응원봉 색을 바꿀 수 있다.
여기서 끝내기 아쉬우니 컴퓨터 없이 들고 다닐 수 있게 만들어보자.

공대생의 영원한 친구 2인 아두이노....는 아니고 아두이노의 사촌뻘 되는 NodeMCU를 썼다. 집에 이놈이 여러개 굴러다니고 있기도 하고 와이파이가 붙어있어서 스마트폰이랑 연결하기도 편함. 성능도 아두이노보다 훨씬 좋음.

뚝딱 코딩해서 넣어주고,

UI도 대충 만들어서 넣어주면,
https://www.youtube.com/watch?v=q1sWSydrq8U
끝!
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.