Serba-serbi editor teks

Pekerjaan saya adalah programmer, dan kira-kira 90% waktu saya habiskan untuk mengedit teks, jadi wajar kalau saya ingin memakai editor terbaik. Sekitar 10 tahun yang lalu saya menulis bahwa saya hampir 100% memakai Emacs, tapi setelah itu saya mulai berganti-ganti editor walau editor utama saya tetap Emacs.

Sampai sekarang tidak ada satu editor yang cocok untuk semua hal, jadi akhirnya saya memakai dan menginstall banyak editor teks dan IDE (integrated development environment) untuk berbagai tujuan. Seringkali bermain-main dengan editor dan IDE ini saya jadikan pengisi waktu luang kalau sedang ingin membuang waktu.

Sekarang ini kombinasi Editor teks dan IDE yang saya pakai:

  • Emacs sebagai editor utama
  • Vim untuk editing cepat di sistem remote
  • Ultraedit untuk membuka file teks yang sangat besar
  • Intellij untuk refactoring Python
  • VSCode untuk platformio dan remote editing
  • Visual Studio untuk C# di Windows
  • Netbeans untuk membuat GUI Java dengan cepat

Saya tuliskan dulu apa sih fitur-fitur yang saya pakai, lalu saya sebutkan kapan saya memakai editor atau IDE di atas.

Sebagai informasi, biasanya saya mengedit file di komputer:

  • Desktop Rumah: RAM 48 GB, Intel Core i5, NVME SSD
  • Laptop: Macbook Pro 2019 (16 inch), RAM 16 GB, NVME SSD

Tapi kadang saya juga mengedit file dengan berbagai komputer lain, termasuk juga pinebook dan pinebook pro.

Berjalan di Console/Mode Teks

Saya sering perlu mengedit teks di sebuah sistem yang tidak memiliki GUI, atau jika dipaksa akan lambat sekali. Contoh: mengedit file di sistem embedded Linux dengan memori yang hanya 32 Megabyte. Banyak editor langsung keluar dari daftar. Untuk keperluan ini akhirnya saya sering memakai vim dan emacs. Editor nano dan pico juga kadang saya pakai jika terpaksa.

Startup vim jauh lebih cepat dari Emacs, tapi saya sering lupa perintah Vim karena semuanya memakai kombinasi huruf yang sulit dihapal. Sekarang saya sudah hapal perintah sederhana untuk navigasi, save, edit, shell, goto line, search replace, split screen, dan managemen tab di Vim, tapi fitur yang lebih advanced belum saya kuasai. Emacs juga bisa dikonfigurasi dengan berbagai shortcut, tapi jika kita lupa sesuatu, kita bisa mengetikkan nama perintahnya (misalnya: remove-trailing-whitespace). VSCode juga memiliki fitur search command semacam ini tapi VSCode tidak berjalan di mode teks.

Search dan Replace

Semua editor punya search dan replace, tapi kemampuannya berbeda-beda. Jika mungkin saya akan melakukan search replace text dengan menggunakan program “sed” saja di command line, tapi kadang saya perlu langsung melihat hasilnya secara interaktif. Vim bagus untuk search/replace dengan regex, tapi untuk search/replace non regex malah sulit (opsi no magic atau sno tetap menganggap karakter $ dan backslash dianggap spesial). Padahal ketika search dan replace kode program itu hampir selalu mengandung karakter spesial. Jadi bagian kecil ini sering mengesalkan.

Kadang jika ingin search replace yang case sensitive, yaitu mengganti teks tapi jika huruf kapital tetap kapital, jika bukan kapital tetap bukan kapital, dan jika diawali kapital tetap diawali kapital, misalnya semua YOHANES jadi JOE, Yohanes jadi Joe dan yohanes jadi joe. Ini sangat terpakai jika kita ingin konsisten dalam memberi nama, misalnya #define di C biasanya huruf kapital, sedangkan nama fungsi huruf kecil semua. Dengan Emacs ini mudah dilakukan (defaultnya itu) tapi ini sulit dilakukan dengan sed dan butuh plugin untuk Vim. Di VS Code, fitur ini baru mulai ada di versi 1.37 (Juli 2019).

Macro

Ini sulit dijelaskan bagi yang tidak pernah memakai fitur Macro. Jika kita ingin mengedit banyak baris teks secara interaktif tapi berulang, kita bisa memakai macro. Contohnya begini, jika kita punya teks banyak baris, seperti ini: sebuah kata diikuti definisi kata tersebut:

cinta suka sekali; sayang benar
cantik elok; molek

Dan kita ingin mengubah dafar tersebut menjadi pemetaan dictionary dengan syntax PHP:

"cinta" => "suka sekali; sayang benar",
"cantik" => "elok; molek",

Dengan mengetahui perintah Emacs dan macro, kita cukup mengetikkan Control-X (, lalu mulai melakukan apa yang harus terjadi di baris itu:

  • ke awal baris dengan Control-A (beginning of line)
  • ketik tanda petik ganda
  • pergi ke kata berikut dengan Alt-f (forward-word)
  • ketik ” => “
  • pergi ke akhir baris dengan Control-E (end-of-line)
  • ketik “,
  • pergi ke baris berikut dengan panah bawah, atau Control-N (next-line)

Lalu kita akhiri macro dengan Control-x ), dan berikutnya untuk mengulangi macronya kita tekan: Control-x e. Jika masih ada lagi berikutnya kita tekan e.

Vim juga memiliki fitur macro, dan sering juga saya gunakan, tapi karena saya tidak hapal dengan banyak perintah Vim, saya lebih sering memakai emacs ketika butuh fitur Macro.

File besar

Cukup sering saya harus berurusan dengan source code yang ukurannya besar, biasanya dihasilkan oleh tools (generated code). Ukuran filenya ratusanribu sampai jutaan baris. Berbagai editor tidak mampu menangani file sebesar ini, emacs tidak mampu, vim mampu, tapi syntax highlightingnya akan didisable secara otomatis (mengeset opsi ttyfast tidak membantu).

VS Code ketika membuka file besar

Setelah mencoba berbagai editor, yang bisa membuka file besar dengan baik tidak banyak. Sebagian besar hanya tersedia untuk Windows. Pilihan akhirnya jatuh ke Ultra Edit (komersial) karena kebetulan mendukung berbagai bahasa yang saya pakai. Paket ultraedit yang saya beli juga memiliki Ultra Compare, yang bisa dipakai untuk file besar (WinMerge dan yang lain mengalami kesulitan dengan file ratusan megabyte). Alternatif lain yang menurut saya bagus adalah 101 Editor (juga komersial).

Shell

Sambil mengetik program, saya sering perlu menjalankan perintah tertentu. Tentunya ada banyak cara untuk menjalankan shell ini sambil menjalankan editor.

Pertama adalah di window terpisah. Ini cocok jika kita memakai tiling Window Manager

Atau di belah layarnya dengan tmux

Jika tidak butuh interaktif, kita bisa menjalankan langsung perintah dan melihat hasilnya (misalnya dengan “!” di vim).

Dengan menggunakan fitur di editor itu sendiri, misalnya vim punya perintah terminal (ini baru di versi 2017 ke atas) dan emacs punya perintah shell. Contoh editor lain yang memiliki ini adalah VSCode

Terminal di dalam Vim

Di Vim dan VSCode, shell ini tidak terasa terintegrasi menurut saya, karena di dalam shellnya, key binding editor jadi tidak berfungi. Di emacs, semua masih berfungsi (pergerakan kursor, copy paste, dsb), jadi misalnya kita ingin mencari output terminal, kita bisa menekan Control-r (reverse search) untuk mencari perintah atau outputnya.

Network Editing

Ada banyak cara mengedit file dari network, tapi pendekatannya biasanya salah satu dari ini:

  • Mount sharenya di lokal (bisa menggunakan sshfs)
  • Ambil filenya ke lokal, edit, lalu kirim kembali ke remote server
  • Jalankan editor atau proses khusus di remote server

Masing-masing pendekatan memiliki kelebihan dan kekurangannya. Jika kita mount direktori remote agar bisa diakses lokal, kadang ini jadi lambat jika diakses IDE (karena berusaha mengindeks seluruh project). Jika saya mengedit file di server, maka semua gerakan kursor jadi lambat, tapi perubahan akan disimpan instan. Sedangkan jika saya mengcopy file dulu di lokal, lalu menekan save, kadang butuh waktu sampai filenya benar-benar tersimpan di remote server.

Dulu saya suka memakai emacs TRAMP (Transparent Remote Access, Multiple Protocol), tapi sekarang saya memilih VSCode. VSCode memiliki fitur codeserver, jadi editornya berjalan di remote, tapi user interfacenya lokal (bahkan bisa via browser). Sayangnya fitur code server ini baru tersedia di x86/x86_64 dan arm/arm64, jadi kalau ingin mengedit file di router yang memakai MIPS biasanya tetap butuh SSH langsung.

Narrowing

Kadang saya ingin berkonsentrasi di satu bagian kode saja, misalnya satu fungsi atau bahkan sepotong bagian fungsi yang besar. Dari berbagai editor yang saya pakai, sepertinya hanya Emacs yang punya fitur narrowing secara default. Ada plugin VIM untuk ini, dan meski sudah ada yang menyarankan agar menjadi fitur VSCode, ini juga katanya sebaiknya menjadi plugin saja.

Ini sepertinya fitur minor, tapi sangat berguna, dengan narrowing, saya bisa melakukan editing apa saja (termasuk search replace) dan saya bisa yakin tidak akan mempengaruhi bagian lain program. Andaikan tidak ada fitur ini, bisa saja saya mengcopy paste bagian yang ingin saya kerjakan ke file baru, tapi saya harus mengcopy lagi hasil edit, jadi cukup merepotkan.

Font dan ligature

Sekarang ini ada beberapa “programming font”, yaitu font yang tujuannya untuk dipakai menampilkan kode. Dalam berbagai font ini berbagai simbol terlihat jelas bedanya, misalnya angka 0 dan huruf O berbeda jelas, demikian juga huruf kapital I, huruf kecil l dan angka 1. Beberapa font bahkan dibundel bersama editor atau IDE tertentu, misalnya IntelliJ punya “Jetbrains Mono” dan Visual Studio Code memakai “Cascadia Code”. Dan banyak juga font lain seperti Fira Code yang tidak ditujukan untuk editor tertentu.

Sebagian programming font ini mendukung ligature. Berbagai operator seperti <= akan ditampilkan cantik dengan simbol ≤. Sebagian programmer tidak suka ini, tapi menurut saya cukup enak untuk dipakai membaca source code. Dari berbagai editor yang saya pakai, saat ini hanya emacs yang tidak mendukung ligature dengan baik. Sebenarnya bisa, tapi repot sekali, tidak seperti editor lain yang mudah.

Zero Latency Typing

Saya sempat terobsesi juga dengan zero latency typing: begitu menekan tombol, karakter seharusnya langsung muncul di layar. Kebanyakan editor tidak bisa seperti ini, jadi ya sudah saya terima aja karena tidak banyak yang bisa saya lakukan. Biasanya jika komputer terlalu lambat, entah itu karena terlalu sibuk mengkompilasi kode atau memang spesifikasinya kurang cepat (misalnya Pinebook/Pinebook Pro), saya akan memakai editor yang lebih ringan.

Editor latency in Windows (text file)
Sumber: Typing with pleasure

Editor vs Integrated Development Environment (IDE)

Memprogram dengan IDE bisa banyak membantu pemrograman, tapi dari dulu saya sering menghindari IDE karena terlalu banyak menyembunyikan berbagai hal dari saya. Jika sedang bekerja baik IDE sangat nyaman dipakai, tapi jika ada error, sering sulit sekali mencari salahnya.

Kebanyakan IDE juga tidak terlalu berguna untuk bahasa C/C++ karena akan bingung ketika ketemu berbagai Macro yang aneh atau template yang kompleks. Jadi akhirnya saya hanya memakai IDE di kasus tertentu saja. Berbagai skrip singkat Python juga tidak butuh IDE, membuat script manual dengan editor lebih cepat daripada setup project IDE.

Kasus pertama adalah jika memang bahasa atau platform target sangat bergantung pada IDE-nya. Contoh: saya memakai Android Studio untuk membuka project Android. Meski saya mengetahui langkah manual/command line untuk mengcompile, source, membuat package dan sign APK (pengetahuan berguna untuk reversing), tapi jika ingin mengedit proyek Android ya saya memakai Android Studio. Demikian juga jika ingin membuka proyek iOS, saya memakai XCode.

Kasus kedua adalah untuk refactoring. Jika saya ingin mengubah-ubah nama dan lokasi file, fitur drag/drop IDE sangat membantu. Tidak semua IDE punya fitur setara untuk hal ini. VSCode memiliki banyak plugin yang menjadikannya seperti IDE, tapi ini masih kalah dari yang sudah matang. Contoh: fitur refactoring kode Python di VSCode masih kalah jauh dibandingkan Intellij/PyCharm.

Kasus berikutnya adalah untuk membuat GUI sederhana. Sering kali saya perlu melakukan reverse engineering kode Android (Java), dan perlu mengetes kodenya. Dengan decompiler saya bisa mendapatkan kode tertentu (kode enkripsi, signing, dsb) dari APK, dan kode ini bisa ditest dengan cepat menggunakan NetBeans di desktop. Saya bisa membuat GUI sederhana untuk memanggil kode yang saya ekstrak tersebut. Membuat program command line memang mudah, tapi jika programnya menerima banyak input, dan ada yang opsional, parsingnya mulai merepotkan dan lebih mudah memakai GUI.

Kasus terakhir adalah jika saya kurang familiar dengan bahasanya. Contohnya: saya memakai Visual Studio untuk editing C# (atau Rider jika sedang memakai Linux/OS X). Pengetahuan saya tentang C# jauh lebih rendah dibandingkan pengetahuan saya mengenai Java. Dengan IDE plus plugin dari ReSharper dari IntelliJ, saya bisa membuat kode C# yang cukup bagus. Setiap kali membuat kode yang kurang bagus, plugin ReSharper bisa memberi ide yang lebih baik.

Internal Editor Teks

Sebagai programmer, dari dulu (dari sejak SMU sekitar 1997) saya tertarik bagaimana mengimplementasikan editor teks. Untuk mengimplementasikan editor teks yang baik dibutuhkan struktur data yang baik pula. Sekedar array of string akan membuat proses insert line, merge line, dsb kurang efisien. Belum lagi berbagai aksi seperti text selection, rectangular selection, undo dan redo.

Sampai sekarang pun masih, dan saya masih mengikuti berbagai perkembangan editor yang ada. Saat ini proyek open source yang menarik adalah xi-editor yang menggunakan struktur data rope. Sayangnya sampai saat ini belum ada front end xi editor ini yang saya sukai.

Penutup

Bermain-main dan mencoba-coba berbagai editor ini sering kali menjadi “kegiatan buang waktu” ketika sedang malas mulai memprogram. Tapi Andaikan hasil dari mengoprek editor ini bisa membuat saya lebih efisien 1% saja per hari (bisa mengetik/mengedit lebih cepat beberapa menit saja totalnya), maka dalam setahun, hasilnya sudah terbayar.

Beberapa contoh yang terpikir oleh saya:Pemakaian macro sudah menghemat banyak sekali waktu karena mempercepat editing berulang. Memilih teks editor Ultraedit untuk membuka file besar menghemat banyak waktu karena hasilnya instan. Dari waktu untuk membuka file saja, sudah hemat banyak waktu.

Cheat dan Anti-Cheat pada Video Game

Salah satu tujuan banyak orang melakukan Reverse Engineering adalah mencurangi (cheating) game. Sudah banyak orang menanyakan ini ke saya, jadi akan saya bahas sekarang ini.

Cheat by Nick Youngson CC BY-SA 3.0 Alpha Stock Images
Cheat by Nick Youngson CC BY-SA 3.0 Alpha Stock Images

Tapi supaya tidak kecewa, saya tekankan dulu: cheating game modern dan populer saat ini (misalnya pubg) sangat sulit. Teknologi anti cheat selalu diupdate, dan tidak ada satu artikel di internet yang bisa membuat Anda bisa mencurangi game terbaru.

Sebagai catatan: banyak video sampah di Youtube yang mengajari cara cheat game padahal yang dijelaskan di situ tidak masuk akal sama sekali.

Cheating Game Jaman Dulu vs Sekarang

Mungkin Anda membaca beberapa artikel lama tentang cheating game dan berpikir cheating itu mudah. Sebelum membahas berbagai teknik cheat dan anti-cheat, saya tuliskan dulu tentang cheating jaman dulu dan sekarang.

Jaman dulu, terutama masa sebelum internet, cheating game relatif mudah. Berbagai perkembangan teknologi (termasuk juga kecepatan CPU, ketersediaan multi core) membuat cheating game makin sulit dilakukan.

Versi Game

Pertama adalah masalah update. Dulu Versi game tidak berubah sejak dirilis karena distribusinya sulit menggunakan CD-ROM/DVD, jadi jika ada game versi 1.0, kemungkinan tidak akan berubah sampe bertahun-tahun kemudian. Di masa awal internet, game juga masih didistribusikan via CD/DVD walau sudah bisa dimainkan online.

Dulu jika ada yang menemukan atau membuat cheat tertentu, maka pembuat game tidak bisa mengupdate kodenya. Sekarang: dalam hitungan hari sudah ada update di play store/app store/steam/dsb. Tentunya masih banyak game sederhana/tidak populer yang dibiarkan saja oleh pembuatnya..

Tulisan/Artikel tentang cheating

Dulu banyak orang dengan sukarela menuliskan ilmu tentang cheat yang dikembangkan, ini tidak apa-apa karena meskipun pembuat game membaca artikelnya, tidak ada yang bisa dilakukan sampai versi berikutnya beberapa tahun lagi atau beberapa bulan lagi.

Sekarang ini jika seseorang menemukan cheat game, mereka akan menyembunyikan atau tidak men-share tekniknya. Kalau dishare, maka pembuat game akan membaca artilel tersebut dan segera mengubah kodenya.

Resource Anti Cheat

Dulu teknik anti cheat dilakukan oleh pembuat game yang teamnya kecil. Mereka ini sering kali adalah programmer game yang bagus, tapi kurang mengerti teknologi cheating. Sekarang ini untuk game besar, sering ada team khusus yang melakukan development anti cheat.

Pekerjaan membuat anti cheat di berbagai perusahaan game yang besar gajinya mencapai puluhan/ratusan ribu USD/tahun (atau dalam rupiah 1-5 milyar/tahun). Game-game ini menghasilkan jutaan USD per bulan. Jadi mereka yang sudah dibayar mahal ini tidak tinggal diam melihat para cheater yang berpotensi mengurangi pendapatan mereka.

Sebagai pembanding: para pembuat cheat kebanyakan sukarela, karena ingin sekedar menang dalam game. Jika levelnya sudah terlalu sulit, mereka akan menyerah. Tapi ada juga group-group yang menjual cheat, motivasi mereka lebih besar dan tentunya mereka tidak mau sharing ilmu karena akan mengurangi pendapatan mereka.

Selain menyewa orang secara khusus, ada juga beberapa perusahaan yang mengembangkan teknologi anti cheat untuk dipakai oleh berbagai game lain. Contohnya adalah BattleEye. Mereka bahkan punya lowongan spesifik: membuat teknologi anti cheat.

Sebenarnya bukan cuma game yang butuh anti cheat. Contoh aplikasi non game yang sering dicurangi orang adalah Snapchat. Biasanya fitur yang diinginkan adalah bisa menyimpan/screencapture foto tanpa ketahuan. Snapchat bahkan sampai mengakuisisi sebuah perusahaan untuk meningkatkan keamanannya.

Kompleksitas Anti-Cheat

Ketika resource CPU masih sangat rendah, game harus sangat dioptimasi, jadi biasanya anti cheat hanya dijalankan sekali saja ketika game dimulai atau ketika pergantian level.

Sekarang ini dengan CPU multi core yang bahkan sudah ada di HP Android low end, bisa ada thread khusus yang melakukan pengecekan berkala. Jika satu pengecekan berhasil dibypass di awal, masih ada pengecekan lain yang dijalankan secara periodik.

Contoh aneka jenis teknik cheating

Jenis cheating untuk berbagai game beraneka ragam, tergantung jenis gamenya. Kadang-kadang cara cheating di satu game tidak berlaku sama sekali di game lain.

Untuk game jenis fighting, misalnya bisa dibuat aimbot yang otomatis mengarahkan (aim) senjata ke target, atau untuk melihat pemain lain meski terhalang dinding. Untuk game jenis puzzle bisa dibuat solver otomatis yang memberi tahu solusi gamenya.

Jadi tidak ada satu jenis cheat, dan teknik anti cheat untuk berbagai jenis cheat juga berbeda-beda. Di sini saya akan bahas contoh saja beberapa jenis cheating yang umum.

Memory/File Editing

Jaman dulu cheating game single player hanya sekedar mengubah jumlah koin di memori atau di file (untuk game yang ada savefile-nya), atau mengaktifkan sesuatu fitur yang seharusnya tidak aktif. Ini sangat mudah dilakukan dengan berbagai tool yang melakukan scanning memori, mencari value, lalu mengganti value tersebut.

Sekarang ini sebagian besar nilai sudah disimpan di server. Jadi meskipun kita mengganti nilai koin di game lokal, ketika gamenya dimulai (atau ketika akan membeli item) game akan meload lagi nilainya dari server via internet dan akan diverifikasi pembeliannya di internet.

Sebagian nilai kadang masih bisa disimpan lokal, misalnya beberapa game ada fitur agar profile kita memakai kostum tokoh tertentu dan pengecekan fitur ini dilakukan lokal/offline.

Logika cheat ini sangat sederhana: misalnya di layar tertampil koin kita 120500, kita search nilai 120500 di memori. Kemungkinan ada beberapa memori yang memiliki nilai itu, berikutnya: kita belanjakan uangnya, misalnya jadi 110000. Lalu kita search lagi nilai 110000 itu, hasilnya: akan ada daftar memori yang berkurang nilainya. Kalau masih ada kandidat lain, kita coba belanjakan koin lagi atau beli koin lagi, sampai ketemu: di memori ini tersimpan nilai koinnya.

Cheating jenis ini levelnya sangat mudah, berlaku untuk banyak game sederhana yang kurang populer. Tool yang dibutuhkan juga banyak tersedia di internet (misalnya Game Guardian untuk Android). Untuk mengedit savefile kadang hanya butuh hex editor saja. Biasanya tidak dibutuhkan coding untuk cheat jenis ini.

Function Hooking/Library Patching

Cheat level berikutnya butuh coding. Fungsi-fungsi tertentu bisa diganti implementasinya dengan milik kita sendiri. Contoh sederhana: jika ada fungsi bernama “isVisible()” yang gunanya untuk mengecek apakah sebuah objek terlihat atau tidak bisa diganti dengan fungsi yang selalu mengembalikan “true”.

Ada banyak library untuk function hooking, tergantung platform/sistem operasi yang dipakai. Contoh: di iOS ada fishhook (untuk hooking fungsi library), substrate (hooking fungsi sembarang). Di Android bisa memakai library Frida (butuh root). Di Windows ada banyak teknik hooking yang bisa dicari sendiri.

Contoh hooking yang lain adalah melakukan intercept terhadap paket jaringan. Sebelum data dikirim ke server, data bisa diubah (misalnya yang tadinya “miss” jadi “hit”). Sebaliknya: data dari server yang tidak ditampilkan oleh game, bisa ditampilkan ke user.

Di level ini cheating sudah butuh coding. Coding biasanya perlu dilakukan di level native code (biasanya C) tapi kadang sampai harus level assembly. Ini semua tergantung proteksi gamenya dan dalam bahasa apa game itu ditulis..

Banyak tutorial cheat di Youtube yang cuma sampah. Mereka memperlihatkan mengedit file .so dengan hex editor saja. Seringkali nilai yang diberikan ngawur, dan jelas tidak akan jalan di versi lain file .so tersebut. File .so isinya adalah kode mesin, untuk memahaminya diperlukan disassembler/decompiler.

Bentuknya apa function hooking ini? bisa berupa aplikasi baru yang melakukan injeksi ke aplikasi asli atau bisa berupa library (dll di Windows, .so di Linux/Android .dylib di OSX/iOS). Library ini bisa berupa library baru, atau hasil patch dari library lama.

Bot

Bentuk cheat lain yang umum adalah bot. Artinya: bukan manusia yang main gamenya, tapi program lain. Jenis bot ini bisa banyak: ada yang full bisa memainkan game dari awal, atau ada yang dipakai untuk melakukan aksi tertentu saja (mengumpulkan koin, dsb).

Bot ada yang bisa dijalankan di device, ada yang bisa dijalankan di PC. Bot ada yang butuh aplikasi gamenya, dan ada juga bahkan yang hanya berupa skrip yang langsung melakukan request ke server.

In App Purchase (IAP) Hack

Untuk game di mana pemain bisa membeli koin dengan in app purchase, maka ini bisa dicurangi untuk game yang tidak mengecek di sisi server. Semua game besar/populer punya server untuk mengecek receipt dari app store dan biasanya tidak bisa dicurangi.

Flow pembelian adalah: aplikasi meminta app store untuk meminta uang dari user. Setelah selesai, app store akan memberi tahu aplikasi bahwa pembelian selesai, dan ini tanda terima (receiptnya). Aplikasi kemudian bisa mengecek ke server app store untuk memeriksa apakah receiptnya valid. Nah masalahnya: jika aplikasi meminta langsung ke app store, fungsi ini bisa dihook dan hasilnya: “ok ini receiptnya valid”.

Anti Cheating

Setelah memberi contoh teknik cheating, saya akan menjelaskan “anti cheating” yang umum dilakukan. Saya akan mengambil contoh dari teknik cheating di atas.

Anti Memory/File Editing

Supaya savefile tidak dimodifikasi, filenya bisa dihash dengan digital signature. Jika signature tidak valid, maka game tidak mau meload savefile-nya. Jadi jika file diedit dengan hex editor, hasilnya: game tidak mau meload filenya karena signaturenya tidak valid lagi.

Bagaimana dengan nilai di memori? misalnya kita ingin menyimpan nilai score, bisa saja scorenya disamarkan, misalnya dengan minus N. Jadi jika nilai koin saat ini 100000, dengan N = 12000, maka tersimpan di memori: 88000. Ketika akan ditampilkan di layar, nilai N-nya ditambah dulu dengan 12000. Teknik anti cheating ini terlalu sederhana, dan beberapa engine cheating bisa mendeteksi seperti ini. Tentunya kita bisa juga menggunakan enkripsi yang lebih rumit seperti AES.

Sebagai programmer, tentunya banyak kreativitas yang bisa dilakukan untuk menyembunyikan nilai koin ini. Misalnya bisa saja nilainya disimpan di 10 tempat, masing-masing ditambah/dikurangi dengan nilai berbeda. Tiap kali gamenya dijalankan bisa juga dibuat nilai random untuk mengecoh fitur “value finder” dari sebuah cheat engine.

Cara paling efektif adalah: nilai koin disimpan di server, dan segala pembelian item diproses oleh server, sehingga cheat jenis ini tidak bisa dilakukan.

Anti Function Hooking/Library Patching

Jika sudah belajar teknik malware tingkat lanjut, kita akan tahu bahwa mengganti fungsi akan meninggalkan jejak. Cara termudah mengecek ini adalah: dengan melakukan checksum binary di memori, lalu nilainya dikirimkan ke server. Server bisa mengecek apakah nilai sesuai seharusnya.

Cara lain adalah dengan mengecek header tiap fungsi, apakah ada tanda-tanda bahwa fungsi tersebut sudah di-hook/intercept. Ketika melakukan patching kode, berbagai library akan mengubah header fungsi dengan instruksi assembly untuk “jump”. Jika ini terdeteksi, maka berarti fungsi sudah diubah.

Anti Bot

Ketika diluncurkan, banyak sekali orang yang membuat bot Pokemon Go. Versi pertama aplikasi ini proteksinya kurang bagus, jadi seseorang bisa mempelajari dengan mudah. Versi-versi berikutnya menjadi sangat sulit dan sekarang tidak ada lagi library yang bisa dipakai untuk melakukan koneksi ke server Pokemon Go.

Teknik anti bot yang mereka pakai adalah gabungan dari banyak hal. Mereka membuat koneksi yang dihash secara custom, versi pertama masih bisa dibongkar. Berikutnya mereka membuat versi berikutnya yang terenkripsi. Selain itu mereka mendeteksi berbagai macam perilaku (behavior) bot yang tidak masuk akal atau tidak konsisten. Ini digabung dengan berbagai cara untuk mendeteksi function hooking/library patching.

Anti IAP Hack

Jika sebuah aplikasi/game cukup sukses, developer bisa memiliki server yang bisa mengecek receipt In App Purchase dengan melakukan koneksi ke server. Jadi ketika seseorang membeli koin:

  • Transaksi dilakukan di device
  • Aplikasi mengirimkan receipt ke server pembuat aplikasi
  • Server pembuat aplikasi akan melakukan validasi ke server apple/google (koneksi langsung tidak bisa diintercept)
  • Status koin/fitur di server pembuat aplikasi akan diupdate jika valid
  • Aplikasi mendapatkan informasi dari server
  • Ketika akan menggunakan koin untuk membeli item, server memakai informasi yang ada di server, jadi tidak bisa diubah oleh aplikasi

Kadang masih ada kebocoran, terutama jika ada metode lain seseorang bisa mendapatkan koin misalnya jika pengguna aplikasi bisa mendapatkan koin/reward dari menonton iklan.

Anti-anti Cheating

Apakah para cheater segera menyerah dengan adanya berbagai teknologi anti cheat? Tentunya tidak. Tapi di level ini sudah dibutuhkan pemahaman kode yang dalam.

Anti-anti memory patching/editing

Jika sebuah nilai hanya disamarkan di memori, maka dengan melakukan reverse engineering (membaca disassembly dan hasil dekompilasi) bisa ditemukan nilai apa yang dikurangi/ditambah. Jika sudah tahu perubahannya, maka teknik pertama kembali bisa dilakukan, cukup dengan menambah/mengurangi/melakukan decrypt terhadap nilai di memori.

Jika aplikasi mendapatkan nilai dari server, mungkin nilainya bisa diintercept dengan function hooking agar bisa diubah sebelum sampai ke aplikasi.

Jika memang aplikasi butuh nilai di memori dan terlalu lambat untuk meminta nilainya dari server, apakah pembuat aplikasi akan menyerah di level ini? pembuat aplikasi bisa mengubah metodenya tiap rilis baru gamenya. Cheat yang berjalan di versi 1.0, tidak akan jalan lagi di versi minggu depan.

Anti-anti function patching

Dalam kasus anti function patching: ada kode yang memeriksa apakah fungsi ini diubah atau tidak. Kode pemeriksa ini bisa dipatch agar hasilnya selalu mengembalikan OK. Tentunya mencari kode pemeriksa ini juga tidak mudah, butuh reverse engineering lagi.

Lalu apa respond pembuat game? sekarang sebagian game memiliki kode (X) yang akan mengecek apakah ada patching. Lalu ada kode (Y) yang memeriksa apakah fungsi pengecek (X) tersebut tidak dipatch. Contoh lain: ada game yang memiliki dua fungsi yang saling mengecek satu sama lain.

Apakah para pembuat cheat menyerah? tidak juga, banyak teknik yang bisa dipakai misalnya emulasi kode menggunakan emulator tertentu (misalnya Unicorn Engine atau Qemu), merelokasi kode (misalnya dengan Gum Relocator bagian dari Frida) dan mempatch kode aslinya.

Anti-Anti IAP

Khusus untuk In App Purchase, di sini cheater memiliki keterbatasan. Untuk pengecekan di sisi server, tidak ada lagi yang bisa dilakukan, kecuali ada yang nekat menghack servernya.

Untuk game yang punya fitur voucher/kode: sering kali hacker membeli voucher dengan kartu kredit curian, lalu menjual vouchernya. Di dalam kasus lain, kadang server penjual voucher yang dihack untuk mendapatkan kode voucher gratis.

Anti Reverse Engineering

Berbagai teknik anti cheat bisa dipelajari jika kita bisa membaca kodenya. Untuk mempersulit, kebanyakan game memakai teknik Anti-RE. Biasanya yang paling dasar adalah obfuscation.

Obfuscation adalah teknik untuk membuat kode lebih sulit dibaca oleh manusia, dan tetap bisa dieksekusi langsung oleh mesin. Jangan kaget misalnya ketika melakukan reverse engineering berbagai aplikasi, bahkan IDA Pro bisa diakali agar tidak mengenali function boundary (mana awal/akhir fungsi). Decompiler juga bisa menghasilkan kode yang membuat kita pusing.

Untuk native code, standar yang dipakai saat ini adalah LLVM Obfuscator. Versi lama bisa ditangani dengan plugin khusus IDA Pro. Tapi banyak perusahaan memiliki varian khusus dari obfuscator ini sehingga tools deobfuscator sederhana tidak bisa digunakan.

Selain itu teknik RE yang lain adalah anti debugging. Dengan ini kode program tidak bisa dengan mudah dijalankan dalam debugger.

Anti-anti-anti …

Untuk setiap teknik cheat yang diciptakan, akan ada teknik anti-cheat. Dan untuk tiap teknik anti-cheat, akan ada teknik anti-anti-cheat, sampai batas tertentu.

Pembuat game bisa membuat anti cheat yang sangat hebat dan rumit, tapi jika terlalu rumit dan membuat gamenya terlalu lambat dimainkan atau butuh spec terlalu tinggi, atau membuat HP menjadi sangat panas, maka pemain akan berhenti bermain. Jadi pembuat game punya batasan pemeriksaan yang bisa dilakukan.

Tiap platform punya batasan masing-masing sehingga tidak semua teknik anti cheat bisa dipakai. Misalnya aplikasi iOS yang masuk ke app store tidak mungkin memiliki self modifying code seperti di Android

Sementara biasanya batasan pembuat cheat adalah kesabaran. Jika pembuat game mengubah anti cheatnya tiap bulan, lama-lama mereka akan lelah. Ingat: pembuat anti cheat dibayar mahal, sedangkan pembuat cheat biasanya pendapatannya tidak seberapa.

Tiap level baru membutuhkan skill baru. Untuk bisa melakukan hacking game modern, minimal perlu pengetahuan reverse engineering yang dalam, plus pengetahuan spesifik untuk platform tertentu (Android/iOS/yang lain).

Selain itu ada banyak teknologi spesifik yang perlu dipelajari, tergantung gamenya. Ada game yang dibuat menggunakan Unity, dan untuk patching gamenya kita perlu mengenai engine Unity. Game dengan Unity gampang diedit jika masih menggunakan mode .NET murni, tapi jadi sulit jika ditranslasikan ke C (dengan il2cpp) dan dilewatkan ke obfuscator. Ada game yang memakai game engine Corona yang memakai Lua jadi perlu mengenal bahasa pemrograman Lua.

Sampai di titik tertentu, ketika sudah paham berbagai hal low level, banyak hacker game yang akhirnya memilih jalan lain. Menjadi programmer atau melakukan pekerjaan security yang pendapatannya lebih besar. Di jangka panjang, menjadi pembuat cheat juga cukup membuat stress karena tiap versi bisa ada proteksi baru yang perlu dipelajari.

Resource

Saya bisa menyarankan resource-resource ini untuk mulai mengenal dunia hacking game:

Atau cari informasi spesifik mengenai teknik yang ingin Anda ketahui. Contohnya teknik anti reversing di Android ada di resource ini. Sebagai catatan: ini baru resource untuk memulai, ketika mulai berusaha cheating, akan ada banyak hal lain yang perlu dipelajari: tentang berbagai format data, tentang enkripsi, dan masih banyak lagi.

Jika ingin yang bentuknya video, sudah ada yang membuat serial belajar game hacking (ketik artikel ini ditulis, levelnya masih sampai level dasar, tidak akan bisa mencurangi game modern dengan yang diajarkan di level ini):

https://guidedhacking.com/threads/squally-cs420-game-hacking-course.14191/

Penutup

Saran saya buat yang ingin hacking game: cobalah dari game yang sederhana. Lebih bagus lagi kalau Anda mencoba membuat game sendiri supaya lebih paham mengenai struktur sebuah game.

Buat Anda yang ingin terjun sampai game yang sulit: silakan saja, tapi jika modalnya hanya ingin mengedit file dengan hex editor saja, Anda tidak akan sampai ke mana-mana. Keahlian Reverse Engineering wajib dikuasai.

Dan jangan tanya saya bagaimana memakai tools IDA Pro, Ghidra, Radare. Berbagai tools tersebut banyak tutorialnya di Internet. Tapi intinya bukan pada toolnya, tapi kemampuan membaca kode. Mengajari memakai microsoft Word bisa dilakukan dengan cepat, tapi mengajari cara membuat Novel yang indah dengan Microsoft Word akan butuh waktu sangat lama. Word di sini hanyalah sekedar tool.

Sebenarnya saya juga tidak keberatan berdiskusi mengenai berbagai teknik cheat/anti-cheat. Tapi kalau level ilmunya masih terlalu jauh, maaf saya nggak sabar, karena harus banyak sekali menjelaskan segala sesuatu. Seringkali yang bertanya:

  • Tidak menyebutkan apa gamenya, untuk platform apa (iOS/Android/PC), padahal tekniknya berbeda untuk berbagai OS
  • tidak pernah memakai IDA pro atau tool sejenis
  • tidak pernah memakai debugger
  • tidak tahu berbagai teknik cheat, hanya ingin tahu bagaimana bypass anti cheat. Padahal setiap bagian anti cheat itu dibuat karena jenis cheat tertentu

Ini seperti anak kelas 2 Sekolah Dasar yang minta dijelaskan matematika untuk pemrograman game 3D, tapi (sesuai kurikulum kelas 2 Sekolah Dasar ):

  • belum bisa mengalikan bilangan besar
  • belum tahu perpangkatan
  • belum tahu notasi matriks
  • belum tahu berbagai konsep geometri (koordinat 3D), fungsi trigonometri (sin, cos, tan), dsb.

Nah jika ada anak SD bertanya seperti itu, apakah Anda mau menjelaskan? apakah bisa punya kesabaran menjelaskan setiap bagian sampai anak SD-nya mengerti? dan andaikan bisa, kira-kira akan butuh berapa lama? bersedia menjelaskan itu semua tanpa dibayar? Atau Anda akan menyuruh anak SD itu untuk belajar dulu dasar-dasarnya?

Jika pertanyaannya sangat spesifik, maka saya bisa memberikan petunjuk, seperti misalnya bagaimana mendeteksi method swizzling di Objective C? (banyak dipakai untuk mencurangi game/aplikasi iOS) dan bagaimana membypass deteksinya?

Jangan juga meminta saya membuat cheat untuk game tertentu. Saya sudah pernah menulis biaya reverse engineering itu mahal. Kalau ingin gratis ya silakan belajar sendiri.

Jawaban di Reddit yang saya temukan ini cukup mewakili jawaban saya terhadap yang ingin bertanya tentang cara reverse engineering anti cheat pada sebuah game. Intinya adalah: “get good”.

Certificate pinning dan unpinning

Certificate pinning adalah suatu cara agar sebuah aplikasi bisa memastikan bahwa koneksi SSL/TLS dilakukan terhadap server yang seharusnya. Topik yang sering ditanyakan ke saya adalah bagaimana membypass SSL pinning agar dapat melakukan pentest terhadap sebuah aplikasi. Di sini saya akan membahas beberapa teknik unpinning, terutama untuk mobile OS (iOS dan Android).

Sebelum masuk ke topik pinning, saya review dulu sedikit mengenai komunikasi sebuah browser/ aplikasi ke sebuah server. Agar lebih singkat: browser dan aplikasi akan saya sebut sebagai aplikasi saja, karena browser juga adalah sebuah aplikasi.

DNS

Ketika kita mengunjungi blog.compactbyte.com, aplikasi akan bertanya: apa alamat IP untuk blog.compactbyte.com? pertanyaan ini ditujukan ke server DNS (domain name system). Dan setelah tahu alamat IP-nya aplikasi bisa melakukan koneksi ke server tersebut.

Dari proses awal ini saja sudah ada dua kemungkinan masalah: pertama adalah server DNS mana yang kita pakai?

Lanjutkan membaca “Certificate pinning dan unpinning”

Ulang tahun pernikahan ke 13

Hari ini sudah 13 tahun pernikahan kami. Seperti tahun-tahun sebelumnya, kami berusaha menuliskannya di blog, sebagai kenangan untuk kami sendiri. Pertama yang ingin saya ungkapkan adalah rasa syukur: kami berdua masih diberi umur panjang dan kami masih bisa menjalani rumah tangga bersama. Kami belum terlalu tua, tapi sudah ada teman yang bercerai dan ada yang pasangannya sudah meninggal dunia. Saya juga bersyukur untuk kedua anak kami. Sedangkan masih ada teman yang belum punya anak dan ada juga yang belum menikah.

Dari sejak kenalan dengan Risna, hal yang paling banyak kami lakukan adalah berkomunikasi, baik itu ngobrol langsung, maupun via chatting. Dari sejak belasan tahun lalu waktu masih memakai Nokia 3650 dengan koneksi GPRS, kami sudah mulai memakai aplikasi chatting (waktu itu Agile Messenger), sampai sekarang tiap hari kami masih berkomunikasi dengan aplikasi Telegram.

Padahal tiap hari kami ketemu dan ngobrol langsung, baik itu sarapan, makan siang, maupun makan malam. Bahkan kami juga masih sering ngobrol di tempat tidur sampai lewat tengah malam. Topik yang bisa kami obrolkan sangat banyak, dari mulai politik, mengurus anak, buku, sampai tentang film.

Banyak orang ingin menyampaikan pikiran di media sosial, tentang kesukaan atau kebencian terhadap tokoh atau hal tertentu dan akhirnya malah memperkeruh suasana. Saya dan Risna juga sering punya pendapat suka atau tidak suka tokoh tertentu, dan seringkali gemes ingin berkomentar di medsos, tapi biasanya kami bicarakan berdua saja, baik langsung ataupun via chatting.

Kami juga terbuka mengenai masalah keuangan. Kami tahu kondisi keuangan terbaru, dan tahu juga uangnya dipakai untuk apa saja. Kalau memberikan uang ke keluarga atau orang lain juga kami bicarakan bersama. Dengan keterbukaan, kami bisa saling mengingatkan dan tidak menjadikan uang sebagai sumber masalah.

Apakah artinya kami nggak pernah berantem? pernah, tapi jarang. Biasanya karena masalah yang tidak besar, dan salah satu atau kedua dari kami terlalu lelah, jadi agak emosi. Tapi biasanya kami cukup berdiam sebentar untuk menenangkan diri, lalu berkomunikasi lagi dalam hitungan jam.

Saya bersyukur buat setiap hari dalam pernikahan kami, dan berharap kami bisa tetap seperti ini sampai tua, bercerita bersama tiap hari.

KidBright32 dan KBX

Kalau United Kingdom punya Micro bit, maka Thailand punya KidBright32. KidBright32 dikembangkan oleh NECTEC (National Electronics and Computer Technology Center) organisasi pemerintah Thailand dan diproduksi oleh perusahaan lokal Thailand Gravitech). Usaha ini didukung perusahaan lain, misalnya perusahaan Maker Asia membuat extension berupa case dan peripheral tambahan yang diberi nama KBX (KidBright32 Extension).

Di posting sebelumnya saya sudah membahas Micro bit, di sini saya membahas KidBright32 dan ditutup dengan apakah mungkin Indonesia membuat board serupa.

KidBright32

KidBright32 menggunakan ESP32 sebagai prosessornya. ESP32 ini merupakan chip dari China yang pernah saya bahas di posting lain. Sedangkan Microbit memakai chip NRF52 dari Nordic Semiconductor, perusahaan Norwegia. NRF52 hanya memiliki fitur Bluetooth dan komunikasi radio proprietary, sedangkan ESP32 memiliki fitur Bluetooth dan WIFI. Harga KidBright32 sekitar 600 baht (19 USD), tidak beda dengan harga Micro Bit .

Seperti Micro bit, KidBright32 juga memiliki IDE Visual drag drop yang bernama KidBright IDE yang bisa dipakai di Linux/Windows/OSX. Berikut ini video yang dirilis oleh NECTEC untuk memperkenalkan KidBright (video bahasa Thai dengan subtitle bahasa Inggris).

Sebagian besar fitur KidBright32 ini sama dan bahkan lebih dari Micro Bit.. Memori lebih besar, bisa WIFI (bagus untuk belajar IOT), dan LED yang dipakai lebih besar (dua buah matris 8×8, jadi ada 128 led, sedangkan micro bit hanya 25).

Micro bit sudah cukup dikenal dan ada banyak aksesori tambahan, tapi KidBright32 juga tidak kalah. Berbagai sensor dan hardware tambahan sudah tersedia dan bisa dibeli di : https://www.kidbright.io/shop. Beberapa contoh sensor yang tersedia: proximity (kedekatan), detak jantung dan barometer.

KBX dan kbide

Sifat KidBright32 ini terbuka dan bisa dikembangkan lebih lanjut. Salah satu hasil pengembangannya adalah board KBX. Board ini memiliki case, LCD, Micro SD, USB host (supaya bisa memakai keyboard atau gamepad USB), dan juga tombol ekstra. Saya baru mengenal board ini ketika menemani Jonathan untuk ikut pelatihan gratis pemrograman hardware dasar di Chiang Mai Maker Club.

Selain membuat KBX, Maker Asia juga membuat kbide, versi lebih canggih dari KidBright IDE. Software kbide ini open source dan bisa berjalan di Windows, Mac, maupun Linux.

IDE-nya bukan sekedar meniru persis editor Micro Bit, banyak fungsi tambahan yang menurut saya lebih menarik. Berbagai fungsi tingkat lanjut di sediakan di mode visual, seperti:

  • Melakukan koneksi ke WIFI
  • Melakukan time synchronization dengan NTP
  • Menampilkan gambar (bahkan dari IDE-nya kita bisa mengakses kamera USB/kamera laptop, supaya kita bisa memfoto sesuatu untuk ditampilkan di device)
  • Mengucapkan kata-kata (terbatas, hanya yang ada di dalam kamus)
  • Memainkan nada (dengan editor yang bagus)
  • Memainkan MP3
  • Melakukan koneksi dengan protokol MQTT

Sebagai produk Thailand, salah satu kelebihannya adalah support terhadap bahasa Thai. Contoh paling sederhana adalah pada fungsi teks yang bisa menampilkan teks bahasa Thai dan disertakan juga berbagai font Thai.

Dengan hardware ekstra, harga KBX tentunya lebih mahal dari harga KidBright biasa, tepatnya harganya sekitar 60 USD (1990 THB). Dengan adanya koneksi Wifi dan sinkronisasi waktu dari NTP serta fitur buzzer, Jonathan bisa dengan cepat membuat Jam meja dengan alarm. Di malam hari jamnya diletakkan di samping tempat tidurnya.

Dari hasil mencoba-coba hardware dan softwarenya, saya merasa cukup kagum. Ini proyek yang serius, bukan sekedar meniru BBC Micro bit. Design hardwarenya bagus dan softwarenya juga dibuat dengan serius. Softwarenya masih terus dikembangkan (ini bisa dilihat di aktivitas github Maker Asia).

Bisakah Indonesia membuat hal serupa?

Membuat development board yang ditujukan untuk anak-anak butuh diperlukan pengembangan hardware dan software. Kenapa kita tidak mengimpor saja benda ini? ada beberapa alasan kenapa kita perlu membuat sendiri:

  • Harga barang jadi biasanya lebih mahal, apalagi jika ditambah dengan berbagai aksesorinya
  • Kita tetap perlu membuat dokumentasi dan manual dalam bahasa Indonesia dan juga menerjemahkan softwarenya dalam bahasa Indonesia (di Thailand masalah bahasa sangat penting, bahkan semua film didub dalam bahasa Thai)
  • Kita bisa menyesuaikan dengan kondisi Indonesia, misalnya menambahkan sensor yang berguna untuk otomasi pertanian atau mungkin memakai panel surya karena sinar matahari melimpah di Indonesia

Board populer pertama yang ditujukan untuk belajar pemrograman hardware adalah Arduino. Dulu Arduino bisa dirakit sendiri karena komponennya sedikit dan jenis komponennya through hole. Dengan teknologi through hole, komponen dimasukkan menembus lubang PCB dan disolder di sisi lain.

Memakai komponen dengan teknologi through-hole

Tapi sekarang jumlah komponen through hole semakin sedikit, dan kebanyakan komponen sekarang memakai teknologi surface mounted (SMT). Dalam teknologi SMT, komponen elektronik diletakkan di atas PCB dan diberi pasta solder, lalu dipanaskan. Untuk memanaskan ini bisa memakai oven (oven kue juga bisa, tapi sebaiknya khusus, jangan dipakai lagi untuk masak kue karena walau sudah bebas timbal, masih ada kemungkinan ada uap berbahaya) atau memakai hot air soldering station. Pada produksi masal, biasanya ini dilakukan secara otomatis dengan mesin.

Contoh board dengan teknologi SMT, chip hanya “menempel” di atas PCB

Karena sulitnya merakit board modern, sebaiknya ini dilakukan oleh perusahaan khusus, sehingga anak-anak bisa langsung memakainya. Harga berbagai komponen (chip, resistor, dsb) sudah relatif murah, tapi kebanyakan masih perlu impor. Indonesia sudah mampu membuat PCB sendiri dan merakit komponennya.

Alternatif lainnya adalah kita menyusun berbagai modul, jadi tidak menyusun chip dan berbagai komponen pasif. Saat ini sudah ada banyak modul kecil dengan berbagai fungsionalitas (sensor udara, transmitter dan receiver infrared, LED, dsb) yang harganya murah (beberapa USD, bahkan ada yang hanya beberapa sen). Modul modul ini bisa disolder ke sebuah board besar.

Software untuk memprogram boardnya bisa dibuat dengan relatif mudah dengan menggunakan berbagai library yang sudah ada, atau melakukan forking terhadap IDE lain yang sifatnya open source. Bagian sulitnya adalah membuat hardware dan software yang bisa berjalan mulus. Hal lain yang penting adalah dokumentasinya.

Jadi sebenarnya bisa saja Indonesia membuat board serupa dengan BBC atau KidBright. Kesulitan pengembangan hardware dan softwarenya tidak terlalu tinggi. Pertanyaannya adalah: apakah kita memang sudah memfokuskan ke sana atau belum.

BBC micro:bit

BBC Micro Bit (kadang ditulis “micro:bit”) adalah hardware open source yang dibuat oleh BBC (British Broadcasting Corporation) untuk mengajarkan pelajaran komputer di United Kingdom. Board ini sudah dirilis tahun 2016 dan sudah saya beli tidak lama setelah diluncurkan. Baru sekarangsaya tulis karena Jonathan baru mulai tertarik belajar ini.

Case kittenbot dan micro:bit

Micro bit ini ditargetkan untuk umur 11 tahun ke atas (walau lebih muda juga bisa), jadi sebenarnya memang baru cocok untuk usia Jonathan yang sekarang 9 tahun. Micro bit ini ukurannya sekitar setengah kartu kredit, ada dua tombol (plus satu tombol reset), konektor micro USB, dan 25 LED. Ada accelerometer (bisa jadi input dengan gerakan) dan juga magnetometer (bisa menjadi kompas), ada juga sensor temperatur (tapi kurang akurat karena built in).

img
Sumber gambar: https://tech.microbit.org/hardware/

Micro bit juga bisa dihubungkan ke handphone dengan Bluetooth Low Energy (BLE). Dua micro bit juga bisa berkomunikasi dengan radio (yang ini protokolnya proprietary, berdasarkan Gazell dari Nordic). Micro bit bisa dihubungkan ke banyak hardware, tapi sebelumnya saya jelaskan dulu tentang sisi softwarenya.

Micro bit dalam case Kittenbot

Software dan pemrograman

Resminya Micro bit bisa diprogram dengan browser memakai editor blok atau menggunakan Micropython dengan mengunjungi https://microbit.org/code/ . Tapi benda ini juga bisa diprogram dengan C, C++, BASIC, ADA, Rust, Swift, Forth dan mungkin masih banyak lagi.

Editor blok resmi memiiliki simulator, sehingga kita bisa langsung mencoba bahkan tanpa perlu hardwarenya. Perhatikan gambar board micro bit di kiri, gambar tersebut interaktif, kita bisa menekan tombol A, tombol B, atau keduanya.

Editor block bisa menerjemahkan kode langsung ke JavaScript. Kita juga bisa menulis kode Javascript dan jika tidak terlalu kompleks akan bisa otomatis diterjemahkan jadi bentuk blok. Javascript yang terlalu rumit akan muncul sebagai blok teks. Berikut ini contoh terjemahan otomatis dari blok ke Javascript.

Memprogram dengan browser sangat mudah: tidak perlu instalasi apapun, cukup memakai browser Chrome terbaru (jadi perlu punya komputer/laptop, bisa Windows/Linux/Mac). Transfer program ke Micro bit juga langsung dari browser.

Khusus untuk Micro bit yang dibeli beberapa tahun lalu, firmwarenya perlu diupdate dulu agar bisa diprogram via web. Cara updatenya cukup mudah, cukup colok ke komputer dan micro bit akan terdeteksi sebagai USB disk, kita cukup drag drop firmware terbaru agar berikutnya Micro bit bisa diprogram via browser.

Browser tidak harus di PC, browser ponsel juga bisa dipakai. Untuk transfer kode dari ponsel ke Micro bit, disediakan juga companion app untuk iOS dan Android. Transfer kode dilakukan via bluetooth. Jika memakai PC, kabel USB juga merupakan sumber daya listrik bagi micro bit, jika memakai HP, kita butuh kabel USB atau batere.

Tanpa hardware tambahan

Tanpa hardware tambahan apapun, sudah ada beberapa program yang bisa kita buat dengan Micro bit, misalnya:

  • kompas
  • animasi LED
  • game sederhana (bisa memakai tombol dan atau accelerometer)

Jika kita memiliki dua Micro bit, keduanya bisa berkomunikasi dengan mudah, jadi bisa dibuat berbagai aplikasi misalnya:

  • Mengirimkan pesan (misalnya kode morse)
  • game multiplayer

Kurang ide? ada banyak contoh yang diberikan di website Micro bit

Hardware Tambahan

Micro bit bisa dihubungkan ke device lain dengan alligator clip, device sederhana misalnya: LED, tombol, sensor, dsb. Selain device sederhana, sudah ada beberapa kit yang dirancang agar gampang dihubungkan ke Micro bit, di antaranya:

  • Sensor cuaca
  • Mobil-mobilan
  • Robot

Jadi Micro bit berfungsi sebagai otak untuk benda-benda tersebut. Editor blok memiliki fitur Extensions, sehingga berbagai benda tersebut bisa diprogram tetap menggunakan editor blok yang resmi tanpa perlu instalasi software tambahan.

Benda yang sudah saya belikan untuk Jonathan adalah Ring bit car v2. Mobil ini cukup mudah disusun, walau agak susah membuat kedua rodanya supaya tepat lurus. Di bawah mobil ada 2 LED Neopixel yang bisa diprogram warnanya. Dengan menggunakan dua micro bit, mobilnya bisa dijadikan mobil remote control dengan satu micro bit lain sebagai controllernya. Kita juga bisa menempelkan spidol ke mobilnya supaya mobilnya bisa “menggambar”.

Perbandingan dengan board lain

Ketika membandingkan dengan board lain, kita harus memperhatikan tujuannya. Untuk tujuan mengajari anak-anak board ini sangat bagus. Untuk mengajari orang dewasa atau mahasiswa, board lain akan lebih bagus.

Harga Micro bit sekitar 250 ribu rupiah (sekitar 18 USD). Menurut saya ini tidak terlalu murah, tapi juga tidak terlalu mahal. Jika memikirkan alternatif lain, maka ada dua hal yang bisa dibandingkan:

  • Kemudahan development (termasuk juga ketersediaan library)
  • Kelengkapan hardware dan kitnya

Alternatif yang lebih murah biasanya perlu ditambah dengan banyak modul. Contoh: board Arduino UNO bisa didapat dengan sekitar 3.5 USD, ESP8266 harganya mulai 2.5 USD dan ESP32 mulai 4 USD. Tapi semua board tersebut belum ada accelerometer, magnetometer, output LED dan tombol.

Jika ingin berhemat, maka kita harus menghabiskan waktu untuk:

  • membeli modul (accelerometer + magnetometer + led) dan kabel, serta breadboard
  • menyambungkan modul
  • mencari library yang cocok untuk modul tersebut

Untuk anak-anak yang baru belajar, micro bit ini menurut saya sudah sangat bagus. Design hardware Micro bit ini open source, siapapun boleh membuat versinya sendiri. Jika ini cukup populer, maka ada kemungkinan akan ada clone yang lebih murah (seperti Arduino UNO yang banyak clone murahnya dari China).

Untuk Anda yang tidak punya PC/Laptop, mungkin Raspberry Pi lebih cocok karena sebenarnya itu merupakan komputer mini, jadi tidak butuh komputer kecuali saat instalasi. Tapi harganya Raspberry Pi lebih mahal, dan Anda perlu mempersiapkan keyboard, mouse, SD Card, dan juga layar monitor untuk dihubungkan ke Raspberry Pi.

Sebagai informasi, Raspberry juga punya versi murah yang namanya Raspberry Pi Zero (tanpa Wifi) dan Zero W (dengan Wifi). Teorinya ini harganya sangat murah (5 USD untuk Pi Zero, 10 USD untuk Pi Zero W), tapi kenyataannya ini sulit sekali dicari. Di banyak tempat hanya membolehkan kita membeli satu saja dengan harga 5 USD (jadi jika ditambah ongkos kirim, akhirnya jadi lebih mahal). Sedangkan di tempat lain, harganya dimarkup jadi sampai 20 USD.

Penutup

Micro bit ini menurut saya cukup menarik untuk mengajarkan pemrograman dasar. Dengan micro bit, programmer bisa melihat efek langsung di dunia nyata, bukan cuma di layar komputer. Harga Micro bit ini memang tidak terlalu murah, tapi alternatif lainnya juga harganya serupa atau lebih mahal.

Sebenarnya masih terbuka kesempatan membuat board yang lebih baik dan atau lebih murah. Minggu lalu saya sempat datang ke Chiang Mai Maker Club dan di sana ada pelatihan memakai board mereka, yang tidak lebih murah tapi lebih baik. Informasi mengenai board dari Thailand ini akan saya bahas di posting berikutnya.

Membongkar Ransomware

Rasanya tiap beberapa hari ada yang bertanya tentang bagaimana mengatasi ransomware tertentu di berbagai group, terutama di group reverse engineering. Jawaban saya untuk yang terkena ransomware tetap sama: buat backup, restore dari backup, atau jika beruntung mungkin sudah ada yang membuat dekriptornya.

Artikel ini untuk anda yang ingin membongkar ransomware dan ingin membuat dekriptor sendiri. Perlu saya peringatkan bahwa ini tidak mudah, dan seringkali mustahil membuat dekriptornya. Setelah membaca ini semoga Anda paham bahwa: meminta membuat dekriptor khusus untuk ransomware yang kena ke komputer Anda itu seperti minta uang semilyar dari orang di pinggir jalan.

Jumlah ransomware baru tiap hari sangat banyak. Mudah sekali membuat ransomware dari nol, atau memodifikasi dari yang sudah ada (banyak yang bisa dicari di github, saya tidak akan melink langsung). Jadi kemungkinannuya cukup besar Anda terkena ransomware yang belum pernah didengar orang lain atau tidak dibahas di Internet.

Dalam tulisan ini saya akan menggunakan contoh soal dari Flare On 2019, sebuah ransomware bernama Mugatu. Karena Mugatu hanyalah soal CTF, ini sengaja dibuat agar hanya mengenkrip file yang sangat spesifik dan memiliki kelemahan dalam enkripsinya. Ini merupakan contoh yang cukup baik untuk dipelajari karena:

  • Malwarenya memakai teknik anti analisis (seperti malware yang sesungguhnya)
  • Malwarenya tidak berbahaya untuk dianalisis oleh pemula (tidak akan menginfeksi PC lain di jaringan)
  • Memiliki contoh enkripsi yang lemah

Silakan dibaca writeup mugatu dari pembuatanya:

https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/FlareOn6_Challenge10_Solution_Mugatu.pdf

Inti dari membuat dekriptor ransomware adalah:

  • melakukan reverse engineering malware
  • memahami enkripsi dan membuat dekriptor

Sebelum membahas jauh dan memberi harapan palsu. Saya ingin menekankan dulu: tidak semua ransomware bisa dibuat dekriptornya, dan andaikan bisa dibuat dekriptornya, reverse engineering butuh waktu lama.

Tidak semua ransomware bisa dibuat dekriptornya

Kenapa sebuah ransomware bisa tidak ada dekriptornya? apakah tidak ada ahli yang mampu membuat dekriptornya? Ini bukan masalah keahlian, tapi batasan teknis.

Kalau misalnya ketemu ponsel rusak seperti gambar di bawah ini, kemungkinan tidak akan bisa diperbaiki tukang reparasi. Kalaupun bisa, waktu yang dibutuhkan untuk memperbaiki sangat besar, dan nggak sebanding dengan harga ponselnya. Tentunya di kasus seperti ini Anda tidak akan bilang: wah tukang reparasinya nggak jagoan.

Sumber https://www.flickr.com/photos/glenbowman/3511874961

Contoh masalah teknis:

  • Ada ransomware yang entah salah coding atau sengaja merusak file dan tidak bisa dikembalikan lagi (menimpa isi file dengan random)
  • Ada ransomware yang cara enkripsinya tidak memiliki kelemahan. Silakan baca artikel saya mengenai unbreakable encryption.

Kalau Anda benar-benar malas membaca berbagai tulisan dan buku mengenai dasar enkripsi, minimal bacalah artikel saya mengenai unbreakable encryption. Tulisan tersebut sudah saya usahakan sangat sederhana dan harusnya bisa dimengerti oleh orang awam sekalipun, supaya tidak ngeyel bahwa “tiap enkripsi pasti bisa dibongkar”.

Intinya begini: meskipun sudah mendapatkan source code lengkap dan penjelasan lengkap tentang bagaimana ransomwarenya bekerja, tetap saja beberapa ransomware mustahil dibuat dekriptornya (kecuali kita tahu keynya).

Reverse Engineering butuh waktu lama

Jangan kira sebuah ransomware bisa dipahami dan dibuat dekriptornya dalam hitungan jam saja. Mungkin ada ransomware sederhana yang bisa dibongkar dalam hitungan jam, tapi kebanyakan akan butuh beberapa hari sampai beberapa minggu, dan butuh beberapa orang. Saya juga pernah menulis tentang mahalnya biaya reverse engineering.

Jika membongkar ransomware bisa sangat mudah dan selesai dalam 1-2 hari oleh orang yang kemampuannya baru belajar RE, maka perusahaan security dan antivirus akan rame-rame mempekerjaan banyak pemula, dan produknya akan jadi yang paling banyak dicari orang untuk mengembalikan data dari ransomware. Kenyataannya sekarang ini kebanyakan perusahaan antivirus dan security hanya bisa membuat dekriptor untuk beberapa ransomware saja, karena butuh waktu dan keahlian yang tinggi.

Prioritas perusahaan security biasanya adalah pada malware yang populer (menyebar luas), dan biasanya mereka tidak akan menghabiskan banyak waktu untuk ransomware yang kurang populer atau menyebar di wilayah tertentu saja. Jadi jika Anda beruntung, mungkin Anda bisa mendapatkan dekriptor gratis, tapi kemungkinannya makin sedikit dengan banyaknya jumlah ransomware.

Fakta bahwa reverse engineering butuh waktu lama sangat penting, karena kebanyakan orang sudah menyerah duluan setelah beberapa jam atau beberapa hari belum bisa maju. Aplikasi yang tidak memiliki proteksi khusus saja bisa butuh waktu lama, contohnya saya butuh waktu sekitar sebulan untuk mereverse engineer Pokemon Go Plus.

Nah sekarang jika memang sudah sangat berniat, maka langkah berikutnya adalah:

  • Belajar dasar reverse engineering malware
  • Belajar dasar enkripsi

Dasar Reverse Engineering Malware

Topik reverse engineering malware sendiri sangat luas. Sudah ada banyak buku yang membahas ini misalnya:

Saya juga sudah pernah membuat tulisan mengenai pengantar reverse engineering (tapi tidak spesifik malware).

Jangan berharap bisa mengerti dari sekedar membaca jawaban singkat dari bertanya di group chat atau dari menonton satu dua video saja. Reversing malware ini butuh kesabaran dan banyak latihan.

Saran saya ketika memulai: gunakan virtual machine yang tidak terhubung ke jaringan (networking dimatikan). Jangan merasa jagoan ketika baru pertama kali berurusan dengan ransomware, jika Anda membuat kesalahan, semua PC di jaringan bisa terinfeksi (contoh kasus: WannaCry).

Ibaratnya seperti belajar kalkulus, 99.99% orang akan butuh waktu dan latihan selama beberapa semester untuk bisa memahaminya (mungkin ada 0.01% orang super jenius yang bisa belajar kalkulus sendiri dalam beberapa jam atau beberapa hari). Coba bayangkan apakah Anda bisa diminta menjelaskan kalkulus via chatting? mengajari integral dan differensial dasar bisa dilakukan relatif cepat, tapi ketika sudah masuk topik rumit, segala macam trik dasar tidak bisa dipakai lagi.

Sebuah program biasa biasanya tidak terlalu sulit dibongkar/reverse engineer. Tapi sebuah ransomware biasanya tidak mudah dibongkar, ada trik-trik yang mempersulit analisis, atau membuat analisisnya jadi salah. Di contoh CTF Mugatu ada trik supaya IAT (import address table) jadi kacau jika langsung dibuka dengan disassembler/decompiler.

The first-stage malware shouldn’t seem too difficult when looking at it in a disassembler. However, something should start to feel amiss after you’ve looked at the API calls and how they are used. While some seem legitimate, others seem completely wrong.
The malware uses a trick I designed that involves running code before WinMainCRTStartup.


This function is responsible for the C-runtime initialization. Most disassemblers will skip this
function and start in WinMain, which corresponds to the main function for the code you programmed. . By skipping WinMainCRTStartup, you may miss my insidious trick.

Writeup Mugatu

Jadi kalau baru sekedar bisa membongkar aplikasi dengan Ghidra atau IDA Pro, ketika membongkar Mugatu akan langsung bingung karena API call-nya kok semuanya salah. Perlu dicatat bahwa ini hanya satu obfuscation sederhana, masih ada puluhan teknik lain misalnya:

  • String encryption
  • Anti debugging
  • Anti disassembly
  • Anti decompilation
  • Virtual Machine based protection
  • Heaven’s Gate (hanya untuk Windows 8 ke bawah), salah satu teknik yang cukup rumit

Dasar ilmu Enkripsi

Ransomware adalah malware yang mengenkripsi file korbannya. Jadi langkah logis berikutnya adalah: memahami enkripsinya.

Pertama yang saya sarankan adalah: cobalah membuat program yang mengenkrip dan mendekrip file. Lebih bagus lagi kalau membuat enkriptor dalam satu bahasa dan dekriptor dalam bahasa lain, supaya lebih paham berbagai variasi API enkripsi dalam berbagai bahasa.

Contohnya begini: jika kita ingin mengenkrip file, maka ada banyak cara:

  • Kita mengimplementasikan sendiri algoritma AES/RSA atau bahkan algoritma custom
  • Kita menggunakan library yang sudah ada, misalnya: CryptoPP (C++), openssl (C dengan binding ke banyak bahasa), Bouncycastle (Java, .NET)
  • Kita bisa menggunakan library built in dari sistem operasi (misalnya wincrypt di Windows)

Jadi pembuat ransomware bisa memilih salah satu dari cara di atas. Bagaimana misalnya kalau dia memilih Wincrypt, dan kita sudah bisa mendekompilasi kodenya. Apakah Anda akan bisa memahami proses enkripsi dan membuat dekriptornya? jika ransomwarenya memakai CryptoAPITransform, apakah Anda bisa membuat dekriptornya?

Cobalah membaca dan memahami berbagai jenis enkripsi. Jika kita bahkan tidak tahu enkripsi apa yang dipakai oleh ransomware, bagaimana kita bisa tahu apa kelemahannya?

Kelemahan Implementasi Enkripsi

Ini adalah topik yang paling sulit saya jelaskan, karena kebanyakan yang bertanya tidak paham mengenai dasar enkripsi. Saya sebenarnya sudah menulis sebagian topik dasar ini, misalnya beberapa artikel ini, tapi belum lengkap dan menyeluruh (topik enkripsi ini sangat luas):

Beberapa contoh kelemahan dalam implementasi enkripsi ini misalnya:

  • Keynya ada di ransomware itu sendiri/fixed key
  • Keynya berdasarkan MAC address komputer (atau nomor seri harddisk, atau sesuatu yang lain yang bisa dicari)
  • Keynya random, tapi ada kelemahan dalam cara menghasilkan bilangan randomnya (tidak menggunakan secure random)
  • Salah memanggil fungsi enkripsi (misalnya salah parameter)
  • Salah mengimplementasikan algoritma enkripsi
  • Memakai stream cipher dengan key yang sama untuk setiap file

Di soal Flare On Mugatu, ternyata kelemahannya adalah: hanya 4 byte key yang dipakai untuk enkripsi. Dan ini bisa dibruteforce dengan cepat menggunakan C.

Salah satu cara untuk mendapatkan gambaran berbagai kelemahan enkripsi adalah dengan mengikuti CTF kategori crypto, atau minimal membaca berbagai writeup di kategori crypto. Untuk saat ini saya sarankan dari CTF di luar negeri, karena kebanyakan CTF di Indonesia masih basic sekali soal kriptografinya.

Contoh beberapa malware yang memiliki kelemahan enkripsi: LockCrypt dan ACCDFISA. LockCrypt memakai enkripsi lemah dan random number generator (RNG) yang lemah, sedangkan ACCDFISA yang membuat password dengan RNG yang lemah. Untuk contoh lain ransomware yang tidak bisa dibongkar tapi pembuatnya menyerah dan memberikan keynya: Teslaware.

Pernah juga ada kasus di mana kelemahan malware bukan di malware itu sendiri tapi di server pembayaran tebusan/ransom. Servernya berhasil di hack, dan keynya bisa diambil dari server.

Penutup

Mungkin sebagian tulisan ini terasa mengecewakan, dan mungkin sebagian akan berpikir: wah susah ya, kalau begitu gak jadi deh, saya menyerah aja. Kalau memang memiliki niat, sebaiknya jangan menyerah.

Tidak semua pembuat ransomware jagoan, mungkin ada ransomware buatan lokal dan hanya menyebar lokal di kota tertentu (bahkan sangat lokal, misalnya cuma area kampus tertentu), dan ada kemungkinan enkripsinya tidak rumit atau memiliki kelemahan. Anda bisa mencoba-coba membuat dekriptornya, dan menyelamatkan minimal orang-orang di sekitar Anda.

Semoga tulisan ini cukup untuk menjawab Anda yang ingin belajar membongkar sendiri ransomware. Jika ada pertanyaan lebih lanjut bisa ditanyakan ke saya (lihat side bar mengenai cara menghubungi saya).