Skip to content

Instantly share code, notes, and snippets.

@frazei
Last active February 8, 2024 10:47
Show Gist options
  • Save frazei/c60615bc2ea44969e0488a928ba78afb to your computer and use it in GitHub Desktop.
Save frazei/c60615bc2ea44969e0488a928ba78afb to your computer and use it in GitHub Desktop.
Hacking Wildix WP600A

Hacking Wildix wp600a business phone

Intro

In teoria è l'equivalente di yealink t48u (oppure g?)

  • android 4.2.2
  • kernel 3.0.36+
  • build 47.145.7.450
  • Mali400
  • RockChip rk3066

Recovery System

  • if your phone is on, turn it off
  • press and hold the “Headset” button and turn on power (using power adapter or PoE)
  • release “Headset/Bluetooth” button after 5 seconds
  • the image “W” appears on the display and then the recovery menu

Volume-up e Volume-down servono per selezionare le voci (oppure i numeri sulla tastiera). Il tasto “Headset/Bluetooth” serve per fare invio.

Seriale

Si può accedere in seriale tramite i pin che si trovano sulla scheda e ci accoglie direttamente adb con l'utente root!

Nota Si può accedere in seriale sia al sistema quando è avviato normalmente, sia quando è in modalità Recovery. Le partizioni montate però sono diverse.

Backup

Il sistema è normalmente montato in sola lettura tranne per alcune cartelle. In particolare /mnt/sdcard corrisponde a quello che in Android è chiamato "Internal Memory".

Queste sono le varie partizioni della memoria e cosa contengono:

Nome Block Device Dimensione Mount point Type Accesso
misc /dev/block/mtdblock0 4Mb
kernel /dev/block/mtdblock1 8Mb
boot /dev/block/mtdblock2 32Mb
recovery /dev/block/mtdblock3 64Mb
backup /dev/block/mtdblock4 64Mb
info /dev/block/mtdblock5 128Mb /info ext4 rw
cache /dev/block/mtdblock6 128Mb /cache ext4
kpanic /dev/block/mtdblock7 4Mb
system /dev/block/mtdblock8 512Mb /system ext4 ro
vendor /dev/block/mtdblock9 512Mb /vendor ext4 ro
userdata /dev/block/mtdblock10 2.0Gb /data ext4 rw
user /dev/block/mtdblock11 3.8Gb /mnt/sdcard vfat rw

Per effettuare il backup su chiavetta usb ho trovato in giro qualche guida, comunque dicono di partire stampando le varie partizioni e salvandole una ad una (probabilmente inutile per alcune):

# stop
# cat /proc/mtd                                                 
dev:    size   erasesize  name
mtd0: 00400000 00004000 "misc"
mtd1: 00800000 00004000 "kernel"
mtd2: 02000000 00004000 "boot"
mtd3: 04000000 00004000 "recovery"
mtd4: 04000000 00004000 "backup"
mtd5: 08000000 00004000 "info"
mtd6: 08000000 00004000 "cache"
mtd7: 00400000 00004000 "kpanic"
mtd8: 20000000 00004000 "system"
mtd9: 20000000 00004000 "vendor"
mtd10: 80000000 00004000 "userdata"
mtd11: f6000000 00004000 "user"
# mkdir /mnt/usb_storage/backup
# dd if=/dev/mtd/mtd0 of=/mnt/usb_storage/backup/misc.img bs=4096
# dd if=/dev/mtd/mtd1 of=/mnt/usb_storage/backup/kernel.img bs=4096
# dd if=/dev/mtd/mtd2 of=/mnt/usb_storage/backup/boot.img bs=4096
# dd if=/dev/mtd/mtd3 of=/mnt/usb_storage/backup/recovery.img bs=4096
# dd if=/dev/mtd/mtd4 of=/mnt/usb_storage/backup/backup.img bs=4096
# dd if=/dev/mtd/mtd5 of=/mnt/usb_storage/backup/info.img bs=4096
# dd if=/dev/mtd/mtd6 of=/mnt/usb_storage/backup/cache.img bs=4096
# dd if=/dev/mtd/mtd7 of=/mnt/usb_storage/backup/kpanic.img bs=4096
# dd if=/dev/mtd/mtd8 of=/mnt/usb_storage/backup/system.img bs=4096
# dd if=/dev/mtd/mtd9 of=/mnt/usb_storage/backup/vendor.img bs=4096
# dd if=/dev/mtd/mtd10 of=/mnt/usb_storage/backup/userdata.img bs=4096
# start

Android root access

Per permettere ad android di ottenere i permessi di root è necessario sostituire su nella cartella /vendor/bin. Io l'ho sostituito con quello di SuperSU che ho scaricato da questa pagina.

# mount -o remount,rw /vendor
# cp su /vendor/bin/
# cp /vendor/bin/busybox /vendor/bin/busybox.bkp
# cp busybox /vendor/bin/

Tastiera

Dal log del kernel vedo che ci sono apparentemente 2 diversi chip che gestiscono i vari tasti fisici:

  • rk29-keypad as /devices/platform/rk29-keypad/input/input0
  • tca8418_keypad as /devices/platform/rk30_i2c.2/i2c-2/2-0034/input/input1

Per entrambi, lato Android, c'è un file di configurazione specifico:

  • /system/usr/keylayout/rk29-keypad.kl
  • /system/usr/keylayout/tca8418_keypad.kl

Posso vedere tutti gli eventi così:

# getevent                                                      
add device 1: /dev/input/event4
  name:     "Goodix Capacitive TouchScreen"
add device 2: /dev/input/event0
  name:     "rk29-keypad"
add device 3: /dev/input/event1
  name:     "tca8418_keypad"
add device 4: /dev/input/event3
  name:     "handset-hook"
add device 5: /dev/input/event2
  name:     "rk_headsetdet"

Premendo un qualsiasi tasto si vede da quale input arriva e quale segnale. Gli eventi sono in HEX, convertendoli in DEC ottengo il tasto giusto come indentificato nei file .kl. Questo è quello che succede quando premo il tasto volume-down:

/dev/input/event1: 0004 0004 00000002
/dev/input/event1: 0001 0072 00000001
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0004 0004 00000002
/dev/input/event1: 0001 0072 00000000
/dev/input/event1: 0000 0000 00000000

Infatti 0072 in HEX è 114 in DEC che è quello che trovo mappato in /system/usr/keylayout/tca8418_keypad.kl. In realtà lo trovo anche in rk29-keypad.kl ma l'unico tasto che risulta effettivamente proveniente da event0 è il primo in alto a destra contrassegnato dalle cuffie e il simbolo del bluetooth (che effettivamente è quello che serve anche per attivare il recovery quindi forse è collegato diversamente).

In teoria dovrei poter anche simulare la pressione di un tasto con il comando sendevent ma non riesco a farlo funzionare...

Posso però utilizzare il comando input per mandare un comando:

usage: input [text|keyevent]
  input text <string>
  input keyevent <event_code>
0 -->  "KEYCODE_0" 
1 -->  "KEYCODE_SOFT_LEFT" 
2 -->  "KEYCODE_SOFT_RIGHT" 
3 -->  "KEYCODE_HOME" 
4 -->  "KEYCODE_BACK" 
5 -->  "KEYCODE_CALL" 
6 -->  "KEYCODE_ENDCALL" 
7 -->  "KEYCODE_0" 
8 -->  "KEYCODE_1" 
9 -->  "KEYCODE_2" 
10 -->  "KEYCODE_3" 
11 -->  "KEYCODE_4" 
12 -->  "KEYCODE_5" 
13 -->  "KEYCODE_6" 
14 -->  "KEYCODE_7" 
15 -->  "KEYCODE_8" 
16 -->  "KEYCODE_9" 
17 -->  "KEYCODE_STAR" 
18 -->  "KEYCODE_POUND" 
19 -->  "KEYCODE_DPAD_UP" 
20 -->  "KEYCODE_DPAD_DOWN" 
21 -->  "KEYCODE_DPAD_LEFT" 
22 -->  "KEYCODE_DPAD_RIGHT" 
23 -->  "KEYCODE_DPAD_CENTER" 
24 -->  "KEYCODE_VOLUME_UP" 
25 -->  "KEYCODE_VOLUME_DOWN" 
26 -->  "KEYCODE_POWER" 
27 -->  "KEYCODE_CAMERA" 
28 -->  "KEYCODE_CLEAR" 
29 -->  "KEYCODE_A" 
30 -->  "KEYCODE_B" 
31 -->  "KEYCODE_C" 
32 -->  "KEYCODE_D" 
33 -->  "KEYCODE_E" 
34 -->  "KEYCODE_F" 
35 -->  "KEYCODE_G" 
36 -->  "KEYCODE_H" 
37 -->  "KEYCODE_I" 
38 -->  "KEYCODE_J" 
39 -->  "KEYCODE_K" 
40 -->  "KEYCODE_L" 
41 -->  "KEYCODE_M" 
42 -->  "KEYCODE_N" 
43 -->  "KEYCODE_O" 
44 -->  "KEYCODE_P" 
45 -->  "KEYCODE_Q" 
46 -->  "KEYCODE_R" 
47 -->  "KEYCODE_S" 
48 -->  "KEYCODE_T" 
49 -->  "KEYCODE_U" 
50 -->  "KEYCODE_V" 
51 -->  "KEYCODE_W" 
52 -->  "KEYCODE_X" 
53 -->  "KEYCODE_Y" 
54 -->  "KEYCODE_Z" 
55 -->  "KEYCODE_COMMA" 
56 -->  "KEYCODE_PERIOD" 
57 -->  "KEYCODE_ALT_LEFT" 
58 -->  "KEYCODE_ALT_RIGHT" 
59 -->  "KEYCODE_SHIFT_LEFT" 
60 -->  "KEYCODE_SHIFT_RIGHT" 
61 -->  "KEYCODE_TAB" 
62 -->  "KEYCODE_SPACE" 
63 -->  "KEYCODE_SYM" 
64 -->  "KEYCODE_EXPLORER" 
65 -->  "KEYCODE_ENVELOPE" 
66 -->  "KEYCODE_ENTER" 
67 -->  "KEYCODE_DEL" 
68 -->  "KEYCODE_GRAVE" 
69 -->  "KEYCODE_MINUS" 
70 -->  "KEYCODE_EQUALS" 
71 -->  "KEYCODE_LEFT_BRACKET" 
72 -->  "KEYCODE_RIGHT_BRACKET" 
73 -->  "KEYCODE_BACKSLASH" 
74 -->  "KEYCODE_SEMICOLON" 
75 -->  "KEYCODE_APOSTROPHE" 
76 -->  "KEYCODE_SLASH" 
77 -->  "KEYCODE_AT" 
78 -->  "KEYCODE_NUM" 
79 -->  "KEYCODE_HEADSETHOOK" 
80 -->  "KEYCODE_FOCUS" 
81 -->  "KEYCODE_PLUS" 
82 -->  "KEYCODE_MENU" 
83 -->  "KEYCODE_NOTIFICATION" 
84 -->  "KEYCODE_SEARCH" 
85 -->  "KEYCODE_MEDIA_PLAY_PAUSE"
86 -->  "KEYCODE_MEDIA_STOP"
87 -->  "KEYCODE_MEDIA_NEXT"
88 -->  "KEYCODE_MEDIA_PREVIOUS"
89 -->  "KEYCODE_MEDIA_REWIND"
90 -->  "KEYCODE_MEDIA_FAST_FORWARD"
91 -->  "KEYCODE_MUTE"
92 -->  "KEYCODE_PAGE_UP"
93 -->  "KEYCODE_PAGE_DOWN"
94 -->  "KEYCODE_PICTSYMBOLS"
...
122 -->  "KEYCODE_MOVE_HOME"
123 -->  "KEYCODE_MOVE_END"

Led

C'è un led blu che si può comandare:

# echo 255 > /sys/class/leds/led_msg/brightness
# echo 0 > /sys/class/leds/led_msg/brightness

In giro ho trovato riferimenti anche a led_lan e led_msg ma non sembrano essere effettivamente installati.

Display

Con lo stesso sistema sopra posso accendere e spegnere il display. Da quello che vedo usa lo stesso meccanismo un qualche script che fa partire lo screensaver.

# echo 255 > /sys/class/backlight/rk28_bl/brightness
# echo 0 > /sys/class/backlight/rk28_bl/brightness

Lanciare una app

Per lanciare una applicazione da ADB posso usare questo comando:

# monkey -p github.daneren2005.dsub 1

le applicazioni si trovano in /data/user/0 oppure in /data/app.

Boot Animation

L'animazione si trova in /system/media/bootanimation.zip che è su una partizione in read only. Quindi la devo rimontare in scrittura:

# mount -o remount,rw /system
# cd /system/media/
# mv bootanimation.zip bootanimation.zip.bkp
# cp /mnt/usb_storage/bootanimation.zip .
# chmod 644 bootanimation.zip

Per creare l'animazione ci sono alcune cose da tenere a mente:

  • il file zip deve essere compresso in livello "store" (ho usato 7zip per Windows)
  • dentro al file zip ci deve essere direttamente il contenuto e non la cartella "bootanimation"

È possibile testare l'animazione (senza riavviare il dispositivo) con il comando:

# bootanimation

Rotazione dello schermo

Purtroppo non riesco a fare in modo che il sistema ruoti in portrait, rimane sempre in landscape ma posso invertirlo a testa in giù:

# settings put system accelerometer_rotation 0
# settings put system user_rotation 3

Ho trovato anche un file di configurazione che dovrebbe gestire la rotazione ma non funziona come sperato, credo che ci sia qualcosa che lo ruota forzatamente dopo il boot. Comunque sarebbe questo:

    In the /system/build.prop file, modify or add the value of ro.sf.hwrotation
        0:Horizontal screen
        90:Portrait
        180:Reverse landscape
        270:Reverse portrait
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment