Unpacking UBIFS

From Indonesian Research And Development Center
Jump to: navigation, search

Pendahuluan

Tutorial singkat ini akan membahas salah satu cara yang dapat ditempuh untuk mengekstrak filesystem UBIFS (Unsorted Block Image File System). Adapun contoh yang digunakan pada tutorial ini adalah UBIFS yang digunakan pada firmware kamera sport buatan xiaoyi. Aplikasi yang akan digunakan untuk melihat informasi dan melakukan ekstraksi UBIFS adalah ubi_reader yang merupakan kumpulan skrip dalam bahasa python.


Langkah-langkah

  • Aplikasi ubi_reader memerlukan modul python-lzo. Jika distro linux yang Anda gunakan belum memilikinya, maka Anda perlu melakukan instalasi modul tersebut. Berikut ini adalah cara melakukan instalasinya pada distro Ubuntu:
$ sudo apt-get install python-lzo
  • Jika Anda menggunakan distro Fedora, maka gunakan cara seperti ini:
% sudo dnf install python-lzo
  • Lanjutkan dengan melakukan kloning repositori ubi_reader menggunakan git:
% git clone https://github.com/jrspruitt/ubi_reader.git
  • Pindah ke sub direktori ubi_reader dan lakukan instalasi:
% cd ubi_reader
% sudo python setup.py install
  • Setelah proses instalasi ubi_reader selesai, lanjutkan dengan mengunduh informasi firmware update xiaoyi yang akan digunakan (XXXXXXXXXXXXXXX pada tautan di bawah adalah nomor seri dari kamera xiaoyi):
% curl -s 'http://sportsapi.xiaoyi.com/firmware/download?serialNumber=XXXXXXXXXXXXXXX'
{"md5Code":"c20c0bc925ef7a534ed93adda34038c9","firmwareMemo":"修复 APP进行文件操作时,相机自动关机的问题。", \
 "firmwareUrl":"https://cdn.fds-ssl.api.xiaomi.com/yifirmware/1442900911106_fw.bin?GalaxyAccessKeyId=5111728330873& \
 Expires=1758520181370&Signature=qp0jUHSRJvPahEh7VQyas671Qfo=","hardwareCode":"23L","firmwareCode":"1.2.13", \
 "firmwareSize":46065664,"uploadTime":"2015-09-22 05:46:00","code":20000,"originMd5Code":"c20c0bc925ef7a534ed93adda34038c9"}
  • Anda dapat pula menggunakan aplikasi jq untuk melihat informasi di atas dalam format JSON yang lebih mudah untuk dibaca seperti ini:
% curl -s 'http://sportsapi.xiaoyi.com/firmware/download?serialNumber=XXXXXXXXXXXXXXX' | jq '.'
{
  "md5Code": "c20c0bc925ef7a534ed93adda34038c9",
  "firmwareMemo": "修复 APP进行文件操作时,相机自动关机的问题。",
  "firmwareUrl": "https://cdn.fds-ssl.api.xiaomi.com/yifirmware/1442900911106_fw.bin?GalaxyAccessKeyId=5111728330873&Expires=1758520181370&Signature=qp0jUHSRJvPahEh7VQyas671Qfo=",
  "hardwareCode": "23L",
  "firmwareCode": "1.2.13",
  "firmwareSize": 46065664,
  "uploadTime": "2015-09-22 05:46:00",
  "code": 20000,
  "originMd5Code": "c20c0bc925ef7a534ed93adda34038c9"
}
  • Unduh firmware terbaru berdasarkan informasi di atas dengan cara seperti ini:
% wget -O 1442900911106_fw.bin "https://cdn.fds-ssl.api.xiaomi.com/yifirmware/1442900911106_fw.bin?GalaxyAccessKeyId=5111728330873&Expires=1758520181370&Signature=qp0jUHSRJvPahEh7VQyas671Qfo="
  • Setelah firmware tersebut selesai diunduh, lanjutkan dengan proses ekstraksi menggunakan binwalk:
% binwalk -e 1442900911106_fw.bin
  • Hasil ekstraksi menggunakan binwalk akan disimpan pada sub direktori _1442900911106_fw.bin.extracted. Pindah ke sub direktori tersebut:
% cd _1442900911106_fw.bin.extracted
  • Image filesystem UBI yang akan diekstrak adalah berkas dengan nama 136E100.ubi. Untuk menampilkan informasi mengenai image tersebut, gunakan perintah seperti ini:
% ubireader_display_info 136E100.ubi
Hasilnya adalah sebagai berikut:
UBI File
---------------------
    Min I/O: 512
    LEB Size: 129024
    PEB Size: 131072
    Total Block Count: 196
    Data Block Count: 194
    Layout Block Count: 2
    Internal Volume Block Count: 0
    Unknown Block Count: 0
    First UBI PEB Number: 1

    Image: 276138174
    ---------------------
        Image Sequence Num: 276138174
        Volume Name:pref
        Volume Name:linux
        PEB Range: 0 - 195

        Volume: pref
        ---------------------
            Vol ID: 1
            Name: pref
            Block Count: 13

            Volume Record
            ---------------------
                alignment: 1
                crc: 1645620514
                data_pad: 0
                errors:
                flags: autoresize
                name: pref
                name_len: 4
                padding:
                rec_index: 1
                reserved_pebs: 33
                upd_marker: 0
                vol_type: dynamic


        Volume: linux
        ---------------------
            Vol ID: 0
            Name: linux
            Block Count: 181

            Volume Record
            ---------------------
                alignment: 1
                crc: 3245251379
                data_pad: 0
                errors:
                flags: 0
                name: linux
                name_len: 5
                padding:
                rec_index: 0
                reserved_pebs: 277
                upd_marker: 0
                vol_type: dynamic
  • Ekstrak image UBIFS tersebut menggunakan perintah berikut ini:
% ubireader_extract_images 136E100.ubi
  • Hasil ekstraksi akan disimpan pada sub direktori ubifs-root/136E100.ubi. Pindah ke sub direktori tersebut:
% cd ubifs-root/136E100.ubi
  • Terdapat 2 berkas pada sub direktori tersebut, yaitu img-276138174_vol-linux.ubifs dan img-276138174_vol-pref.ubifs. Berkas yang selanjutnya akan diekstrak adalah img-276138174_vol-linux.ubifs. Gunakan perintah berikut ini:
% ubireader_extract_files img-276138174_vol-linux.ubifs
  • Hasil dari perintah di atas akan disimpan pada sub direktori ubifs-root. Berikut ini adalah isi dari sub direktori tersebut:
% ls ubifs-root
bin  dev  etc  home  lib  linuxrc  mnt  oem  opt  pref  proc  root  sbin  sys  tmp  usr  var
  • Berikut ini adalah daftar berkas dari setiap direktori tanpa symlink:
.
├── bin
│   └── busybox
├── dev
│   └── pts
├── etc
│   ├── br-version
│   ├── cherokee.conf
│   ├── fstab
│   ├── group
│   ├── hostname
│   ├── hosts
│   ├── init.d
│   │   ├── rcS
│   │   ├── S00bsp
│   │   ├── S10mdev
│   │   ├── S20urandom
│   │   ├── S40network
│   │   ├── S50service
│   │   ├── S52wifi
│   │   └── S60postservice
│   ├── inittab
│   ├── inputrc
│   ├── issue
│   ├── ld.so.cache
│   ├── ld.so.conf
│   ├── ld.so.conf.d
│   ├── libnl
│   │   ├── classid
│   │   └── pktloc
│   ├── mdev.conf
│   ├── network
│   │   ├── if-down.d
│   │   ├── if-post-down.d
│   │   ├── if-pre-up.d
│   │   ├── if-up.d
│   │   └── interfaces
│   ├── passwd
│   ├── protocols
│   ├── random-seed
│   ├── services
│   ├── shadow
│   ├── ssl
│   │   ├── certs
│   │   ├── misc
│   │   │   ├── CA.pl
│   │   │   ├── CA.sh
│   │   │   ├── c_hash
│   │   │   ├── c_info
│   │   │   ├── c_issuer
│   │   │   ├── c_name
│   │   │   └── tsget
│   │   ├── openssl.cnf
│   │   └── private
│   └── TZ
├── home
│   ├── default
│   └── ftp
├── lib
│   ├── ld-2.17.so
│   ├── libc-2.17.so
│   ├── libcrypt-2.17.so
│   ├── libdl-2.17.so
│   ├── libgcc_s.so.1
│   ├── libipc.so.1
│   ├── libiw.so.29
│   ├── libm-2.17.so
│   ├── libnsl-2.17.so
│   ├── libnss_dns-2.17.so
│   ├── libnss_files-2.17.so
│   ├── libpthread-2.17.so
│   ├── libresolv-2.17.so
│   ├── librt-2.17.so
│   ├── libutil-2.17.so
│   └── modules
│       └── 2.6.38.8
│           ├── kernel
│           │   ├── crypto
│           │   │   └── sha256_generic.ko
│           │   └── net
│           │       ├── bluetooth
│           │       │   └── bluetooth.ko
│           │       ├── mac80211
│           │       └── wireless
│           ├── modules.alias
│           ├── modules.alias.bin
│           ├── modules.builtin
│           ├── modules.builtin.bin
│           ├── modules.ccwmap
│           ├── modules.dep
│           ├── modules.dep.bin
│           ├── modules.devname
│           ├── modules.ieee1394map
│           ├── modules.inputmap
│           ├── modules.isapnpmap
│           ├── modules.ofmap
│           ├── modules.order
│           ├── modules.pcimap
│           ├── modules.seriomap
│           ├── modules.softdep
│           ├── modules.symbols
│           ├── modules.symbols.bin
│           ├── modules.usbmap
│           └── updates
│               ├── compat
│               │   ├── compat.ko
│               │   ├── sch_codel.ko
│               │   └── sch_fq_codel.ko
│               ├── drivers
│               │   ├── bluetooth
│               │   │   ├── btmrvl_sdio.ko
│               │   │   ├── btsdio.ko
│               │   │   └── hci_uart.ko
│               │   └── net
│               │       └── wireless
│               │           └── brcm80211
│               │               ├── brcmfmac
│               │               │   └── brcmfmac.ko
│               │               └── brcmutil
│               │                   └── brcmutil.ko
│               └── net
│                   ├── bluetooth
│                   │   ├── bluetooth.ko
│                   │   ├── bnep
│                   │   │   └── bnep.ko
│                   │   ├── hidp
│                   │   │   └── hidp.ko
│                   │   └── rfcomm
│                   │       └── rfcomm.ko
│                   ├── mac80211
│                   │   └── mac80211.ko
│                   └── wireless
│                       ├── cfg80211.ko
│                       ├── lib80211_crypt_ccmp.ko
│                       ├── lib80211_crypt_tkip.ko
│                       ├── lib80211_crypt_wep.ko
│                       └── lib80211.ko
├── mnt
├── oem
├── opt
├── pref
├── proc
├── root
├── sbin
│   └── iwconfig
├── sys
├── tmp
│   ├── ldconfig
│   │   └── aux-cache
│   └── lib
├── usr
│   ├── bin
│   │   ├── amba_mq_handler
│   │   ├── AmbaOnDemandRTSPServer
│   │   ├── amba_qrconfig
│   │   ├── AmbaStreamSVC
│   │   ├── bandwidth-arm
│   │   ├── boot_done
│   │   ├── cgiBridge
│   │   ├── client_example_receive
│   │   ├── client_example_send
│   │   ├── example_framer
│   │   ├── fusermount
│   │   ├── hostapd
│   │   ├── hostapd_autochannel_retartchip
│   │   ├── hostapd_cli
│   │   ├── i_example_util
│   │   ├── iperf
│   │   ├── libambastoragenotifier_test
│   │   ├── libambastream_test
│   │   ├── lnxfio_stream_ln_test
│   │   ├── lu_example_util
│   │   ├── lu_lnxfio_stream
│   │   ├── network_message_daemon
│   │   ├── ombra
│   │   ├── openssl
│   │   ├── SendToItron
│   │   ├── strace
│   │   ├── vffs
│   │   ├── wpa_cli
│   │   └── wpa_supplicant
│   ├── lib
│   │   ├── cgi-bin
│   │   │   ├── cgi
│   │   │   └── video.cgi
│   │   ├── libamba_msg_framework.so.1
│   │   ├── libambastoragenotifier.so.1
│   │   ├── libambastream.so.1
│   │   ├── libcrypto.so.1.0.0
│   │   ├── libev.so.4.0.0
│   │   ├── libfuse.so.2.8.7
│   │   ├── libjson.so.0.0.1
│   │   ├── libmsgprocess.so.2
│   │   ├── libnl
│   │   │   └── cli
│   │   │       ├── cls
│   │   │       │   ├── basic.so.0.0.0
│   │   │       │   └── cgroup.so.0.0.0
│   │   │       └── qdisc
│   │   │           ├── bfifo.so.0.0.0
│   │   │           ├── blackhole.so.0.0.0
│   │   │           ├── htb.so.0.0.0
│   │   │           └── pfifo.so.0.0.0
│   │   ├── libnl-3.so.200
│   │   ├── libnl-cli.so.3.0.0
│   │   ├── libnl-genl-3.so.200
│   │   ├── libnl-genl.so.3.0.0
│   │   ├── libnl-nf.so.3.0.0
│   │   ├── libnl-route.so.3.0.0
│   │   ├── libnl.so.3.0.0
│   │   ├── libpkgencap.so.1
│   │   ├── libssl.so.1.0.0
│   │   ├── libstdc++.so.6.0.17
│   │   ├── libzbar.so.0.2.0
│   │   └── libz.so.1.2.5
│   ├── local
│   │   ├── bcmdhd
│   │   │   ├── bcmdhd.ko
│   │   │   ├── fw_apsta.bin
│   │   │   ├── nvram.txt
│   │   │   ├── wl
│   │   │   ├── wpa_cli
│   │   │   └── wpa_supplicant
│   │   ├── precap_clips
│   │   │   ├── precap-1.ts
│   │   │   ├── precap-2.ts
│   │   │   ├── precap-3.ts
│   │   │   ├── precap-4.ts
│   │   │   ├── precap-5.ts
│   │   │   ├── precap-6.ts
│   │   │   ├── precap-7.ts
│   │   │   └── precap-8.ts
│   │   └── share
│   │       └── script
│   │           ├── amba.html
│   │           ├── amba_reconnection.sh
│   │           ├── ambernation.sh
│   │           ├── APManager
│   │           ├── app_ble
│   │           ├── app_hh
│   │           ├── app_manager
│   │           ├── ap.sh
│   │           ├── ap_start_backup_before_wl_clean.sh
│   │           ├── ap_start_old.sh
│   │           ├── ap_start.sh
│   │           ├── bcm4330_ap_restart.sh
│   │           ├── bcm4330_firmware_without_supplicant.bin
│   │           ├── bcm4330.hcd
│   │           ├── bcm4330_restart.sh
│   │           ├── bluetooth_module_start.sh
│   │           ├── bsa_hh_resume.sh
│   │           ├── bsa_hh_start.sh
│   │           ├── bsa_hh_suspend.sh
│   │           ├── bsa_server
│   │           ├── bt.conf
│   │           ├── bt_preload.sh
│   │           ├── BTServer
│   │           ├── bt_smt_test.sh
│   │           ├── bt_speakergain.sh
│   │           ├── bt_start.sh
│   │           ├── bt_stop.sh
│   │           ├── do_bcm4330_debug.sh
│   │           ├── hostapd.conf
│   │           ├── load.sh
│   │           ├── p2p.sh
│   │           ├── p2p_start.sh
│   │           ├── preload.sh
│   │           ├── restart_webserver.sh
│   │           ├── setup_bluetooth.sh
│   │           ├── start_telnetd.sh
│   │           ├── sta.sh
│   │           ├── sta_start.sh
│   │           ├── tcp_script.sh
│   │           ├── tcp_tuner.sh
│   │           ├── t_gpio.sh
│   │           ├── unload.sh
│   │           ├── update_unzip.sh
│   │           ├── web_ctrl.html
│   │           ├── web.sh
│   │           ├── wifi.ap.conf
│   │           ├── wifi.conf
│   │           ├── wifi_deep_sleep_ap_start.sh
│   │           ├── wifi_deep_sleep_init.sh
│   │           ├── wifi_deep_sleep_off.sh
│   │           ├── wifi_deep_sleep_on.sh
│   │           ├── wifi_deep_sleep_sta_start.sh
│   │           ├── wifi_deep_sleep_unload.sh
│   │           ├── wifi_host_set_phyreg.sh
│   │           ├── wifi_mdev_action.sh
│   │           ├── wifi_module_factory_valid.sh
│   │           ├── wifi.p2p.conf
│   │           ├── wifi_softmac.sh
│   │           ├── wifi.sta.conf
│   │           ├── wifi_start_new.sh
│   │           ├── wifi_start.sh
│   │           ├── wifi_stop.sh
│   │           ├── wowlan.775.sh
│   │           ├── wowlan.sh
│   │           ├── wpa_event.sh
│   │           ├── wpa_supplicant.ap.conf
│   │           └── wpa_supplicant.conf
│   ├── sbin
│   │   ├── cherokee-worker
│   │   ├── dnsmasq
│   │   ├── nl-class-add
│   │   ├── nl-class-delete
│   │   ├── nl-classid-lookup
│   │   ├── nl-class-list
│   │   ├── nl-cls-add
│   │   ├── nl-cls-delete
│   │   ├── nl-cls-list
│   │   ├── nl-link-list
│   │   ├── nl-pktloc-lookup
│   │   ├── nl-qdisc-add
│   │   ├── nl-qdisc-delete
│   │   └── nl-qdisc-list
│   └── share
│       ├── cherokee
│       │   ├── icons
│       │   │   ├── amba_logo.png
│       │   │   ├── arrow_turn_left.png
│       │   │   ├── blank.png
│       │   │   ├── bomb.png
│       │   │   ├── camera.png
│       │   │   ├── cd.png
│       │   │   ├── color_wheel.png
│       │   │   ├── control_play.png
│       │   │   ├── css.png
│       │   │   ├── cup.png
│       │   │   ├── email.png
│       │   │   ├── film.png
│       │   │   ├── folder.png
│       │   │   ├── font.png
│       │   │   ├── html.png
│       │   │   ├── music.png
│       │   │   ├── package.png
│       │   │   ├── page_white_acrobat.png
│       │   │   ├── page_white_actionscript.png
│       │   │   ├── page_white_c.png
│       │   │   ├── page_white_go.png
│       │   │   ├── page_white_office.png
│       │   │   ├── page_white_php.png
│       │   │   ├── page_white.png
│       │   │   ├── page_white_text.png
│       │   │   ├── printer.png
│       │   │   ├── ruby.png
│       │   │   ├── script.png
│       │   │   └── xiaoyi_logo.png
│       │   └── themes
│       │       └── default
│       │           ├── entry.html
│       │           ├── footer.html
│       │           └── header.html
│       ├── udhcpc
│       │   └── default.script
│       └── zbar
└── var
    └── www
        ├── DCIM
        ├── html
        │   ├── jquery.js
        │   └── rtsp.html
        ├── live
        ├── mjpeg
        ├── pref
        └── shutter

84 directories, 281 files
  • Dari sini, Anda dapat mempelajari fungsi dari setiap berkas tersebut atau mempelajari teknologi yang digunakan. Anda dapat juga menemukan hal menarik seperti ini:
#${IFNAME} P2P-DEVICE-FOUND 2a:98:7b:d3:c7:ed p2p_dev_addr=2a:98:7b:d3:c7:ed pri_dev_type=10-0050F204-5 name=Android_35a0 config_methods=0x188 dev_capab=0x27 group_capab=0x0
#${IFNAME} P2P-DEVICE-FOUND 00:03:7f:04:e0:9b p2p_dev_addr=00:03:7f:04:e0:9b pri_dev_type=6-0050F204-1 name=AR6003-1 config_methods=0x2388 dev_capab=0x23 group_capab=0x0
...
#${IFNAME} P2P-GROUP-STARTED ${IFNAME} GO ssid=DIRECT-AN freq=2437 passphrase=Ooj4S5D1 go_dev_addr=00:03:7f:04:e0:99
#${IFNAME} P2P-GROUP-STARTED ${IFNAME} client ssid="DIRECT-FY" freq=2437 passphrase="JBmB9RjP" go_dev_addr=00:03:7f:dd:ee:ff
#${IFNAME} P2P-GROUP-STARTED ${IFNAME} client ssid=DIRECT-Uo-android344 freq=2462 psk=ddbdcde17f1e59f8111b3697b04b309f23fdde75a3d98f8d4fc882f7140c0afa go_dev_addr=86:7a:88:70:af:7e [PERSISTENT]
  • Walaupun beberapa baris di atas merupakan komentar pada shell script, namun bisa memberikan informasi mengenai perangkat yang kemungkinan digunakan oleh pengembang firmware tersebut. Dari sini Anda dapat melanjutkan eksplorasi lebih jauh.


Penutup

Seperti yang telah disebutkan pada bagian pendahuluan, langkah di atas hanya salah satu dari beberapa cara yang dapat ditempuh untuk melakukan unpacking atau ekstraksi filesystem UBIFS. Sekian tutorial kali ini, semoga bermanfaat. Terima kasih kepada Tuhan Yang Esa, Maxindo, N3 dan Anda yang telah membaca tutorial ini.


Referensi