Hacking Hardware to talk with Android

Can we make that toaster talk with Android?

Vlatko Kosturjak (@k0st) and Dobrica Pavlinusic (@dpavlin) Droidcon Zagreb, 28th of April, 2016

Agenda

  • Introduction
  • Should I develop hardware at all?
  • Where to start?
  • Hardware communication
  • Accessory Development Kit (ADK)
  • Demos
  • Summary
  • Questions and answers

45 minutes

Kost: About me

  • Security Consultant in Diverto
  • Linux and FLOSS enthusiast
  • Open source developer
  • Android "developer" since 2010
    • started counting from first Market app
    • mostly focused on NDK and ADK

About us in pictures


About us in pictures

Dobrica: about me

  • System administrator at Library (FFZG)
  • Free Software Biggot
  • Hacking Hardware
    • http://blog.rot13.org/
    • http://www.rot13.org/~dpavlin/

Should I develop hardware at all?

  • It depends :)
  • Basic sensor data
    • Ambient Temperature
    • Humidity
    • Accelerometers
  • Other sensors / usage
    • Wind speed
    • Pyro
    • SCADA

Example: Sensors Web Logger

Example: Sensors Web logger


Where to start?

  • final goal
  • user experience
  • speed of communication
  • communication security

Basic hardware kit needed


Links on AliExpress/Bangood

  • We're lazy - thanks Ivan Voras
    • Soldering: http://goo.gl/ePG7Ni
    • Voltmeter: http://goo.gl/J57z7N
    • Osciloscope: http://goo.gl/HKuCbP
    • Logic probe: http://goo.gl/rbWxJS
    • Power source: http://goo.gl/76dPqO
    • Arduinos: http://goo.gl/63pTE2

Useful hardware devices

  • Beside that - we would recommend
    • BusPirate
    • TTL serial cable
  • Actually you don't need TTL
    • if you have BusPirate

Bus Pirate


Logic Analyzer


Communication

  • Wireless
  • Bluetooth
  • NFC
  • USB
  • Serial
  • ...

Wireless

  • Frequency
    • 2.4 Ghz
    • 5 Ghz
  • Standard wireless thing
    • Access Point
    • STA / clients
    • ad hoc*
    • mesh*

Useful wireless tools for reversing

  • Obtaining
    • Kismet
    • Aircrack-ng suite
    • tcpdump on device
  • Analysing
    • wireshark
    • tshark
    • moloch (heavy duty!)
    • pcap bindings for your favourite language
    • good hex editor and calculator

Daugther was crazy about RC cars


She lost interest, daddy got it


It's daddy toy


Basic protocol analysis


Few quick tips

  • GUI is useful for quick analysis
  • text is good for finding patterns
char peer0_0[] = {
0xa1, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 
0xff, 0xa1, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x7b, 0xff };
tshark -r pcap1.pcap -T fields -e data

Wireless protocol reversing example

tshark -r pcap1.pcap -T fields -e data | grep a17 | less
a17b8e0000000009ff
a17b8e0000000009ff
a17b8e0000000009ff
a17b00000000007bff
a17b00000000007bff
a17b00000000007bff

Demo time!

Let's pray to the demo gods

Interesting part

She wants it back now :)

Bluetooth

  • 2.4 Ghz
  • Modes
    • Server
    • Client
  • References
    • https://developer.android.com/guide/topics/connectivity/bluetooth.html

Bluetooth Analysis

  • It is possible with plugin
  • Dump and analysis
    • bluez tools
    • ubertooth one
    • spectrum analyzer (very low level)
    • gnu radio and sdr (very low level)
  • References
    • http://ubertooth.sourceforge.net/

Bluetooth and PhoneGap

  • It is possible with plugin
  • Modes
    • Server
    • Client
  • References
    • https://github.com/don/BluetoothSerial

NFC

  • 13.56 Mhz
  • Near Field Communication
  • Mifare not supported on newer Androids
    • If it is Mifare Classic - you're lucky! ;)
    • reversing/analysing/cracking easy
    • except it does not work on Android very well

You tag might not be NFC

  • 135 khz
  • Alternative frequency and protocol
  • Usually doors and access control systems
    • Just ID
    • No encryption
    • IT does NOT work on Android very well

USB

  • own device driver
  • serial device
  • HID device
  • storage device
  • ADB device

Debugging

  • ADB over TCP/IP
  • second USB port
  • USB hub
  • Toast Messages
  • printk()

ADB over TCP/IP

  • TCP port 5555
  • adb example
  • Security implications

ADB over TCP

  • Usually hidden from Setting UI
  • Usually does not need root
su
setprop service.adb.tcp.port 5555
stop adbd
start adbd
adb tcpip 5555
adb connect 192.168.0.101:5555
  • Last one - if you have ADB USB already

Own device driver

  • Hardware dependant
    • kernel compatibility
    • binary compatibility
  • Specific cases
    • Speed

Accessory Development Kit

  • Officialy supported
    • Bluetooth
    • USB
  • Protocol
    • Android Open Acessory(AOA) protocol.

Simple ADK demo board


Serial

  • Root is not needed
  • Integrated in Android API
  • Good frameworks on top of API
  • Android 3.1+
  • References
    • https://developer.android.com/guide/topics/connectivity/usb/index.html
    • https://stackoverflow.com/questions/21800932/comunicating-with-serial-usb-device-over-android

Android Serial Driver Library

  • driver library for communication with USB serial hardware
  • Using host API (Android 3.1+)
  • USB host serial driver library for CDC, FTDI, Arduino and other devices
  • References
    • https://github.com/mik3y/usb-serial-for-android/
    • https://stackoverflow.com/questions/21800932/comunicating-with-serial-usb-device-over-android

Simple serial example

sbSerialPort port = driver.getPort(0);
port.open(connection);
try {
  port.setBaudRate(115200);
  byte buffer[] = new byte[16];
  int numBytesRead = port.read(buffer, 1000);
  Log.d(TAG, "Read " + numBytesRead + " bytes.");
} catch (IOException e) {
} finally {
  port.close();
}

PhoneGap/Cordova

  • It is possible to talk serial
  • Works only on android
  • References
    • https://github.com/xseignard/cordovarduino
    • http://dynamicremo.blogspot.hr/2015/07/simple-serial-communication-app-using.html

Simple example

  • Install cordova
  • Install platform and plugin
cordova platform add android
cordova plugin add https://github.com/xseignard/cordovarduino.git
cordova run android --device
  • Start communicating with serial port

Sample code

$(document).ready(function(){
 $("#connect_button").click(function(){
  serial.requestPermission(
   function success(){
    // BaudRate for many Chips: 115200, Sometimes arduino: 9600 
    var opts = {"baudRate":115200, "dataBits":8, "stopBits":1, "parity":0, "dtr":false}
    serial.open(opts, 
     function success(){
      alert("Success");
     }, function error(evt){
      alert("Error");
     }
    );
   },
   function error(evt){
    alert("Error");
   }
  );
 });
});

Multimeter


Multimeter communication analysis

  • Multimeter have serial communication
  • Basic serial communication reversing
    • Looking at the product specification
    • Looking at the similar products specs
    • If not, basic baud rate "brute" guessing
    • as well as other parameters (stop bit, etc)
  • Getting as much communication as possible
    • how it looks like in different states
    • find patterns and differences

Multimeter communication

  • Only receive serial communication
  • Serial communication
    • 2400 bps
    • 8 bits
    • 1 stop bit
    • No Parity
  • Packet pattern
    • 14 byte packets with 0D0A on the end
    • First few bytes - the value, other bit flags

Multimeter Android App

  • What if I can get readings on Android
  • Features
    • get nice graph (1 channel logic analyzer)
    • export values to CSV
    • take picture with camera on spike (with OSD)
  • Proof of concept
    • Android App using mik3y serial library
    • Drawing graphs using Android Plot

Demo time!

Let's pray to the demo gods

Multimeter App PoC


Summary

  • Do you just need specific sensors?
  • Reusing components
    • Find device with similar functionality
    • Add missing functionality
  • USB
    • prefer standard communication like serial
    • ADB over TCP/IP
  • Have fun!

Thanks on listening

?

Any questions?

Made with Slides.com