Alat akheron
ditulis dengan python dan dirancang untuk membantu memberikan visibilitas pada komunikasi antar-chip UART dan membantu dalam memahami, membalikkan, dan memanipulasi komunikasi tersebut untuk membedakan fungsionalitas perangkat (baik yang disengaja maupun tidak). Hal ini dilakukan dengan mendukung beberapa mode operasi:
Komunikasi antar-chip melalui UART masih merupakan pilihan desain umum yang ditemukan di banyak perangkat, dan tampilannya seperti ini:
+------------+ +------------+
| TXD +-------------------------->+ RXD |
| CHIP A | | CHIP B |
| RXD +<--------------------------+ TXD |
+------------+ +------------+
Dalam contoh ini, chip A mengirimkan data ke chip B dengan mengirimkan data keluar dari pin transmisi (TX) chip A dan chip B menerima data masuk tersebut pada pin penerima (RX). Chip B mengirimkan data keluar pin transmit (TX) untuk diterima oleh chip A pada pin penerima (RX) chip A.
Tapi apa sebenarnya yang mereka kirim bolak-balik satu sama lain?
Jika kita menjadikan diri kita mesin fisik di tengah, kita bisa mengetahuinya!
Alat akheron
dirancang untuk dijalankan pada sistem dengan dua port serial (adaptor USB-ke-serial boleh digunakan, selama OS sistem mendukungnya), bertindak sebagai proxy untuk mengirimkan lalu lintas antara kedua port tersebut. Sesuatu seperti ini:
^ + ^ +
| v | v
+---------------------------------+
| |TXD1 RXD1| |TXD2 RXD2| |
| +---------+ +---------+ |
| UART 1 UART 2 |
| |
| Machine-in-the-Middle |
| (running Akheron Proxy) |
| |
+---------------------------------+
Jika kita secara fisik memotong jejak komunikasi antara chip A dan chip B dan kemudian mengarahkannya ke port serial mesin di tengah, kita akan dapat melihat apa yang dikirimkan chip tersebut satu sama lain melalui komunikasi UART dengan akheron
:
+------------+ +------------+
| TXD +--------+ +------->+ RXD |
| CHIP A | | | | CHIP B |
| RXD +<-+ | | +--+ TXD |
+------------+ | | | | +------------+
| | | |
| v | v
+---------------------------------+
| |TXD1 RXD1| |TXD2 RXD2| |
| +---------+ +---------+ |
| UART 1 UART 2 |
| |
| Machine-in-the-Middle |
| (running Akheron Proxy) |
| |
+---------------------------------+
Dengan setup seperti itu, akheron
siap digunakan!
akheron
versi 0.1 adalah iterasi pertama dari upaya ini dan lahir dari kode pembuktian konsep. Ini adalah alat baris perintah, menggunakan REPL standar untuk interaksi.
Alat akheron
memerlukan Python 3.6 atau lebih baru, dan menggunakan perpustakaan pyserial
untuk berinteraksi dengan port serial sistem. Itu telah diuji pada macOS 10.15 dan Ubuntu 18.04.
pip install -r requirements.txt
Anda dapat memulai akheron
dari jendela terminal di direktori tingkat atas repo:
./akheron.py
Pada banyak sistem, akses ke perangkat serial dibatasi. Untuk menghindari menjalankan akheron
dengan hak istimewa yang lebih tinggi, pastikan akun pengguna Anda termasuk dalam grup yang sama dengan perangkat yang ingin Anda gunakan. Di Linux, perangkat serial kemungkinan besar merupakan anggota grup dialout
. Menambahkan akun pengguna Anda ke grup itu (misalnya sudo usermod -a -G dialout $USER
) akan memungkinkan Anda mengakses perangkat. Agar Anda dapat melihat perubahannya, Anda mungkin perlu keluar dan masuk kembali ke akun Anda, atau mungkin melakukan boot ulang sistem.
Setelah berjalan, Anda akan melihat spanduk dan perintah >
:
$ ./akheron.py
######################################################
Akheron Proxy, UART proxy tool for inter-chip analysis
version 0.1
######################################################
>
Sejumlah perintah tersedia pada prompt ini, yang dapat Anda akses dengan mengetikkan help
:
> help
Documented commands (type help <topic>):
========================================
capturedump checksumget delimset portget replaceset stop
capturestart checksumset help portset replay watch
capturestop delimget list replaceget start
Undocumented commands:
======================
exit quit version
Anda bisa mendapatkan bantuan lebih lanjut tentang perintah tertentu dengan mengetikkan help <command>
.
> list
/dev/ttyS0
/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2
/dev/ttyUSB3
Anda juga bisa mendapatkan daftar verbose:
> list -v
/dev/ttyS0
desc: ttyS0
hwid: PNP0501
/dev/ttyUSB0
desc: Quad RS232-HS
hwid: USB VID:PID=0403:6011 LOCATION=1-1:1.0
/dev/ttyUSB1
desc: Quad RS232-HS
hwid: USB VID:PID=0403:6011 LOCATION=1-1:1.1
/dev/ttyUSB2
desc: Quad RS232-HS
hwid: USB VID:PID=0403:6011 LOCATION=1-1:1.2
/dev/ttyUSB3
desc: Quad RS232-HS
hwid: USB VID:PID=0403:6011 LOCATION=1-1:1.3
Langkah-langkah berikut akan meneruskan lalu lintas antar port, 'mengawasinya', lalu menghentikan penerusan lalu lintas:
> portset A /dev/ttyUSB1 115200
> portset B /dev/ttyUSB2 115200
> start
Data now PASSING between ports "/dev/ttyUSB1" <-> "/dev/ttyUSB2"...
> watch
Watching data passed between ports. Press CTRL-C to stop...
A -> B: 0x61 0x61 0x73 0x73 0x64 0x64
B -> A: 0x31 0x32 0x33 ^C
Watch mode exited.
> stop
Data now BLOCKED between ports "/dev/ttyUSB1" <-> "/dev/ttyUSB2".
>
Ini adalah alur yang sama, tetapi dengan pembatas awal pesan 0x37
yang disetel:
> portset A /dev/ttyUSB1 115200
> portset B /dev/ttyUSB2 115200
> delimset start 0x37
> start
Data now PASSING between ports "/dev/ttyUSB1" <-> "/dev/ttyUSB2"...
> watch
Watching data passed between ports. Press CTRL-C to stop...
A -> B: 0x37 0x71 0x77 0x65 0x65 0x72
0x37 0x64 0x66 0x61 0x64
0x37 0x73
0x37 0x68 0x68
B -> A: 0x37 0x6e 0x6d 0x62
0x37 0x69 0x69
A -> B: 0x37 0x61 0x73 0x64 ^C
Watch mode exited.
> stop
Data now BLOCKED between ports "/dev/ttyUSB1" <-> "/dev/ttyUSB2".
>
Langkah-langkah berikut akan meneruskan lalu lintas antar port, menangkapnya ke file, menontonnya, lalu menghentikan dan membuang konten pengambilan, lalu menghentikan penerusan lalu lintas:
> portset A /dev/ttyUSB1 115200
> portset B /dev/ttyUSB2 115200
> start
Data now PASSING between ports "/dev/ttyUSB1" <-> "/dev/ttyUSB2"...
> capturestart mycap.out
Saving captured traffic to "mycap.out"...
> watch
Watching data passed between ports. Press CTRL-C to stop...
A -> B: 0x31 0x32 0x33
B -> A: 0x33 0x32 0x31
A -> B: 0x20 0x20 0x20
B -> A: 0x36 0x36 0x37 0x38 0x39 ^C
Watch mode exited.
> capturestop
Capture stopped
> capturedump mycap.out
1: A -> B: 0x31 0x32 0x33
2: B -> A: 0x33 0x32 0x31
3: A -> B: 0x20 0x20 0x20
4: B -> A: 0x36 0x36 0x37 0x38 0x39
> stop
Data now BLOCKED between ports "/dev/ttyUSB1" <-> "/dev/ttyUSB2".
>
Langkah-langkah berikut menunjukkan penerusan lalu lintas antar port dengan pemutaran ulang data (dalam contoh ini, file pengambilan yang berisi satu baris) dalam urutan ini:
0x64 0x61
dengan 0x99 0x91
dan memutar ulang (perhatikan data pengganti di output)Checksum8Modulo256Plus1
dari byte sebelumnya dan putar ulang > portset A /dev/ttyUSB1 115200
> portset B /dev/ttyUSB2 115200
> start
Data now PASSING between ports "/dev/ttyUSB1" <-> "/dev/ttyUSB2"...
> replay /tmp/aaa
Replaying data from A -> B, press CTRL-C to exit watch mode...
A -> B: 0x61 0x73 0x64 0x61 0x73 0x64 ^C
Watch mode exited.
> replaceset A 0x64 0x61 -> 0x99 0x91
> replaceget
Replace port A pattern X -> pattern Y:
0x64 0x61 -> 0x99 0x91
Replace port B pattern X -> pattern Y:
> replay /tmp/aaa
Replaying data from A -> B, press CTRL-C to exit watch mode...
A -> B: 0x61 0x73 0x99 0x91 0x73 0x64 ^C
Watch mode exited.
> checksumset A 3
> checksumget
Replace on port A using checksum 'Checksum8Modulo256Plus1'
No replace checksum specified on port B
> replay /tmp/aaa
Replaying data from A -> B, press CTRL-C to exit watch mode...
A -> B: 0x61 0x73 0x99 0x91 0x73 0x72 ^C
Watch mode exited.
> stop
Data now BLOCKED between ports "/dev/ttyUSB1" <-> "/dev/ttyUSB2".
>