Τρίτη 24 Μαΐου 2011

USB Reverse engineering με virtualbox και usbmon

Στις μέρες μας η πιο διαδεδομένη μορφή συνδεσιμότητας για περιφερειακές συσκευές είναι ο USB (Universal Serial Bus - Οικουμενικός Σειριακός Δίαυλος). Πολλές φορές, διάφορες χρήσιμες  / ενδιαφέρουσες USB συσκευές έρχονται με υποστήριξη μόνο για windows, οπότε η ικανότητα να μπορεί κάποιος να καταλάβει τον τρόπο λειτουργίας τους (reverse engineering) και να τις κάνει να υποστηρίζονται στο Linux είναι αρκετά σημαντική για κάθε επίδοξο "Linux ninja".

Σε αυτό το post θα δούμε την τυπική διαδικασία, με αφορμή την υποστήριξη του "one touch backup" button σε ένα usb sata/ide combo adaptor (θα ακολουθήσει σχετικό post με περισσότερες λεπτομέρειες).

Τα κύρια πακέτα full virtualization που δουλεύουν στο Linux αυτή τη στιγμή (Qemu/KVM, Virtualbox, VMWare) παρέχουν δυνατότητα "usb pass-through", δηλαδή ανάθεσης πραγματικών συσκευών σε μία εικονική μηχανή για να της "οδηγήσει" αυτή. Οι περισσότερες συσκευές συνεργάζονται μια χαρά με αυτή τη λειτουργία, ενώ αναμένονται και βελτιώσεις (υποστήριξη ακόμα περισσότερων συσκευών) σύντομα, λόγω καλύτερης υποστήριξης γι αυτό το σενάριο στους πρόσφατους πυρήνες.

Ο στόχος μας είναι να παρατηρήσουμε την αλληλεπίδραση του windows driver / προγράμματος υποστήριξης με τη συσκευή, ώστε να μπορέσουμε να αναπαράγουμε τις απαιτούμενες ενέργειες για τη λειτουργία της και στο Linux.

Ξεκινάμε από μία εικονική μηχανή με Windows XP στο VirtualBox. Δεν θα περιγράψω τον τρόπο δημιουργίας της καθώς υπάρχουν ήδη εξαιρετικοί διαθέσιμοι οδηγοί (π.χ., εδώ και εδώ).

Το επόμενο βήμα είναι να ρυθμίσουμε την υποστήριξη για USB συσκευές.


 Επιλέγουμε το Windows VM μας και πατάμε "Settings" όπως στο παραπάνω screenshot. Από εκεί επιλέγουμε "USB" και βεβαιωνόμαστε ότι τα checkboxes "Enable USB Controller" και "Enable USB 2.0 (EHCI) Controller" είναι τικαρισμένα.


Τώρα μπορούμε να εγκαταστήσουμε το συνοδευτικό software της συσκευής στην εικονική μηχανή. Για να το κάνουμε αυτό μπορούμε απλά να αναθέσουμε το συνοδευτικό CD της συσκευής στο virtualbox όπως φαίνεται στο screenshot:



Μετά την εγκατάσταση των drivers / support software για windows στην εικονική μηχανή, είναι πλέον ώρα να ασχοληθούμε με το tracing καθεαυτό. Η πρώτη μας κίνηση είναι να συνδέσουμε τη συσκευή μας στον υπολογιστή που φιλοξενεί την εικονική μηχανή και να βρούμε σε ποιο bus είναι συνδεδεμένη η συσκευή μας τρέχοντας την εντολή lsusb.

Το αποτέλεσμα εικονίζεται παρακάτω. Βλέπουμε ότι η συσκευή μας βρίσκεται στο bus 2.



Το επόμενο βήμα είναι να ξεκινήσουμε το tracing. Τη δουλειά του tracing την κάνει το kernel module usbmon, το οποίο εξάγει τα δεδομένα του μέσω του συστήματος αρχείων debugfs. Στις νεότερες διανομές όπως το ubuntu maverick, τα πάντα έχουν ρυθμιστεί ήδη οπότε δε χρειάζεται να ανησυχούμε για τίποτα και μπορούμε να ξεκινήσουμε το tracing κατευθείαν:

 cat /sys/kernel/debug/usb/usbmon/2u > jm20338.txt

Αφήνουμε το cat να τρέχει και "συνδέουμε" εικονικά τη συσκευή μας στο virtualbox κάνοντας κλικ στο σχετικό εικονίδιο όπως φαίνεται παρακάτω:



Αυτό θα έχει ως συνέπεια στο tracing να δούμε τα πάντα, συμπεριλαμβανόμενης της πολύ σημαντικής πολλές φορές διαδικασίας αρχικοποίησης της συσκευής. Τώρα μπορούμε να χρησιμοποιήσουμε τη συσκευή και όταν θέλουμε να σταματήσουμε το tracing απλά πάμε στο παράθυρο με το "cat" και πατάμε Ctrl+C.

Καλή συμβουλή είναι να παράγουμε όχι ένα μεγάλο log αλλά πολλά μικρά, όπου κάθε ένα να έχει μόνο μία καλά ορισμένη λειτουργία (π.χ., για μία συσκευή με πολλά κουμπιά μπορούμε να έχουμε ένα log ανά κουμπί). Αυτό θα κάνει την εργασία της κατανόησης / ερμηνείας των logs πολύ ευκολότερη.

Αντί για το 'cat', μπορούμε να χρησιμοποιήσουμε και το γνωστό σε πολλούς (από το network debugging / security) εργαλείο wireshark, το οποίο στις πρόσφατες εκδόσεις του υποστηρίζει usb sniffing. Δυστυχώς στο ubuntu χρειάζεται να το τρέξουμε ως root αν δε θέλουμε να μπούμε στη διαδικασία να το στήσουμε σωστά, με τις απαραίτητες άδειες και capabilities κλπ:

sudo wireshark

Στην κεντρική του οθόνη διαλέγουμε Capture -> Interfaces και καταλήγουμε σε μια οθόνη που μοιάζει κάπως έτσι:


Από όπου η συνέχεια είναι προφανής. Το wireshark έχει το πλεονέκτημα ότι κάνει και αποκωδικοποίηση για ορισμένα πρωτόκολλα όπως π.χ., usb mass storage, αν και κάποιες
φορές τα αποτελέσματα της αποκωδικοποίησης που κάνει είναι λάθος, ειδικά σε περιπτώσεις "περίεργων" συσκευών που δεν εφαρμόζουν τα πρότυπα.

Το κομμάτι της κατανόησης / ερμηνείας φυσικά είναι το πιο δύσκολο και χρονοβόρο, αλλά υπάρχουν και γι αυτό πολλά βοηθητικά εργαλεία που μπορούν να κάνουν τη ζωή μας ευκολότερη όπως π.χ.,

Καθώς και πολύ δημόσια διαθέσιμο documentation σχετικά με USB protocols, SCSI κλπ.

Ακόμα και αν δεν έχουμε τις γνώσεις / δεξιότητες για να κατανοήσουμε τα logs οι ίδιοι, μπορούμε να τα στείλουμε σε κάποιον που γνωρίζει λίγο περισσότερα και έτσι να συνεισφέρουμε στην ταχύτερη υλοποίηση της υποστήριξης της συσκευής μας. Επίσης, εκτός από reversing, τα logs του usbmon μπορεί να χρησιμοποιηθούν και για debugging και είναι κάτι που θα μας ζητηθεί αρκετές φορές αν αναφέρουμε προβλήματα στη λίστα linux-usb.

Καλό reversing :)

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου