Mengenal Frida untuk Reverse Engineering

Salah satu tools reverse engineering yang sering saya pakai adalah Frida. Frida memungkinkan kita meng-intercept fungsi dalam C/native code (di berbagai sistem operasi), Java (di Android) dan Objective C (di macOS/iOS) dengan menggunakan JavaScript. Mungkin bagi sebagian orang deskripsi ini masih agak terlalu mengawang-awang, jadi akan saya berikan contoh nyata apa maksudnya mengintercept fungsi.

Saya berikan contoh program kecil seperti ini dalam C, yang hanya melakukan loop membuka satu file, mencetak sebaris dari file tersebut, lalu program akan sleep selama 1 detik. Program ini akan saya intercept dengan Frida.

Saya mengisi file1 dengan string “Yohanes Nugroho” dan file2 dengan string “Risnawaty”, jadi ketika dijalankan outputnya seperti ini:

Jenis intercept pertama adalah hanya sekedar memonitor pemanggilan fungsi. Dalam kasus ini saya memakai cara mudah memakai frida-trace dan meminta agar fungsi “open” ditrace. Pertama kita jalankan test-open di satu window, dan frida-trace di Window lain.

Sebagai catatan: fungsi C fopen akan memanggil fungsi “open”. Jadi kita juga bisa mengintercept “open”, dan hasilnya seperti ini:

Saya lebih suka bekerja dengan fungsi yang levelnya lebih dekat ke kernel, karena tidak perlu khawatir dengan berbagai detail implementasi di library C. Contohnya: fungsi fwrite akan membuffer penulisan ke file, sedangkan jika kita memakai write, akan langsung dituliskan. Contoh masalahnya ketika memakai fwrite kadang bingung: loh kenapa isi filenya masih sama? oh ternyata belum di-flush.

Dari contoh ini sudah bisa terlihat satu kegunaan tools ini: untuk melihat parameter sebuah fungsi. Dalam kasus tertentu ini sangat berguna, misalnya Kita bisa melihat key apa yang dipakai oleh sebuah fungsi enkripsi dengan memonitor fungsi enkripsi. Selain memonitor, kita bisa mengubah mengganti sesuatu, tidak sekedar memonitor.

Program frida-trace akan otomatis membuat file javascript sesuai nama fungsinya di direktori __handlers__. Dalam kasus ini didapati ada dua fungsi open: didalam libc dan libpthread. Dalam kasus ini yang akan terpakai adalah open di dalam libc. File Javascript yang dihasilkan oleh frida-trace seperti ini:

Intinya adalah: ketika masuk ke fungsi open, maka log/cetak parameter fungsinya. Sekarang kita bisa mengganti agar jika file1 dibuka, kita ganti dengan file2, seperti ini:

Sekarang kita bisa mencoba lagi menjalankan frida-trace. Di Window atas adalah program sebelumnya. Di bawahnya saya menjalankan frida-trace (dengan Javascript yang sudah dimodifikasi). Hasilnya di awal program akan mencetak “Yohanes Nugroho”, dan ketika frida-trace dijalankan, file yang dibuka diganti dengan file2 yang berisi “Risnawaty”. Ketika frida-trace dihentikan, fungsi dikembalikan seperti semua.

Perhatikan bahwa saya tidak mengubah sama sekali program test-open. Program tersebut dijalankan apa adanya seperti semula. Dengan kemampuan untuk mengubah parameter (dan juga kembalian fungsi, dalam onLeave), maka kita bisa membypass berbagai proteksi sederhana misalnya membuat isJailbroken() mengembalikan false, atau membuat layar administrator di aplikasi mobile bisa diakses user biasa. Dalam kasus tertentu ini bisa gawat jika ternyata checking hanya dilakukan lokal dan bukan di server.

Ketika mengintercept fungsi, Frida bisa memetakan dari calling convention menjadi objek javascript, misalnya register RDI di calling convention x86_64 menjadi isi args[0], dan ketika mengubah args[0] ini dipetakan agar mengubah RDI. Translasi calling convetion ini otomatis, jadi kita tidak perlu tahu di ARM memakai register apa untuk parameter pertama. Selain intercept fungsi, frida juga bisa mengintercept alamat tertentu (satu titik). Di mode ini, kode kita akan dipanggil tiap kali alamat tersebut dilewati (seperti breakpoint di debugger) tapi tidak ada pemetaan register atau stack ke argumen, jadi register dan memori perlu diakses manual.

Dalam banyak kasus, Frida bisa menggantikan peran debugger. Biasanya ketika melakukan RE Native Code, saya akan membaca kodenya, memahaminya, lalu biasanya perlu tahu nilai sebuah register atau isi memori tertentu. Dengan debugger, saya akan melakukan breakpoint di sebuah fungsi, lalu melihat isi registernya di titik itu atau mengubah nilai registernya. Dengan Frida, saya bisa menulis skrip untuk mengintercept alamat tertentu, dan di situ saya bisa melakukan aksi apapun dengan Javascript, misalnya:

  • Memprint isi register (atau mengubah registernya)
  • Mencetak backtrace fungsi (mengetahui fungsi mana yang memanggil fungsi ini)
  • Memprint isi memori (atau bahkan mengubahnya)

Perlu diperhatikan bahwa: kita perlu tahu dengan tepat fungsi apa yang perlu diintercept. Ini bisa dilakukan dengan static analysis (menggunakan disassembler/decompiler). Seperti contoh yang saya berikan: kita bisa melakukan intercept pada fungsi/API yang umum (open) tanpa mengetahui kodenya.

Cara kerja Frida

Ada banyak tulisan mengenai Frida, tapi kebanyakan hanya membahas satu hal kecil saja (kebanyakan untuk intercept API di Android saja). Di sini akan saya bahas sedikit lebih luas, supaya bisa memakai Frida di platform mana saja, bukan hanya untuk intercept aplikasi mobile.

Secara umum sebagian besar kode Frida ditulis dalam C dan bahasa Vala. Karena Frida memakai Javascript sebagai bahasa untuk mengontrol target, sebagian API Frida ditulis dalam Javascript. Tools command line Frida ditulis dengan Python, dan API utama Frida adalah dalam C. API Frida juga bisa diakses berbagai bahasa (Python/Java/.NET/Node dsb).

Hal pertama yang harus dipahami adalah: Frida perlu berjalan di address space proses yang menjadi target. Ada beberapa cara frida bisa masuk ke address space proses lain:

  • Kita compile source code kita dengan menginclude library Frida (dengan frida-gum-devkit, atau frida-gumjs-devkit)
  • Kita load library Frida (frida-gadget) dengan fitur OS tertentu, misalnya LD_LIBRARY_PATH di berbagai OS sejenis Unix (misalnya Linux), atau injeksi dylib di iOS/macOS. Intinya kita mengubah program atau lingkungan program agar library Frida diload sebelum program berjalan.
  • Injeksi program yang sudah berjalan menggunakan ptrace atau API sejenis. Injeksi bisa dilakukan secara langsung atau menggunakan frida-server.

Injeksi ke proses menggunakan API ptrace hanya bisa dilakukan jika kita memiliki permission untuk melakukan debugging pada proses tersebut (di iOS kita butuh jailbreak jika ingin memakai cara ini). Program frida-server berguna jika kita ingin mengakses API dari device lain, misalnya di Android yang sudah di-root, kita bisa memakai frida-server untuk melakukan injeksi dan sekaligus menjadi jembatan agar API-nya bisa diakses dari PC.

Saya tidak akan membicarakan dengan detail bagaimana melakukan berbagai langkah di atas, karena tiap OS butuh penjelasan yang detail. Contoh di iOS (tanpa jailbreak) kita harus mengekstrak IPA (harus unencrypted), mengcopy library, mengedit load command di binary utama, menandatangani file IPA. Masing-masing langkah butuh penjelasan yang tidak singkat. Intinya adalah: kita harus bisa membuat Frida berjalan di aplikasi target.

Setelah bisa berjalan di address space target, Frida akan menulis ulang implementasi assembly fungsi yang kita intercept supaya melakukan jump ke library frida yang sudah ada di address space proses tersebut. Di sini ada magic yang dilakukan Frida: frida akan melakukan tracing statik untuk mengetahui di mana saja titik keluar fungsi dan membuat hook juga di situ untuk onLeave.

Frida kemudian akan bisa memanggil kode Javascript yang kita tulis. Ada dua opsi engine Javascript yang bisa dipakai: V8 dan Duktape, secara umum V8 lebih cepat, tapi butuh lebih banyak memori, dan duktape sebaliknya: lebih lambat tapi hemat memori. Ketika melakukan detach, frida akan mengembalikan kode yang diubah kembali seperti semula.

Modul Frida

Jika melihat halaman release frida, akan ada banyak sekali file yang bisa didownload. Ini mungkin akan sangat membingungkan buat pemula, jadi akan saya jelaskan secara singkat berbagai file yang bisa didownload di situ.

Frida tertarget sangat spesifik untuk sistem operasi tertentu, jadi ada banyak rilis Berdasarkan sistem operasi (android, ios, windows, dsb). Frida juga perlu dicompile spesifik untuk arsitektur CPU tertentu, jadi ada banyak arsitektur CPU: x86-64, arm, arm64, dsb. Jadi pertama kita bisa menyaring untuk OS dan CPU mana yang ingin kita pakai.

Frida dipisahkan menjadi banyak modul:

  • Kita bisa menginjeksikan kode langsung dengan memanggil API Frida dalam C. Jika ingin melakukan ini downloadlah frida-core-devkit
  • Jika kita ingin memakai frida di aplikasi yang ada source codenya, kita bisa mendownload frida-gum-devkit atau frida-gumjs-devkit
  • Jika kita ingin menginjeksi satu proses saja di iOS/Android, kita bisa memakai frida-inject
  • Jika kita ingin menginjeksi berbagai proses mengaksesnya dari device lain (misalnya injeksi Android/iOS dan akses API-nya dari PC) kita bisa memakai frida-server
  • Jika kita ingin manual memasukkan library dengan LD_LIBRARY_PATH atau dylib injection, kita bisa memakai frida-gadget

Selain kode di atas, ada beberapa API bindings untuk berbagai bahasa: Python, nodejs, Java, QML (Qt), Swift, dan .NET. Untuk pemula: sebaiknya gunakan Python saja, ada banyak contohnya, sedangkan untuk bahasa lain masih minim.

Secara praktis, berikut ini yang perlu dilakukan untuk pemula:

  • Di desktop: “pip install frida frida-tools” ini sudah cukup untuk debugging aplikasi lokal di desktop
  • Di Android: sebaiknya root HP Anda, lalu gunakan frida-server
  • Di iOS (karena Jailbreak semakin sulit): gunakan frida-gadget

Penutup

Sudah ada banyak sekali contoh penggunaan Frida di berbagai situs lain, misalnya untuk: disable certificate pinning, mendapatkan key enkripsi, bypass jailbreak check, dsb. Jadi silahkan dicari sendiri sesuai kebutuhan. Di Artikel lain saya akan membahas beberapa trik yang saya pelajari setelah cukup lama memakai Frida.

Menurut saya Frida merupakan tools yang sangat powerful yang bisa membantu banyak task reverse engineering. Tahun lalu saya banyak menyelesaikan Flare-On dengan Frida. Bahkan saya juga memakai Frida ini untuk debugging secara umum di aplikasi saya yang ditulis dalam C/C++.

Meskipun demikian Frida juga memiliki berbagai masalah: dokumentasi Frida cukup terbatas dan sering kali saya harus membaca source codenya untuk memahami berbagai hal. Selain itu Frida juga masih terus diupdate, sering kali versi baru membawa banyak fitur baru, tapi seringkali juga membuat error baru. Tadinya saya ingin membuat contoh yang lebih sederhana, tapi terkena error ini (saat artikel ini ditulis: belum ada solusinya).

Saran saya: cobalah memakai Frida. Tools ini masih terus dikembangkan secara aktif. Frida juga cross platform, jadi toolsnya akan terpakai di banyak tempat tidak seperti tools spesifik OS tertentu (misalnya WinDBG yang hanya untuk Windows).

Review Buku: Kupilih Jalan Terindah Hidupku

Sudah 2 hari bolos nulis blog, ceritanya di grup KLIP ada yang share novel tentang dunia kerja, terus ternyata bukunya ada di app ipusnas. Ternyata karena ceritanya menarik, keterusan baca deh. Buku 200 an halaman selesai 1 hari (biasanya baca buku 1 bulan gak selesai haha). Tapi emang buku yang dibaca novel bahasa Indonesia jadi lebih cepat bacanya. Saya lupa terakhir baca novel bahasa Indonesia itu kapan.

Cover buku di aplikasi ipusnas

Kemarin, mbak Erna teman di grup menulis KLIP kasih tahu kalau bukunya yang baru terbit November 2018 lalu ada di ipusnas juga. Beberapa waktu lalu ada acara giveawaynya tapi gak bisa ikutan karena ntar pasti susah ongkir, terus mikirnya ntar aja nyari pas pulang. Tertarik beli karena kami di grup dapat cerita proses penulisan buku sampai terbit itu berapa lama dan bagaimana. Nah, waktu dikasih tau ada di ipusnas, saya langsung pinjam biar gak kehabisan stok.

Pengalaman baca di hari pertama, baca e-book di layar hp itu sungguh menyiksa. Jadi buat baca buku ini saya pinjam ipad Joe biar puas layarnya hehehe. Ternyata bacanya lebih cepat dari buku sebelumnya (buku sebelumnya ditulisnya besok aja ya). Saya mulai baca buku ini jam 3.30 sore waktu nungguin Jonathan les, eh waktu Jonathan selesai les udah selesai hampir setengahnya. Pulang ke rumah harus sediakan makanan dan makan malam dulu. Padahal hati ini penasaran. Selesai makan dan beberes semuanya, baru bisa baca lagi. Buku setebal 200 an halaman ini selesai hari itu juga. Bangga dengan diri sendiri tiba-tiba rajin baca hahaha.

Ah kebanyakan pengantar belum sampai ke review buku deh. Buku ini awalnya saya pikir kisah nyata, tapi waktu baca nama tokohnya loh kok namanya Mia bukan Erna. Terus baru menyadari kalau ini fiksi. Ceritanya diawali tentang seorang wanita bernama Mia yang punya tanggung jawab di kantor dan punya 2 anak di rumah. Walau saya tidak punya masa galau harus memilih pekerjaan dan anak, tapi saya bisa melihat kalau cerita ini bukan fiksi yang mengada-ada. Cerita ini bisa jadi kisah nyata kehidupan seorang wanita bekerja yang juga merangkap sebagai ibu muda. Mungkin bukan kisah nyata penulis, tapi bisa jadi kisah nyata seseorang deh.

Awal buku penuh drama

Setengah buku pertama bercerita drama suka duka dan perjuangan seorang ibu muda. Kegelisahan hati antara tanggung jawab di kantor dan di rumah. Keharusan memilih antara karir di kantor atau mengasuh anak, ditambah dengan bumbu salah paham dengan mama yang bantu jagain anak dan rasa cemburu karena anak sulung lebih dekat dengan neneknya, dan drama semakin lengkap dengan mbak yang ijin mudik dan tak kembali karena memutuskan kawin di kampung.

Kegalauan seorang Mia ini bukan hal yang baru dikalangan ibu-ibu muda. Dilema karena tidak ada yang menjaga anak-anak di rumah dan keinginan untuk tetap berkarya di kantor terutama juga untuk membantu kebutuhan finansial keluarga.

Kesalahpahaman dengan ibunya yang akhirnya ngambek dan ga mau tinggal di rumahnya dan tidak adanya mbak yang membantu mengurus rumah, akhirnya membawa Mia menetapkan hati untuk memilih meninggalkan kantor dan fokus dengan keluarga.

Mungkin buat yang belum mengalami, atau buat yang tidak pernah mengalami, akan berpikir: ah enak ya berhenti kerja, di rumah kan gak ngapa-ngapain. Tapi buat saya yang kebagian jatah ngurus anak di rumah sepanjang hari, cerita tentang Mia ini sangat nyata. Mia yang biasanya kerja di kantor, udah jadi supervisor, tiba-tiba di rumah seharian ngurusin 2 anak tanpa mbak dan tanpa siapa-apa. Suaminya bantuin gak? Bantuin juga tapi dalam cerita ini suaminya kasih syarat kalau apapun keputusan Mia, rutin sang suami tidak akan berubah, termasuk bangun siang di akhir pekan. Waktu baca ini dalam hati saya pengen nimpuk tuh suaminya bilang: lah elu kerja Senin-Jumat terus minta santai di akhir pekan, terus istri lu kapan istirahatnya? lu kata istri lu kacung? hahaha. Tapi emang kenyataanya banyak kok suami yang begitu (untungnya Joe gak gitu dan saya masih ada mbak walau part time hihihi).

Setelah menjalani drama demi drama menjadi ibu rumah tangga tanpa pengalaman mengurus rumah tanpa asisten, Mia mulai tergoda untuk kembali kerja lagi saja karena katanya masih dibutuhkan di kantor. Di saat itu Mia mendapat mimpi sekaligus pencerahan. Mau tau pencerahannya apa? baca bukunya hahhaha.. gak mau spoiler.

baca sampai habis, terutama bagian rumus mengurus rumahtangga

Setelah mendapat pencerahan, dari bagian tengah ke akhir cerita, buku ini banyak ilmunya. Bukan berarti nggak ada drama lagi, tapi ya udah punya banyak bekal menghadapi dramanya. Dengan cara yang tidak membosankan, tips mengenai mencuci piring, menjemur pakaian, menyetrika baju diceritakan dalam buku ini. Kedengarannya sepele ya, tapi tips itu untungnya saya sudah pelajari dari mama saya jaman masih remaja. Tapi walaupun tips-tips tersebut bukan hal baru buat saya, saya yakin banyak ibu-ibu muda yang mungkin belum tahu tips tersebut. Penyajian tipsnya juga menarik, bukan dalam bentuk bullet poin presentasi hahaha.

