아마존 데쉬 버튼 해킹해서 iot 용도로 만들기


다양한 아마존 데쉬 버튼 해킹 자료들.

How I Hacked Amazon’s $5 WiFi Button to track Baby Data

Inside the 802.11b/g/n Amazon Dash Button

INSIDE THE AMAZON DASH BUTTON

HACKING THE AMAZON DASH BUTTON TO RECORD WHATEVER YOU WANT


아마존 데쉬 버튼을 해킹해서 다른 용도로 사용할 수 있다는 블로깅을 보고 구입후 삽을 들어보기로 했습니다. 


일단 아마존 데쉬 버튼을 설정을 해야합니다. 설정을 하기 위해서 아마존 쇼핑앱을 실행을 합니다. 그리고 Your Account로 선택을 해서 이동합니다. 그리고 중간에 Dash Devices 메뉴에서 Set up a new device를 선택합니다. 아래 노란색 Get Started 버튼을 눌러서 다음으로 넘어갑니다.



 이후 뜬금 없는 사운드 볼륨 조절을 합니다. 이 이유는 아마존 데쉬 버튼에 직접적으로 WiFi 정보를 넘길 방법이 없기 때문에 아이폰의 스피커를 통해서 정보가 사운드 출력으로 아마존 데쉬 버튼의 마이크로 전달되어서 그 정보를 파싱해서 사용을 합니다. 




WiFi정보를 기입하고 Continue 버튼을 눌러서 다음으로 넘어갑니다. 아마존 데쉬 버튼을 파란색 LED가 깜빡일 때까지 누르고 있습니다. 그리고 Continue 버튼을 눌러서 다음으로 넘어갑니다.


조용한 곳에서 아이폰의 스피커 부분에 아마존 데쉬 버튼의 마이크 부분을 가까이 대고 준비를 하고 Continue 버튼을 눌러서 다음으로 넘어갑니다. 이 과정에서 자세히 들어보면 마치 모스부호처럼 삐..삐- 삐 이런식으로 소리가 들립니다. 전달이 완벽하게 되면 완료되었다는 페이지가 잠시 뜨고 최종 제품을 선택할 수 있는 페이지가 나타납니다. 이때 제품을 선택을 하면 안됩니다. 상단에 X버튼을 눌러서 셋업을 종료합니다. 


이러면 기본적인 하드웨어 셋팅은 끝났습니다. 


이제 부터는 간단한 python 코드를 통해서 각각의 아마존 데쉬 버튼의 맥 어드레스를 얻습니다. 


아래 코드를 복사 붙여 넣기 해서 새로운 파일을 만들고 실행을 합니다. 

from scapy.all import *

def arp_display(pkt):
  if pkt[ARP].op == 1: #who-has (request)
    if pkt[ARP].psrc == '0.0.0.0': # ARP Probe
      print "ARP Probe from: " + pkt[ARP].hwsrc

print sniff(prn=arp_display, filter="arp", store=0, count=10)


그러면 아래 그림 처럼 맥어드래스가 출력이 됩니다. 이 과정에서 주의해야할 것이 작업하는 맥북과 아마존 대쉬 버튼이 동일한 와이파이 환경에 있어야 합니다. 

  • 맥이 5GHz에 붙어 있어서 한참을 해맸습니다. 

  • ImportError: No module named pcapy 이런 에러가 뜨면 Installing Scapy for Mac OS X 블로그 포스트를 참조해서 몇몇 모듈을 설치하면 됩니다. 

그리고 찾아낸 맥 어드레스를 아래 파이선 코드에 if 구문에 붙여넣고 여러대의 아마존 데쉬 버튼을 구별하면 됩니다. 

from scapy.all import *
def arp_display(pkt):
  if pkt[ARP].op == 1: #who-has (request)
    if pkt[ARP].psrc == '0.0.0.0': # ARP Probe
      if pkt[ARP].hwsrc == '74:75:48:5f:99:30': # Huggies
        print "Pushed Huggies"
      elif pkt[ARP].hwsrc == '10:ae:60:00:4d:f3': # Elements
        print "Pushed Elements"
      else:
        print "ARP Probe from unknown device: " + pkt[ARP].hwsrc

print sniff(prn=arp_display, filter="arp", store=0, count=10)


실행을 하고, 맥 어드레스가 일치하는 아마존 데쉬 버튼이 클릭을 하면 특정 버튼이 클릭이 되었다고 출력됩니다. 

그리고 간단한 코딩을 해서 버튼이 눌리면 http 리퀘스트를 해서 특정 url을 호출하면 됩니다. 

from scapy.all import *
import requests
import time
MAGIC_FORM_URL = 'http://put-your-url-here'

def record_poop():
  data = {
    "Timestamp": time.strftime("%Y-%m-%d %H:%M"), 
    "Measurement": 'Poopy Diaper'
  }
  requests.post(MAGIC_FORM_URL, data)

def record_wake():
  data = {
    "Timestamp": time.strftime("%Y-%m-%d %H:%M"), 
    "Measurement": 'Woke from Sleep'
  }
  requests.post(MAGIC_FORM_URL, data)

def arp_display(pkt):
  timestamp = time.strftime("%Y-%m-%d %H:%M")
  if pkt[ARP].op == 1: #who-has (request)
    if pkt[ARP].psrc == '0.0.0.0': # ARP Probe
      if pkt[ARP].hwsrc == '74:75:48:5f:99:30': # Huggies        
        print "Pushed Huggies"
        record_poop()
      elif pkt[ARP].hwsrc == '10:ae:60:00:4d:f3': # Elements
        print "Pushed Elements"
        record_wake()
      else:
        print "ARP Probe from unknown device: " + pkt[ARP].hwsrc

print sniff(prn=arp_display, filter="arp", store=0, count=10)

예제 코드는 구글 닥스에 버튼을 누를 때마다 시간을 기록을 합니다. 


저는 딱히 어떤 용도로 사용할지는 생각이 나지는 않지만, 집에 몸이 불편하신 분이 있으면 집에서 하나 드리고 어떤 상황에서 누르라고 하면 폰으로 푸쉬가 오면 확인 할 수있으면 좋을 것 같습니다. 


화장실에 화장지가 없을 때 누르면 바로 신고 기능으로 사용해도 좋을 것 같구요. 


iot를 딱히 복잡하게 생각할 필요 없는 것 같습니다. 다음에는 Meteor로 간단하게 서비스를 만들어서 연동해보도록 하겠습니다. 




설정 및 스니핑 확인 영상




관련글:

마음에 드시면 아래 공감 버튼 꾹 눌러주세요!


저작자 표시 비영리
신고
Posted by KraZYeom