Di bagian akhir buku ini, Mia merumuskan kehidupan keluarga seperti organisasi kantor. Nah bagian ini saya suka banget. Kalau bagian ini saya yakin hasil perenungan mendalam penulis di saat malam-malam bergadang sambil ngurus bayi hehehe.

Buku ini saya rekomendasikan dibaca oleh para wanita baik yang masih single ataupun sudah menikah, sudah ataupun belum punya anak supaya ada gambaran hari-hari mendatang itu seperti apa. Buku ini juga penting untuk dibaca untuk para suami, supaya lebih dapat gambaran apa yang dihadapi istri sepanjang hari dengan anak.

Untuk ibu-ibu muda yang sedang galau antara tetap bekerja kantor atau mengurus anak di rumah, buku ini juga bisa dibaca bersama dengan suami untuk membuat kesepakatan sebelum memutuskan berhenti bekerja. Yang jelas, apapun keputusannya, seorang ibu butuh sistem pendukung supaya bisa tetap bekerja kantor atau bekerja urus rumahtangga. Sukur-sukur, suaminya gak kayak suami Mia dalam cerita ini yang gak mau berubah rutin hanya karena Mia berhenti kerja. Padahal kan Mia biasanya ada asisten, nah ini gak ada mbak pula (tetep aja saya protes bagian itu hahaha).

Haduh jadi panjang nih review atau curhat sih? hahaha. Saya sih kesimpulannya suka dengan buku ini. Jarang menemukan buku tentang ibu rumah tangga dalam bentuk novel dengan berbagai percakapan yang saya bisa bayangkan kejadiannya.

Semoga ya, bagian terakhir buku ini jadi kenyataan buat penulis buku. Buku ini kalau difilmkan juga bisa jadi edukasi buat ibu-ibu rumahtangga dan sistem pendukungnya. Hal penting lain juga dalam buku ini diceritakan bagaimana pentingnya komunikasi dengan pasangan dan juga punya kemandirian ekonomi.

Saya sendiri gak mengalami dilema seperti Mia. Sebelum anak pertama lahir, kami dengan sadar memutuskan kalau saya harus berhenti kerja. Tinggal di negeri orang tanpa keluarga yang bisa dititipkan ataupun betapa tidak enaknya kalau harus punya pengasuh orang Thai, bisa-bisa anak kami jadi orang Thai. Saya lebih beruntung dibandingkan Mia, keputusan yang kami ambil berdua didukung penuh dengan Joe, dan Joe bukan tipe yang bilang: rutin saya tidak berubah ya. Waktu anak-anak masih bayi, ada hari-hari di mana saya bangun siang dan Joe yang sediakan sarapan hehehe. Prinsipnya punya anak berdua kita urus berdua dong. Setelah anak besar, ya kalau saya bangun siang, paling sarapannya jadi pada kesiangan hahahhaa.

Kesimpulannya buku ini saya rekomendasikan untuk dibaca semua orang yang sedang galau menghadapi kerjaan rumah yang tak kunjung selesai, ataupun kegalauan antara pilihan rumah dan kantor. Semua drama akan berlalu kalau kita tahu caranya. Mungkin judul lain buku ini adalah: Yang perlu diketahui sebelum terjun bebas jadi ibu rumah tangga.

Konsonan Ganda dalam bahasa Thai (3)

Hari ini kita kembali ke tulisan tentang bahasa Thai. Masih melanjutkan tentang konsonan ganda dalam bahasa Thai. Kalau sebelumnya dalam konsonan ganda menjadi 2 silabel atau hanya 1 silabel dengan mengadopsi aturan bunyi dari konsonan pertama, kali ini ada konsonan ganda yang dibahas sebagai konsonan kombinasi dan menghasilkan 1 silabel saja dan mengikuti aturan konsonan pertama untuk membacanya. Dalam bahasa Thai konsonan ganda kombinasi ini disebut sebagai อักษรควบ akson khuap.

Ada 2 jenis konsonan kombinasi ini:

  1. อักษรควบแท้ atau akson khuap thee merupakan konsonan kombinasi di mana konsonan ke-2 salah satu dari konsonan ‘ร’, ‘ล’, atau ‘ว’. Konsonan tersebut dibaca bersamaan (terdengar bunyi dari masing-masing konsonan yang digabungkan).
  2. อักษรควบไม่แท้ atau akson khuap mai thee merupakan konsonan kombinasi dimana konsonan pertama salah satu dari: ‘ส’,’จ’, atau ‘ศ’ diikuti konsonan kedua ‘ร’ maka ketika dibaca konsonan kedua tidak dibunyikan. Silabel tersebut dibaca dengan aturan dari konsonan pertama. Khusus untuk kombinasi dari ‘ทร’ dibaca sebagai ‘ซ’ dan mengikuti aturan dari konsonan rendah.

Untuk lebih jelasnya bisa dilihat dari contoh katanya.

1. Contoh อักษรควบแท้ (akson khuap thee)

Kombinasi yang biasanya ada dari 2 huruf berikut ini

กวกรกล
ตร
ปรปล
ฃวฃรฃล
ผล
ควครคล
พรพล

Berikut ini contoh kata dan cara membacanya

katacara baca
ไมตรีmai trii (nada tengah)
ความรู้khwaam(tengah) ruu (tinggi)
ใครkhrai (nada tengah)
เพราะphrow (nada tinggi)
แผลphlee (nada naik)
ปลาplaa (nada tengah)
ไกลklai (nada tengah)
ใกล้klai (nada turun)
กล้าklaa (nada turun)
เกลือkleua (nada tengah)
ขวาkhwaa (nada naik)
ครัวkhruaa (nada tengah)
พร้าphraa (nada tinggi)
ปราบpraap (nada rendah)

Ada banyak lagi kata lainnya dan biasanya silabelnya diawali dengan konsonan yang sama dengan contoh di atas.

2. Contoh อักษรควบไม่แท้ (akson khuap mai thee)

2.1 Contoh konsonan pertama salah satu dari: ‘ส’,’จ’, atau ‘ศ’ diikuti konsonan kedua ‘ร’ dan ketika dibaca konsonan kedua tidak dibunyikan

KataCara baca
สระsa (nada rendah)
สรวงsuang (nada naik)
เสริมseem (nada naik)
เศร้าsao (nada turun)
สร้างsaang (nada turun)
แสร้งsaeeng (nada turun)
สรงsong (nada naik)
สร่างsaang (nada rendah)
ศีรษะsii (nada naik) sa (nada rendah)
จริง jing (nada tengah)

2.2 Contoh kata dengan kombinasi dari ‘ทร’ dibaca sebagai ‘ซ’ dan mengikuti aturan dari konsonan rendah.

Katacara baca
ทราบsaap (nada turun)
ทรายsaai (nada tengah)
ทรงsong (nada tengah)
ทรุดsut (nada tinggi)
โทรมsoom (nada tengah)
ไทรsai (nada tengah)
อินทรี insii (nada tengah)
กระทรวงkra (nada rendah) suang (nada tengah)
ทรัพย์สินsap (nada tinggi) sin (nada naik)

Untuk sekarang ini jika ingin mendengar bunyinya silakan klik ke link yang diberikan tiap kata. Dari link tersebut juga bisa mencari tahu arti dari kata tersebut.

Di awal belajar baca bahasa Thai, saya terlalu lama berfokus pada makna dari tiap kata yang saya dengar, tapi sekarang saya menyadari kalau untuk bisa membacanya lebih baik kita mengingat kelas konsonan dan berbagai aturan yang ada. Makna kata bisa kita hapalkan kemudian setelah kita menguasai membaca tulisan Thai dengan benar (mengingat nada tiap silabel yang ada).

Setelah aturan ini apakah semua aturan dalam membaca bahasa Thai sudah lengkap? sayangnya belum hehehe. Tapi sebagian besar teks bahasa Thai kemungkinan sudah bisa dibaca kalau ingat aturan yang sudah saya tuliskan sampai ke bagian konsonan ganda ini.

Walaupun tulisan tentang pelajaran bahasa Thai ini tidak saya tambahkan tiap hari, tapi sedikit demi sedikit akan saya teruskan dan semoga sampai selesai ya.

Perjalanan Phuket-Chiang Mai

Liburan kami selesai hari Rabu, tanggal 31 Juli 2019. Jadwal penerbangan berangkat jam 2 dari Phuket. Berdasarkan pengalaman waktu datang, butuh waktu hampir 2 jam dari mendarat sampai ke hotel, jadi kami siap-siap lebih awal dan memesan mobil jemputan untuk datang jam 9.30.

Packing pulang ke rumah itu selalu lebih mudah daripada berangkat, apalagi kami tidak membeli oleh-oleh. Saya baru packing pagi harinya hehehe (jangan ditiru yah).

Packing di pagi hari

Pagi itu Jonathan minta berenang sebelum sarapan. Karena sarapan memang baru tersedia jam 8 pagi, dan entah kenapa kami selalu bangun sebelum jam 7 di saat liburan, ya Jonathan dan papanya berenang dulu deh pagi-pagi.

Biasanya kami sarapan dulu baru mandi, tapi hari itu kami mandi dulu baru sarapan. Jam 8-an kami sarapan santai. Selesai sarapan, cek out hotel dan mobil jemputan sudah datang. Sekitar jam 10 kurang kami sudah berangkat ke bandara.

Untuk memastikan tidak ada yang ketinggalan saat pulang, biasanya saya akan mengecek beberapa kali semua laci, lemari dan kamar mandi. Cek juga isi tas apakah semua dompet, hp dan passport masih ada di tas. Setelah yakin tidak ada yang ketinggalan baru deh tutup koper dan kunci.

Perjalanan ke bandara Phuket relatif lancar, sekitar jam 11-an kami sudah sampai. Waktu berangkat dari Chiang Mai, kami sempat disuruh menunggu untuk memasukkan bagasi karena kami datang 5 menit lebih awal dari jam cek-in di buka. Saya sempat mikir, kalau belum bisa masukkan bagasi, ya paling harus makan sambil bawa bagasi. Ternyata walau kami datang masih 3 jam sebelum keberangkatan ke Chiang Mai, kami bisa memasukkan bagasi langsung dan bahkan masuk ke ruang tunggu.

Ruang tunggu domestik Phuket Airport

Ruang tunggu domestik di Phuket ini cukup besar dan tidak ada sekat-sekat ruangannya. Ada banyak restoran di dalamnya, jadi sambil menunggu bisa makan siang dulu. Biasanya saya perhatikan hampir di setiap airport yang kami datangi ada McDonalds ataupun KFC, nah kemarin itu saya tidak menemukan sama sekali di bagian dalam. Ada beberapa restoran SubWay dan coffee shop. Sempat agak repot mencari makan siang Joshua, kami pikir menu telur dadar itu gampang dicari di mana saja, ternyata di airport domestik Phuket tidak ada yang jual telur dadar, adanya telur mata sapi. Makanan seperti spaghetti carbonara juga tidak ada. Untungnya Joshua masih cukup kenyang sarapan tadi pagi, jadi dia gak rewel kelaparan hehehe.

Main Tangram menunggu masuk ke pesawat

Harga makanan di Phuket relatif mahal, dan harga makanan di airport lebih mahal lagi. Biasanya, kalau ada KFC atau McDonalds sih kami memilih makan di sana, atau kalau jam terbangnya pas dengan jam makan siang, kami sudah akan memilih prebook meal. Tapi kali ini karena jam terbangnya sudah lewat jam makan siang, kami memilih makan di airport biar ada kegiatan juga dan gak terlalu lapar karena kelewat jam makan siang hehehe.

Ruang tunggu domestik airport Phuket ada banyak restoran di dalamnya

Kami bersyukur, selama kami liburan di Phuket, walaupun bulan Juli itu namanya sedang musim hujan, kami kebagian matahari cerah tanpa hujan sama sekali. Perjalanan berangkat dan kembali ke Chiang Mai juga tidak ada delay dan semua lancar. Di pesawat menuju Chiang Mai, Joshua sukses tidur, sepertinya sudah gak penasaran lagi dan mengerti tinggal pulang ke rumah hehehe. Pesawat mendarat jam 4 sore, setelah ambil bagasi, kami pesan taksi ke rumah. Di Chiang Mai ada taksi ke arah dalam kota 150 baht. Karena rumah kami dekat, kami cukup membayar 150 baht sampai ke rumah. Kalau jaraknya jauh atau bawaannya banyak, harus membayar sedikit lebih mahal. Sekitar jam 4.30 kami sudah sampai di rumah.

Hal yang perlu diingat untuk perjalanan lain kali: jangan lupa cek-in online 48 jam sebelumnya.

Joe dengan Joshua, saya dengan Jonathan

Semakin dekat dengan waktu keberangkatan, semakin sedikit pilihan tempat duduk. Waktu berangkat kami masih bisa membeli kursi dengan pilihan anak-anak duduk dengan Joe, dan saya diseberang. Waktu pulang, kami hampir lupa cekin dan ga ada pilihan lain, jadinya dapat 2 di kiri dan 2 di kanan, untungnya masih dalam baris yang sama.

Kalau kita perjalanan sendiri, mungkin tidak masalah ditempatkan di mana saja, tapi kalau bawa anak dan keluarga, lebih enak kalau bisa duduk dalam baris yang sama.

Hal yang perlu diperhatikan juga adalah: pastikan menimbang bawaan sebelum berangkat. Waktu berangkat, timbangan kami lagi habis batere, saya kira-kira aja mikirnya 20 kg itu cukup untuk bawaan kami. Ternyata waktu ditimbang, kelebihan 2 kg. Untungnya, si mbak counter baik hati dan hanya mengingatkan lain kali manage bawaan sesuaikan dengan beban bagasi yang dibeli. Karena sudah tau begitu, waktu pulang kami beli yang 25kg.

Dari pengalaman terbang pada saat bukan jam makan, dipikir-pikir ada baiknya tetap memesan prebook meal terutama untuk anak-anak. Membeli makanan di pesawat seringnya udah kehabisan duluan walaupun kita bersedia membayar lebih mahal. Kalau berangkat dari rumah, bisa juga membawa bekal sesuai dengan makanan yang biasa di makan anak.

Namanya liburan, ada bagian lelahnya tapi ya nikmati saja. Pengeluaran juga pasti ekstra, tapi tentunya sudah ada anggarannya makanya kita berangkat. Rencanakan liburan dengan baik terutama anggarannya, supaya semua bisa menikmati dan gak perlu merasa bersalah kalau membeli makanan yang lebih mahal dari biasanya hehehe.

Cerita liburan Phuket selesai sampai tulisan ini. Lain kali saya akan tuliskan review pengalaman kami mengenai hotel yang kami tempati selama di Phuket.

Cerita Liburan Phuket Hari ke-3: Rawai Kids Park dan Pantai Rawai

Hari Selasa 30 Juli 2019, merupakan hari ke 3 dan sekaligus hari terakhir kami untuk eksplorasi Phuket. Karena sekarang ini lagi musim hujan dan banyak warning mengenai air laut yang sedang agak naik, kami tidak merencanakan untuk naik boat (selain itu Joshua juga selalu menjawab tidak mau kalau diajak naik boat). Jadi rencana hari terakhir ini kami akan eksplorasi sekitar hotel saja.

Pagi hari kami sarapan dulu dan berenang di hotel. Selesai berenang, kami ambil shuttle dari hotel untuk ke Pantai Rawai. Sebelum berangkat, saya baca ada tempat bermain anak-anak di dekat pantai Rawai yang juga ada restorannya. Karena sudah waktunya makan siang, kami memutuskan untuk belok ke arah Rawai Park tersebut.

Shuttlenya lebih besar dari bajaj/tuktuk

Ibu-ibu yang membawa shuttlenya baik hati, kami diantar sampai ke kids park. Kalaupun jalan, dari pantai ke kids park ini ya sekitar 500 m lah.

jam buka dan petunjuk dilarang bawa makanan masuk

Biaya masuk kids park ini untuk hari biasa 200 baht/anak untuk main sepuasnya. Orang dewasa dikenakan biaya juga 100 baht/orang. Untuk weekend dan hari libur, biaya anak-anaknya 350 baht, sedangkan dewasa sepertinya tetap 100 baht. Tempat ini cukup murah kalau dibandingkan tempat bermain di mall di Chiang Mai ataupun di Jakarta. Biaya 200 baht/anak itu bisa akses ke waterpark, playground outdoor, sand area dan juga tempat bermain indoor yang ber AC.

Menu makanan di restorannya harganya juga tidak terlalu mahal. Kami makan ber-4 sekitar 500 baht (ini tentunya tergantung dari porsi makanan yang dipesan juga).

main pasir sebelum makan

Sambil menunggu makanan datang, anak-anak main pasir dulu. Lalu setelah makan, anak-anak main di playground outdoor. Karena kami sudah berenang di hotel, saya tidak membawa baju ganti untuk bermain di area waterparknya. Jonathan kepingin main di waterparknya, tapi ya, mataharinya juga sangat panas waktu itu. Waterparknya kolam dangkal dengan slide dan sesekali ada busa disemprotkan ke kolam. Mungkin lain kali kalau main ke sana bisa dari pagi karena kalau saya baca websitenya mereka menyediakan sarapan jam 7 pagi.

waterpark keliatan dari restoran, tapi anak-anak gak mainan ini lagi karena sudah berenang di hotel

Selesai makan, anak-anak main di playground di luar, setelah itu karena panas kami masuk ke playground indoor.

Khusus ruang bermain indoor wajib menggunakan kaus kaki. Kalau tidak membawa kaus kaki, kita bisa membeli seharga 40 baht sepasang. Ruangannya cukup luas dan ada banyak pilihan mainan. Setelah agak lelah bermain, kami istirahat dan makan eskrim di area bermain outdoor. Setelah itu, kami pikir anak-anak sudah akan minta pulang, eh ternyata mereka minta masuk ke dalam lagi.

Sekitar jam 4.30 sore, akhirnya kami memutuskan membawa anak-anak jalan ke pantai. Joshua sudah terlihat mengantuk dan kecapean. Kami beli susu di family mart di seberang pantai Rawai dan bermain sebentar di pantai.

Pantai Rawai ini lebih besar daripada pantai Yanui, tapi ada lebih banyak perahu yang sandar di sana. Kami tidak menjalani keseluruhan pantai, jadi tidak melihat di bagian mana kira-kira anak-anak bermain air. Karena Joshua mulai terlihat makin ngantuk, akhirnya kami memutuskan pulang ke hotel sekitar jam 5.

Karena Shuttle dari hotel hanya ada 1 arah ke pantai dan tidak sebaliknya, kami memanggil grab untuk pulang ke hotel. Sebenarnya kalau Joshua dalam kondisi tidak mengantuk, kemungkinan kami akan jalan pulang, karena jaraknya ke hotel hanya sekitar 1,3km dan jalannya biasa saja. Tapi gak mungkin menggendong Joshua sejauh itu, jadi kami naik Grab saja. Biaya Grab di Phuket tergolong mahal kalau dibandingkan dengan di Chiang Mai. Untuk sampai jarak tertentu sepertinya biaya minimumnya 370 baht.

Pulang ke hotel, Joshua masih melanjutkan tidurnya. Sepertinya dia benar-benar kehabisan tenaga setelah bermain berjam-jam di Rawai Park. Kami memutuskan untuk makan malam di hotel saja dan istirahat supaya perjalan pulang esoknya kami semua dalam keadaan segar.

Cerita Liburan Phuket hari ke-2: Aquarium, Mall dan Big Budha

Hari Senin 28 Juli 2019 merupakan hari libur di Thailand. Awalnya sempat khawatir kalau tempat wisata bakal ramai sekali, tapi ternyata perjalanan masih lancar dan tidak ada tempat yang terlalu padat.

Untuk perjalanan hari tersebut, saya menyewa mobil seharian dengan supir. Setelah cek harga di sana-sini, supir ini sama dengan yang menjemput kami dari bandara. Kalau airport transfer 800 baht (jarak airport ke hotel yang kami tempati hampir 50 km), nah untuk sewa mobil seharian dia bilang dari pagi sampai jam 7 sore (sekitar 10 jam) 2000 baht. Harga di web yang saya temui untuk sewa dengan supir sekitar 8 jam itu semuanya lebih dari 2200 baht.

Selesai sarapan, sekitar jam 9.30 kami sudah menuju Aquarium Phuket. Perjalanan dari hotel ke aquarium lancar dan jalanan relatif sepi. Karena kami punya tiket MusePass, kami tidak perlu membayar sama sekali. Jika harus bayar harga tiket masuk orang asing dewasa 180 baht dan anak-anak 100 baht. Harga orang lokal sekitar setengah dari orang asing.

video beberapa foto selama di aquarium phuket

Aquarium Phuket ini tempatnya lebih kecil dari aquarium Chiang Mai, di luarnya kita bisa berjalan menyusuri pinggiran pantai.

Foto sebelum masuk ke aquarium

Sayangnya di lokasi aquarium tidak ada restoran untuk makan siang, tapi ada coffee shop yang menjual snack, minuman dan es krim selain kopi setelah toko suvenir. Di toko suvenir ini ada puzzle abc yang bisa membuat Joshua betah lama bermain. Kalau orang lokal sini biasanya sudah persiapan bawa bekal untuk piknik, selesai melihat ikan mereka akan duduk dipinggir pantai sambil buka bekalnya.

Di aquarium phuket ada pertunjukan singkat yang juga berusaha mengajarkan kesadaran menjaga alam laut. Pertunjukannya ada animatronik mermaid gitu plus film singkatnya. Joshua agak takut melihatnya.

patung mermaid yang bersuara dan bergerak

Waktu kami ke sana, aquarium nya agak panas karena sepertinya AC nya rusak, tapi dibagian pertunjukan AC nya lumayan adem. Sekitar 1 jam, anak-anak mulai bosan keliling aquarium.

Belajar tentang umur sampah plastik – kesadaran lingkungan

Tujuan berikutnya mencari makan siang sekaligus ketemu teman saya di mall. Kesan tentang mall di Phuket: bagian food courtnya agak lebih mahal dari di Chiang Mai tapi lebih banyak pilihan makanan halal. Pilihan makanannya sama saja dengan di Chiang Mai, jadi lebih gampang memilih menu makan siangnya. Kami tidak menjelajah keseluruhan mall nya, karena kami menggunakan waktu makan sambil duduk ngobrol saja.

Oh ya, ketemu kak Imit dan keluarga ini bukan kebetulan. Jadi ceritanya, tahun lalu sudah diajakin ketemuan di Thailand selatan, tapi waktu itu kami belum bisa. Nah beberapa bulan lalu kak Imit kasih tau mereka berencana ke Phuket dan bertanya apakah kami ada rencana ke sana juga. Karena kebetulan kami belum ada rencana liburan, dan sudah 12 tahun menunda ke Thailand Selatan dengan berbagai alasan (dan pernah udah beli tiket ga jadi pergi karena belinya sebelum tahu hamil Joshua), jadi kami sempatkan kali ini untuk liburan ke Phuket sekalian ketemuan dengan kak Imit.

Selesai dari mall, kami melanjutkan ke view point Big Budha. Joshua ketiduran di mobil, dan walau sudah ditunggu sampai hampir 30 menit, dia nangis waktu dibawa turun. Akhirnya di Big Budha cuma sempat foto sedikit dan Joshua dibawa lagi ke mobil sama Joe. Saya dan Jonathan yang naik ke atas untuk foto-foto pemandangan kota Phuket dari atas. Bagian Big Budha sedang dalam renovasi, tapi tetap dibuka untuk umum.

Oh ya, untuk ke arah Big Budha ini, perjalanannya agak menanjak dan ada bagian yang kurang bagus. Masuk ke area Big Budha ada aturan pakaian yang tidak boleh terlalu terbuka, mereka meminjamkan sarung/scarf untuk menutupi bagian punggung atau kaki kalau ada yang terlalu terbuka. Banyak orang sembahyang ke sana. Tempat ini tidak memungut biaya alias gratis, tapi ada tempat untuk memberikan donasi jika kita ingin memberikan donasi untuk renovasi tempat ini. Waktu kami ke sana sudah agak sore tapi belum sampai matahari terbenam. Karena Joshua sudah agak rewel, kami tidak menunggu matahari terbenam. Kabarnya pemandangan matahari terbenam di Big Budha juga cukup indah.

Selesai dari Big Budha, kami pulang ke hotel. Kami pesan makan malam di hotel dan istirahat deh. Jonathan minta berenang lagi, tapi karena kami sudah lelah dan gak bisa menemani, kami suruh main di bathtub saja dan janjikan besok pagi berenangnya. Joshua sampai hotel sih udah tenang, apalagi setelah dikasih makan. Mainan di bathtub udah cukup buat dia hehehe.

Phuket hasil editan Google Photos

Berhubung waktu liburan gak bawa laptop, jadilah saya cuma bisa ngeblog 1 kali dari Phuket. Setelah kembali ke Chiang Mai, ceritanya akan saya lanjutkan sedikit demi sedikit. Sebelum ceritakan perjalanannya, saya mau berbagi foto-foto selama di sana yang diedit oleh Google Photos.

Sudah tahu belum, kalau foto-foto kita diupload ke Google Photos, nantinya dengan algoritma AI (artificial inteligence), Google akan mengedit sebagian foto kita dan membuatnya jadi lebih indah lagi hehehe (lokasi asli dilihat mata langsung tentunya masih lebih indah).

Foto-foto berikut ini diambil dengan HP Joe (iPhone XR), HP saya (Xiaomi Note 5), dan HP Jonathan(Xiaomi Redmi 4X). Foto Panorama yang ada merupakan panorama otomatis oleh Google. Yang kami lakukan cuma foto sekeliling dan upload ke Google Photos.

Pantai Yanui di siang hari
Panorama Pantai Yanui

Foto dan Panorama Pantai Yanui di atas difoto oleh Joe dengan iPhonenya. Setelah diedit oleh Google, saya lebih suka biru langit yang bukan panorama.

Pantai Yanui ini kategorinya pantai kecil. Tapi cukup buat bermain pasir dan tidak ada kapal yang bersandar di sana. Beberapa bagian berupa batu-batuan dan turis yang datang bisa snorkeling.

Jalan ke Prompthep Cape melihat ke arah Windmill

Dekat hotel kami tinggal, ada 2 tempat untuk melihat pemandangan. Kami berjalan kaki ke Promthep Cape, dan dari jalannya kami bisa melihat ke arah Windmill ViewPoint. Ini saya foto menggunakan iPhone Joe sambil istirahat dari perjalanan yang agak menanjak.

Pemandangan dari arah Mercu suar Promthep Cape

Prompthep Cape ini merupakan tempat paling selatan dari Phuket. Selain untuk melihat matahari terbenam, di sini juga ada mercu suar. Ini foto ke arah laut diambil dari dekat mercu suar. Foto ini juga diambil menggunakan iPhonenya Joe.

Menjelang Sunset dari Promthep Cape Restaurant

Kalau ini foto menjelang matahari terbenam yang diambil dari tempat duduk kami di restoran. Mataharinya terbenam ke balik gunung. Waktu kami ke sana, langitnya lagi agak berawan.

Perjalanan menuju View Point Big Budha

Salah satu view point untuk melihat Phuket adalah Big Budha. Sesuai dengan namanya, di tempat ini ada patung Budha yang sangat besar yang dari jauh bisa kelihatan. Foto ini diambil Joe menggunakan iPhone dari dalam mobil ketika sudah cukup dekat ke lokasi Big Budha.

View kota Phuket dari area Big Budha

Kalau ini foto ke arah kota Phuket dari area Big Budha. Foto ini diambil oleh Jonathan dengan HP Xiaomi Redmi 4X.

Panorama dari area Big Budha

Foto panorama dari area Big Budha ini saya yang foto dengan Xiaomi Note 5.

Rawai Kids Park Pool Area

Ini foto waterpark di Rawai Kids Park. Foto ini saya ambil dengan Xiaomi Note 5.

Rawai Kids Park ruang bermain indoor dengan AC

Foto Panorama ruang bermain yang ber AC di Rawai Kids Park, di foto pakai iPhone nya Joe.

Pantai Rawai di sore hari
Pantai Rawai di sore hari

Dua foto Pantai Rawai di atas diambil sekedarnya oleh Joe dengan iPhone sambil gendong Joshua yang mulai ngantuk, tapi setelah diedit oleh Google jadi terlihat lebih bagus hehehe. Pantai Rawai ini lebih panjang dari pantai Yanui, ada banyak kapal besar dan kecil sandar di sini.

Selain edit foto jadi lebih indah, Google Photos juga membuat movie, animasi dan kolase.

Kumpulan foto di Phuket Aquarium

Ini kumpulan sebagian foto di Phuket Aquarium yang dijadikan movie oleh google photos.

Mungkin buat yang udah jago fotografi, foto-foto hasil editan Google ini biasa saja ya, tapi kalau menurut saya sih ya lumayan lah mengingat ini diedit secara otomatis.

Kami membiasakan diri untuk upload foto setiap kali terhubung ke WiFi, dengan cara ini kalau misalnya HP rusak/hilang/gak sengaja terhapus, memorinya sudah tersimpan di Google Photos (harapannya sih HP nya tetap aman ya).