XPosed: Framework sakti untuk modifikasi Android

Topik kali ini agak advanced, tapi juga pratis. XPosed  adalah sebuah framework open source yang memungkinkan kita membuat modul untuk memodifikasi sistem dan aplikasi Android yang ditulis menggunakan Java. Dari sudut pandang programming, framework ini menarik karena memungkinkan kita menambahkan dan mengintersepsi kode pada aplikasi closed source Android, sedikit mirip Aspect Oriented Programming.

Screenshot_2016-08-21-07-33-48.png

XPosed bekerja dengan memodifikasi runtime Android (Dalvik/Art) sehingga menjadi mungkin untuk memanggil kode custom di awal atau akhir sebuah method apapun. Perhatikan bahwa yang dimodifikasi adalah runtime Android saja, jadi hanya kode yang ditulis dalam Java dan diinterpretasikan oleh Dalvik atau Art runtime saja yang bisa diintersepsi, kode native tidak bisa. Ada framework lain, misalnya Cydia yang bisa mengintersepsi kode native juga, tapi Cydia versi Android ini agak lambat perkembangannya (saat ini belum mendukung Android 5 dan 6).

Untuk memakai XPosed, yang harus Anda lakukan adalah: menginstall recovery alternatif (CWM, TWRP, dsb) dan menginstall frameworknya (tergantung ponsel Anda, ini mungkin bisa membatalkan garansi). Anda juga perlu menginstall XPosed installer yang akan memanage modul mana saja yang aktif.

Mari kita mulai dengan contoh yang praktis tentang intersepsi kode. Jika kita punya kode seperti ini:

Kita bisa mengintersepsi ini dengan mengembalikan agar isValidLicense selalu menjadi true. Kita juga bisa memodifikasi agar  validateLicense segera kembali (tidak melakukan apapun, jadi tidak akan melempar exception). Dalam kasus yang sebenarnya, kita harus teliti, misalnya mungkin di dalam ada validateLicense kode lain untuk mensetup versi premium jika license valid (jadi tidak bisa kita patch agar selalu kembali).

Dalam contoh di atas method checkRoot melakukan pemeriksaan apakah device di-root oleh pengguna, dan cara memeriksanya adalah dengan menggunakan XML yang berisi daftar command dan package yang harus diperiksa. Dalam kasus seperti ini (ini penyederhanaan dari kasus nyata yang saya temui), maka kita bisa juga mengganti parameter input XML menjadi XML kosong.

Berikut ini contoh kode untuk mem-patch agar isValidLicense selalu mengembalikan true.

Beberapa baris pertama hanya mengimpor package yang kita butuhkan. Berikutnya kita perlu mengimplementasikan IXposedHookLoadPackage. Di dalam handleLoadPackage, kita bisa memfilter untuk package aplikasi mana saja hooking ini akan kita lakukan. Dalam kasus ini saya hanya tertarik pada satu aplikasi saja. Dalam kasus tertentu kita ingin menghook semua aplikasi, misalnya kita bisa membuat modul untuk melakukan SSL Unpinning untuk semua aplikasi.

Berikutnya yang harus kita ketahui adalah signature dari method yang akan kita hook. Untuk aplikasi yang sourcenya terbuka, atau untuk aplikasi yang mudah didekompilasi karena tidak melakukan pinning, hal ini mudah dicari. Jika aplikasi di-obfuscate, hal ini agak lebih sulit. Dalam contoh ini package yang dimaksud adalah es.yohan.example dan methodnya adalah isValidLicense yang memiliki parameter berupa String.

Ada dua hook yang tersedia: beforeHookedMethod dan afterHookedMethod. Dalam beforeHookedMethod, kita bisa mengubah parameter yang masuk ke program (atau bisa juga sekedar melakukan logging atau mengirimkannya ke tempat lain), dan dalam afterHookedMethod kita bisa menerima dan atau mengubah nilai kembalian method. Dalam contoh di atas, saya hanya mengeset agar hasilnya selalu true.

Mungkin sekarang Anda bisa melihat kelemahan XPosed: modifikasi hanya bisa dilakukan di awal dan di akhir method. Jika Anda ingin memodifikasi sesuatu di tengah-tengah, misalnya mengubah konstanta yang tertanam di logika program (misalnya if (x>2127)), atau sekedar mengubah “kurang dari” menjadi “lebih dari” maka sulit melakukannya dengan XPosed.

Jika masih ingin mengubah detail sebuah method dengan XPosed, caranya adalah dengan menulis ulang method itu, dan di beforeHookedMethod kita memberitahu XPosed framework agar tidak memanggil method aslinya. Dalam kasus tertentu lebih mudah mengedit file APK-nya.

Secara praktis apa saja yang bisa dilakukan dengan kemampuan XPosed ini? Sudah banyak orang menuliskan modul untuk Xposed, dari mulai sekedar mengubah kosmetik Android (mengubah tampilan ini dan itu), menambahkan fitur tertentu (misalnya menambahkan Zoom ke aplikasi Instagram), memblokir iklan di berbagai aplikasi (termasuk juga Youtube yang sekarang memasukkan iklan bukan hanya di awal video tapi juga di tengah video jika videonya panjang), memperbaiki offset GPS di China, dan masih banyak lagi.

Ada juga modul untuk meningkatkan privasi (misalnya XPrivacy dan PMP), dengan memblok berbagai request dari aplikasi Android yang nakal atau mengembalikan data palsu. Contoh: banyak sekali aplikasi yang meminta akses ke contact list, ternyata mengupload seluruh phonebook kita ke server mereka (dengan berbagai alasan, misalnya untuk fitur referal, dsb).

Penghematan batere juga bisa dilakukan, misalnya dengan memblok aplikasi agar tidak bisa auto start, membatasi akses sensor, dsb.

Kebanyakan modul di repository XPosed berguna untuk mengatasi masalah sangat spesifik yang dimiliki oleh pengguna (misalnya ada yang nggak suka jika app yang baru diinstall langsung memiliki shortcut di home screen, ada yang nggak suka jika VPN meminta konfirmasi, dsb). Menurut saya itu kelebihan utama XPosed: kita bisa memodifikasi Android dengan mudah sesuai kemauan kita. Sebagai programmer, modifikasi ini bisa dilakukan meskipun kita tidak memiliki source code aplikasinya.

Secara praktis bagai saya pribadi: Sebagai pentester, saya kadang menemui aplikasi yang melakukan pengecekan root dengan cara yang unik dan modul XPosed seperti RootCloak tidak cukup. Saya kadang melakukan patching aplikasi langsung (jika masih testing tahap development), dan mengembangkan frameworknya (jika aplikasi sudah di appstore, karena biasanya sudah stabil)

Kadang saya juga perlu mengintersepsi komunikasi dengan enkripsi yang custom (misalnya memakai AES dua kali), dalam kasus ini intercept via proxy tidak cukup (datanya sudah dienkrip, dan tidak bisa dengan mudah didekripsi karena formatnya custom). Di dalam kodenya pasti ada sesuatu yang mengenkrip data sebelum dikirim dan mendekrip data yang diterima, dengan mengintercept titik tersebut, saya tidak perlu menulis program khusus untuk dekrip/enkrip ketika testing.

Saya juga pernah membuat modul khusus untuk intersepsi Blackberry Messenger (BBM). Cara kerja modulnya seperti ini: saya membuat web server di Android yang bisa menerima pesan untuk dikirimkan, dan pesan itu saya inject langsung ke proses BBM. BBM selalu menyimpan message dalam format internalnya setelah diterima, jadi kita bisa mengakses message dari conversation manapun. Perlu dicatat bahwa modul ini bisa saya kembangkan dengan mudah karena di versi awal mereka tidak melakukan obfuscation, dan ketika sudah diobfuscate, saya masih bisa melihat mapping class/methodnya berdasarkan berbagai pesan error yang ada di method tersebut.

Untuk membuat XPosed module sendiri, sudah ada berbagai tutorial di Internet, tapi saya akan memberikan panduan singkat, sekaligus sebagai catatan untuk diri sendiri.

Pertama: buat proyek baru dengan Android studio. Pastikan instant run dimatikan karena tidak kompatibel dengan Xposed. Tidak perlu template khusus untuk membuat modul XPosed.

Kedua: edit file gradle dengan menambahkan dependensi: provided 'de.robv.android.xposed:api:82'. Tentunya versi 82 bisa diganti dengan versi terbaru.

Ketiga: implementasikan IXposedHookLoadPackage, ini sudah dicontohkan di atas.

Keempat: buat file app/src/main/assets/xposed_init yang adalah file teks dan isinya adalah nama package + kelas yang mengimplementasikan IXposedHookLoadPackage tersebut. Ini akan dipakai oleh Xposed untuk mendari kelas mana yang akan diload saat booting.

Terakhir: edit file manifest agar dikenali sebagai modul XPosed. Pertama tambahkan atribut xmlns:tools="http://schemas.android.com/tools" di tag manifest (ini sekedar untuk menghilangkan warning). Lalu tambahkan beberapa metadata berikut di dalam tag application:

<meta-data  android:name="xposedmodule"
android:value="true" />

<meta-data  android:name="xposedminversion"
android:value="54" />

<meta-data  android:name="xposeddescription"
android:value="Joe Hack Module"
tools:ignore="ManifestResource" />

Tentu saja bagian tersulit adalah mencari tahu bagian mana yang perlu dihook untuk mengimplementasikan fungsionalitas tertentu. Tapi menurut saya ini juga sekaligus menjadi bagian yang paling menarik: kita jadi lebih mengerti internal sistem Android.

Modifikasi dengan XPosed framework melengkapi hack Android yang lain. Rooting aplikasi tidak cukup untuk mengubah internal program (contohnya untuk pentest aplikasi custom). Modifikasi dan compile ROM sendiri bisa mengubah hal-hal yang di luar kemampuan XPosed, tapi tetap tidak bisa mengubah aplikasi. Modifikasi aplikasi dengan cara patching manual bisa dilakukan, tapi cara ini lebih repot, dan akan sulit jika kita ingin mempatch banyak aplikasi sekaligus.

Sebagai pembuat aplikasi, mengobfuscate aplikasi Anda adalah salah satu cara untuk mempersulit hooking dengan XPosed framework. Contohnya: aplikasi Youtube sering diobfuscate dan sering diupdate sehingga modul seperti YoutubeAdaway tidak jalan.

Bug, Debugging, dan Debugger

Baru saja ada seseorang yang bertanya kepada saya mengenai cara mendebug program buatannya. Sebentar saya merasa heran: masak nggak bisa pake debugger? lalu ketika saya mencoba mengingat-ingat, di sebagian besar buku dan kuliah mahasiswa tidak diajarkan mengenai bug yang umum, cara mencari bug, dan cara menggunakan debugger itu sendiri.

Kemampuan mencari bug di program sendiri ini juga menjadi dasar untuk mencari bug security. Kalo kita bisa menemukan kesalahan yang kita buat sendiri, akan lebih mudah untuk mencari kesalahan di program orang lain.

Bug

Bug adalah segala macam cacat dalam program. Bisa saja cacatnya hanya berupa tampilan yang sedikit salah, bisa crash, bisa berupa bug security (harusnya hanya bisa diakses user X, bisa diakses user Y), kadang bug tertentu tidak muncul sampai kasus ekstreem (misalnya jika jumlah user banyak maka akan out of memory karena ada memory leak).

Sumber bug bisa banyak, dari mulai salah design, salah implementasi, salah konfigurasi, dsb. Sebagai programmer, bug yang akan saya bahas adalah dari sisi implementasi (coding). Biasanya seorang programmer akan belajar sedikit demi sedkit jenis bug dari pengalaman. Semakin banyak coding, semakin banyak salah, semakin banyak belajar.

Beberapa jenis bug sangat umum di semua bahasa (kesalahan logika, kesalahan aritmatika, dsb), tapi bug tertentu hanya muncul di bahasa tertentu atau jika menggunakan framework tertentu. Jadi pengalaman coding tetap merupakan guru yang utama.

Contoh bug yang sederhana adalah lupa menginisialisasi atau mereset variabel. Biasanya jika program berjalan benar pertama kali, lalu ketika diulangi tidak benar hasilnya (dan benar lagi ketika aplikasi direstart) maka penyebabnya adalah lupa mereset variabel.

Contoh lain adalah menggunakan try catch secara malas, misalnya dengan membungkus seluruh fungsi dalam satu try except. Dengan cara ini, maka tidak jelas apa sumber error di sesungguhnya.

Contoh bug yang spesifik terhadap bahasa adalah bug manajemen memori di C. Kesalahan mengakses memori di C sangat mudah terjadi dan biasanya akan menyebabkan crash.

Source Control

Jangan heran juga kalau kadang bug baru muncul karena hal sepele, misalnya source code berubah  karena keyboard tersenggol. Msalnya sebuah konstanta 1000 terdelete angka nol terakhirnya (atau bertambah satu), atau tanda “lebih besar sama dengan” terhapus  menjadi lebih besar saja. Di sini penggunakan version control (yang populer saat ini: Git) sangat berguna, Anda bisa mereview segala perubahan pada source code.

Source control juga memungkinkan kita melihat sejarah perubahan secara keseluruhan. Bagi security researcher, ini sering menjadi ladang untuk mencari bug baru di software open source. Jika ada yang menambahkan fungsionalitas baru, maka kemungkinan ada bug baru yang muncul.

Unit Testing

Mencari dan membetulkan bug itu susah (baik bug sendiri maupun orang lain), jadi hal pertama yang perlu dicoba adalah: menghindari bug. Hal yang paling dasar adalah: kita perlu memecah program kita menjadi unit yang kecil (unit di sini berupa fungsi/kelas/method) dan menguji tiap bagian kecil tersebut. Istilahnya untuk ini adalah unit testing. Kita bisa menggunakan library tertentu untuk unit testing, atau panggil saja fungsi yang akan ditest.

Saya akan mengasumsikan Anda minimal sudah bisa membuat aplikasi yang bisa dicompile dan bisa dijalankan. Jika Anda masih salah syntax, salah opsi untuk mengcompile, dsb, sebaiknya ada mulai lagi dari nol dan mulai perlahan.

Dengan memecah program menjadi unit kecil dan mengujinya satu persatu, maka kesalahan umumnya bisa dilokalisasi: fungsi X ini masih salah. Pertanyaan berikutnya adalah: apa salahnya?

Asersi

Saat ini kebanyakan bahasa memiliki fitur assert. Fitur ini memungkinkan kita melakukan pengecekan ekstra (yang biasanya tidak akan dilakukan di versi produksi). Assert ini biasanya digunakan untuk menyatakan kondisi yang pasti harus benar, karena jika tidak benar maka titik program berikutnya akan error fatal.

Ini adalah contohnya:

assert(index >= 0);

val = values[index];

Jika index kurang dari 0, maka ada sesuatu kesalahan fatal di program kita (mungkin kesalahan logika, mungkin ada hal yang lupa ditangani). Jika asersi diaktifkan biasanya program akan berhenti dengan “Assertion error”.

Di berbagai bahasa assert ini bisa diaktifkan/nonaktifkan dengan opsi tertentu. Jadi dalam versi rilis kita bisa membuang berbagai pengecekan asersi ini.

Pesan dari Compiler dan Linter

Sebelum melihat jauh ke mana-mana, coba lihat dulu apakah ada warning dari compiler Anda. Contohnya untuk potongan kode C ini:

 int i;
 printf("i = %d\n", i);

Compiler memberitahu:

warning: ‘i’ is used uninitialized in this function [-Wuninitialized]

Bacalah pesan error dan warning dengan teliti. Di situ dijelaskan bahwa variabel i tidak diinisialisasi. Di C, variabel lokal nilainya tidak bisa diprediksi jika tidak diinisialisasi.

Selain compiler, biasanya ada program yang namanya linter untuk sebuah bahasa yang bisa memberi peringatan jika ada sesuatu yang dianggap tidak standar atau aneh. Anda bisa melihat daftar lengkap software semacam ini di Wikipedia. Sebagian software ini mudah sekali diinstall, dan sebagian lagi terlalu rumit, tapi beberapa IDE sudah memiliki linter built in. Saran saya: jika Anda masih belajar dan tools linter tersedia, pakailah dan perhatikan outputnya, jika terlalu sulit mensetupnya ya sudah lupakan saja untuk saat ini.

Print debugging

Lalu berikutnya cara paling primitif dalam debugging adalah dengan menuliskan nilai saat ini menggunakan: “print” “echo”, “printf” atau sejenisnya.

Contoh sederhana, misalnya kita punya conditional di Python seperti ini (melakukan regular expression matching):

if (re.search(PATTERN, x)): # do something

Lalu bagian aksi tidak pernah dieksekusi, atau cuma dieksekusi beberapa kali. Apakah Anda yakin patternnya benar? Coba print sebelumnya, jangan-jangan regexnya masih salah untuk input tertentu:

print "Input ", x, "Match result ", re.search(PATTERN, x)

Tentunya tidak semua aplikasi bisa punya layar yang menampilkan teks itu (contohnya Game, atau aplikasi grafik lain). Biasanya cara yang lebih baik adalah menggunakan library untuk logging yang saat ini sudah built in di banyak bahasa (misalnya ada modul logger di Python, java.util.logging di Java, dsb). Output logging bisa dikonfigurasi sedetail apa, dan outputnya ke mana (ke file, ke terminal, ke jaringan, dsb).

Logging tidak hanya untuk proses development. Banyak aplikasi menyediakan fungsi logging untuk mencatat berbagai hal yang berhubungan dengan aplikasi untuk mendebug jika ada masalah ketika dijalankan. Contohnya aplikasi bisa menampilkan di lognya: “berusaha melakukan koneksi database ke server XX port YY dengan username ZZ”, yang bisa diikuti dengan “Koneksi berhasil”, atau “Koneksi Gagal, pesan error: invalid username or password”.

Debugger

Debugger adalah tools untuk mencari bug. Di kebanyakan IDE (Integrated Development Environment), tools ini sudah built in dan mudah dipakai. Ada juga debugger stand alone, tapi biasanya ini lebih sulit bagi pemula.

Untuk menggunakan debugger pertama kita perlu mengeset breakpoint, yaitu titik berhenti sementara (break). Ketika kita mengklik “debug” maka debugger akan mulai menjalankan program sampai titik itu. Di beberapa bahasa, jika kita tidak mengeset breakpoint, maka program dihentikan sementara di titik awal.

Debugger paling dasar sekalipun akan memiliki fungsi untuk menampilkan nilai variabel saat ini. Dengan menggunakan ini kita biasanya tidak perlu mencetak dengan printf, tapi untuk mencetak objek yang kompleks, kadang tetap saja keluaran print masih lebih baik.

Fungsi debugger berikutnya adalah melakukan single stepping, artinya kita bisa menelusuri langkah demi langkah program. Contohnya jika kita memiliki source sederhana

diskon = 0.1

harga = 10000

harga = harga - (diskon * harga)

Kita bisa melakukan single step dan melihat nilai diskon dan harga di setiap langkah.

contoh

Jika kita memanggil fungsi lain, maka kita memiliki dua opsi, masuk ke dalam fungsi itu (istilahnya biasanya “step into”) atau memanggil fungsi itu, lalu segera meneruskan ke baris berikutnya (kita tidak peduli atau tidak ingin mendebug fungsi itu, istilah ini “step over”).

Jika fungsi yang akan kita cek sangat jauh atau hanya dipanggil di kondisi tertentu maka kita bisa menggunakan breakpoint. Biasanya di berbagai IDE ini bisa dilakukan dengan mengklik di samping nomor baris, dan akan muncul bulatan merah. Jika kita menekan tombol “continue”, maka program akan dijalankan dan akan dihentikan sementara di titik breakpoint tersebut.

Ada juga yang namanya “conditional breakpoint”. Artinya kita akan berhenti hanya pada kondisi tertentu. Misalnya kita ingin berhenti dalam loop setelah i > 100, karena di titik itu ada data yang aneh, maka kita bisa menambahkan kondiri “i>100”

conditional

Beberapa debugger memiliki fungsi yang menakjubkan, misalnya GDB mendukung reverse execution dan Visual Studio mendukung “Edit and Continue”. Untuk perubahan kecil, kita bisa mengubah program kita tanpa menghentikan debugger.

Di beberapa environment mensetup debugging tidak mudah, tapi ketika sudah terinstall ini akan sangat berguna sekali.

Debugger level Assembly

Untuk program biasa, Anda biasanya tidak akan pernah butuh mendebug sampai level ini, tapi jika Anda membuat eksploit atau berusaha mengeksploit binary, Anda perlu tahu ini (saya pernah membuat pengantar mengenai buffer overflow jika Anda tertarik).

Debugger di level assembly sebenarnya tidak berbeda jauh dari level source code. Jika kita punya source codenya, bahkan kita bisa melihat keduanya berdampingan. Di level assembly kita bisa menelusuri tiap instruksi dan juga melihat nilai register. Dengan melihat nilai register beserta flagsnya Anda bisa belajar banyak mengenai assembly.

Tools lain

Kadang debugger saja tidak cukup, tools analisis runtime seperti strace, ltrace, valgrind dsb akan berguna membantu menemukan bug terutama di kode native. Topik mengenai tools sudah pernah saya bahas sebelumnya.

Logika

Tools apapun tidak akan bisa membantu jika kita tidak punya logika yang baik. Dasar dari debugging adalah mencari kesalahan program, lalu membetulkannya agar berjalan sesuai harapan. Jadi di tahap paling awal, Anda sendiri harus tahu harapannya apa yang terjadi di setiap langkah.

Contohnya jika Anda mendebug algoritma mencari nilai maksimum, Anda perlu mengerti dulu seperti apa seharusnya algoritmanya dan apakah ketika dijalankan sudah sesuai harapan.  Dalam kasus ini, di langkah pertama seharusnya nilai maksimum adalah elemen pertama, di langkah kedua, jika nilainya lebih besar maka elemen ini yang jadi elemen maksimum (dan jika tidak, maka elemen pertama yang tetap menjadi maksimum), dan seterusnya untuk elemen berikutnya.

Penutup

Sebenarnya bisa panjang sekali bahasan mengenai bug software, artikel ini hanya sekedar perkenalan. Anda sebaiknya mendalami berbagai tools supaya lebih produktif dalam bekerja, dari mulai tools source control, editor, debugger, linter, build system (Makefile, CMake, Ant, Maven, atau apapun), maupun tools lainnya.

Untuk Anda yang baru belajar memprogram: jika Anda menggunakan IDE, sesekali tekanlah tombol debug (atau menu debug) dan cobalah bereksperimen menggunakan fungsi dasar seperti step into, step over, dsb. Ini akan sangat membantu Anda dalam belajar pemrograman.

 

 

Masuk Dunia Software Development

2016-03-07 (6)

Banyak orang yang ingin memasuki dunia software development, dan bertanya ke saya: saya perlu belajar bahasa/teknologi yang mana saat ini? Ada yang sudah kerja di IT lalu ingin masuk software development (ada yang di departemen IT, ada yang jaga warnet, dsb). Ada juga anak SMU yang nanya bahasa dan teknologi apa yang perlu dipelajari duluan, dsb. Di sini saya akan berusaha membahas pendekatan pembelajaran yang mungkin, dan sekilas teknologi yang ada saat ini dan kelemahan/kelebihannya dari sudut pandang pemula.

Hal pertama yang perlu Anda pikirkan adalah: apa motivasi Anda? ada yang karena ingin uang lebih karena membuat aplikasi bisa menghasilkan uang banyak, atau Anda ingin sekedar berkontribusi untuk opensource (yang dasar motivasinya juga banyak). Motivasi ini biasanya akan menentukan jalan apa yang bisa dipilih untuk menjadi developer.

Saya dan teman-teman saya dari tempat kuliah (informatika ITB) memiliki kelebihan karena dipandang “pintar”, dan pasti bisa belajar teknologi apapun (dan biasanya memang begitu karena sudah diajari dasar berbagai macam hal ketika kuliah). Dari tempat kami pertama bekerja, ada yang mendalami dan menjadi ahli di bidang yang spesifik (misalnya telekomunikasi, atau enterprise development), ada juga yang bosan dan berpindah bidang. Jadi bagi kami tidak ada kewajiban untuk memilih apakah perlu belajar Java dulu atau PHP dulu, lalu mencari kerja yang sesuai. Untuk kebanyakan orang lain, tentunya pendekatan tersebut biasanya tidak berlaku, tapi ada beberapa pendekatan lain yang mungkin.

Inti dari pendekatan untuk masuk dunia sofware development adalah membuat sofware. Tentunya sulit mencari kerja tanpa pengalaman. Jadi bagaimana mencari pengalaman tanpa bekerja di sebuah software house atau menerima proyek sebagai freelancer?

Pendekatan pertama yang saya lihat adalah melalui dunia opensource. Salah satu orang terkenal adalah Con Kolivas, seorang ahli anastesi, yang tidak punya background computer science, tapi sangat tertarik pada linux dan menjadi developer kernel Linux. Tentunya kecerdasan dan dedikasi orang tersebut luar biasa, tapi tidak perlu kontribusi ke proyek yang sangat high profile untuk bisa masuk melalui dunia opensource. Cara yang paling sederhana adalah dengan membuat plugin untuk berbagai proyek open source, seperti misalnya wordpress, joomla, dan berbagai software lain. Membuat plugin tidak melibatkan proyek utama, jadi mudah dilakukan. Jika sudah cukup confident, Anda juga bisa mengirimkan patch/pull request untuk proyek utama.

Pendekatan berikutnya adalah membuat app sendiri untuk dipublish melalui dunia app store. Ketika masih demam app store, banyak orang nekat terjun membeli buku atau mengambil kursus untuk memprogram iOS atau Android. Sebagian dari mereka sangat berhasil dan menjadi jutawan (dalam USD), dan sebagian gagal. Tapi pendekatan ini bisa berhasil karena: kita bisa membuat aplikasi yang kita mau, tidak dibatasi waktu, dan ada targetnya (menjual app).

Jika Anda ingin membuat aplikasi web, maka pendekatan di atas bisa diganti dengan membuat web app sendiri. Terserah Anda jenis web yang ingin Anda buat seperti apa. Anda juga bisa mencari teman yang bisnis online dan mencoba membantu membuatkan web app untuk teman tersebut.

Pendekatan lainnya, yang menurut saya agak berisiko adalah dengan nekat belajar teknologi tertentu saja, dan berusaha mencari pekerjaan yang berhubungan dengan teknologi tersebut. Anda bisa meyakinkan orang bahwa Anda mengenal teknologi tertentu dan mengambil proyek freelance sesuai teknologi tersebut, atau berusaha mengambil sertifikasi khusus teknologi tertentu (misalnya Java atau .NET) dan berusaha langsung mencari kerja dengan menggunakan sertifikasi itu.

Anda bisa melihat di posisi Anda saat ini apa yang bisa Anda gali untuk memulai. Mungkin Anda masih SMU jadi tahu apa kebutuhan anak-anak SMU dan bisa membuat app yang sesuai. Mungkin Anda bekerja di perusahaan tertentu dan bisa melihat app apa yang bisa dikembangkan untuk perusahaan jenis itu.

Memilih teknologi yang dipelajari adalah hal yang sulit: teknologi berkembang sangat cepat meski dasarnya masih sama. Saya ambil contoh teknologi Java. Teknologi ini ada sejak pertengahan 1990an, dan masih ada dan dipakai sampai sekarang. Tapi teknologi Java (meliputi bahasa, API, runtime environment) sudah berubah banyak. Berbagai fitur bahasa Java ditambahkan setiap kali versi major baru dirillis. Berbagai framework dan tools muncul dan dan mati bergantian. Untuk mengcompile saja ada beberapa pendekatan (manual, ant, maven, gradle), ada berbagai framework sisi server yang selalu silih berganti (struts, spring, grails, dan puluhan lain yang tidak saya ingat), belum lagi berbagai library yang perlu dikuasai, misalnya library apa untuk membuat PDF, library apa untuk memproses gambar, dan berbagai library lain. Belajar bahasa Java saja tidak cukup untuk membuat kebanyakan aplikasi real world, kita tetap perlu belajar framework, library, dan tools yang spesifik untuk aplikasi tersebut.

Penjelasan di atas hanya untuk memberi gambaran bahwa belajar bahasa saja tidak cukup, itu hanya awalnya saja. Hal yang penting ketika mempelajari sebuah bahasa adalah benar-benar memahami fitur-fiturnya, supaya tidak bingung ketika fitur itu dipakai di framework atau library tertentu.

Sekarang saya akan bahas beberapa teknologi dasar yang menurut saya perlu diketahui, lalu berikutnya berbagai teknologi yang bisa Anda pilih, sesuai dengan keadaan Anda.

Teknologi dasar pertama adalah SQL. Ini bisa dipelajari terpisah dari bahasa manapun. Semua aplikasi butuh penyimpanan, dan meskipun teknologi NoSQL mulai banyak dipakai, tapi SQL masih digunakan di mana-mana. Aplikasi server memakai berbagai DBMS (Misalnya SQL Server, MySql, Posgres), aplikasi mobile memakai SQLite, bahkan aplikasi browser bisa memakai WebSQL (saat ini disupport oleh Chrome, Safari, Opera).

Teknologi berikutnya adalah HTML/CSS dan JavaScript. HTML dan CSS dasar diperlukan karena banyak sekali user interface dibuat berdasarkan HTML/CSS. Aplikasi web tentunya memakai teknologi itu, tapi banyak app di desktop dan app store juga memakai HTML/CSS untuk user interfacenya. Mengenal javascript juga akan sangat berguna untuk membuat web yang interaktif, dan bahkan sekarang JavaScript juga bisa dipakai memprogram sisi server dengan NodeJS. Salah satu hal praktis yang bisa dibuat dengan HTML/CSS/JS adalah dengan membuat extension untuk browser (contoh extension browser yang terkenal adalah AdBlock).

Jangan lupa pelajari berbagai tools yang ada, terutama command line yang bisa dipanggil program lain. Ini akan sangat berguna untuk mengurangi pekerjaan memprogram. Anda bisa menulis beberapa ribu baris untuk meresize berbagai format gambar, tapi Anda bisa lebih gampang memanggil program imagemagick dari dalam program Anda untuk melakukannya dengan satu baris saja. 

Setelah itu Anda bisa memilih salah satu teknologi utama yang ingin Anda kuasai. Misalnya Anda bisa mendalami teknologi .NET (bisa melalui berbagai bahasa .NET misalnya C# atau Visual Basic .NET). Teknologi .NET saat ini cukup banyak dipakai di berbagai perusahaan besar. Teknologi ini sangat Microsoft centric, walau sekarang mulai dibuka sourcenya agar disupport di platform lain. Dari pengamatan saya, untuk teknologi Web tidak banyak perusahaan menengah atau kecil yang memakai .NET. Jika Anda memprogram aplikasi desktop untuk Windows, maka .NET merupakan pilihan yang bagus. Teknologi .NET bisa juga dipakai untuk memprogram mobile, terutama Windows Phone. Ada juga tools tambahan yang memungkinkan kita membuat program .NET yang jalan di Android ataupun iOS, tapi saya lebih menyarankan Anda memakai Java untuk Android dan Objective C atau Swift untuk iOS.

Alternatif teknologi .NET adalah Java. Java bisa dipakai untuk memprogram aplikasi desktop, mobile (Android), dan Web (Java 2 EE dengan berbagai teknologi dan framework yang ada). Cukup banyak juga enterprise yang memakai Java, apalagi karena Java ini bisa dideploy di berbagai OS, termasuk Linux (yang biaya lisensinya gratis). Dari pengamatan saya: bebereapa perusahaan besar memakai lebih dari satu teknologi (misalnya Java dan .NET sekaligus), karena mereka tidak ingin ditekan oleh vendor tertentu (kalau vendor berusaha menjual harga mahal, maka bisa bilang: saya switch aja deh ke teknologi yang satu lagi).

Anda bahkan bisa menjadikan HTML/JS/CSS menjadi teknologi utama Anda karena sekarang semua jenis aplikasi bisa diprogram dengan HTML/JS. Anda bisa membuat mobile app dengan Phonegap/Cordova, bisa membuat web app dengan menggunakan nodejs di sisi server.

Di sisi open source, ada berbagai alternatif. Yang saya maksud dengan open source di sini adalah open source yang tidak didukung perusahaan besar (Java dan .NET sekarang sudah open source juga). Teknologi PHP masih dipakai diberbagai perusahaan besar (misalnya facebook), tapi sekarang sebagian besar sudah diprogram menggunakan framework tertentu (Larave, CodeIgniter, Nette, dan ratusan framework lain), tidak seperti dulu di mana orang memprogram langsung PHP prosedural tanpa framework.

Meski di luar negeri sudah sangat populer, sepanjang pengetahuan saya penggunaan teknologi Python, Ruby dan lain-lain masih kurang di Indonesia. Mungkin karena tidak ada vendor tertentu yang berusaha menjual produk ke perusahaan (tidak seperti Java atau .NET) sehingga ini masih kurang populer. Jika Anda mau mengambil berbagai pekerjaan freelance dari luar negeri.

Jika Anda spesifik ingin membuat aplikasi iOS, maka sebaiknya Anda belajar Objective C atau Swift. Bahasa Swift lebih sederhana, tapi masih sangat berkembang (terutama sepanjang tahun lalu). Bahasa Swift ini cukup sederhana, tapi sangat Apple centric, dan ilmunya tidak berlaku untuk platform lain.

Selagi belajar teknologi tersebut, Anda sebaiknya belajar berbagai macam hal yang berhubungan dengan development, misalnya versioning (sekarang yang populer menggunakan Git), testing (tergantung teknologi apa yang Anda pakai), deployment (misalnya dengan docker), tools untuk setup development (misalnya dengan Vagrant), IDE (tergantung bahasa yang ingin dipakai). Teknologi-teknologi ini adalah pelengkap yang penting dipelajari, dan lebih mudah dipelajari sambil praktik.

Pertanyaan berikutnya adalah bagaimana cara belajarnya? Anda bisa membeli buku lalu membacanya (silakan dibandingkan sendiri, karena buku yang dianggap bagus oleh satu orang dianggap jelek oleh orang lain), Anda juga bisa mengambil kursus online baik di Coursera, EDX, Udemy, maupun yang lain. Jika Anda suka pendekatan video, banyak sekali tutorial gratis di youtube.

Setelah yakin dengan kemampuan Anda, Anda juga bisa mengambil berbagai sertifikasi. Saya sendiri tidak pernah mengambil sertifikasi pemrograman, jadi kurang tahu bagaimana pandangan perusahaan terhadap berbagai sertifikasi yang ada.

Keahlian yang paling dibutuhkan dalam memprogram adalah mencari jawaban atas error yang ditemui. Keahlian Anda mencari dengan Google akan sangat berguna. Situs stack overflow juga akan sangat membantu dalam menjawab berbagai pertanyaan Anda. Satu hal yang penting adalah: pahami berbagai istilah yang ada, ini akan sangat memudahkan ketika Anda mencari sesuatu menggunakan search engine.

Selamat memasuki dunia development software.

Membuat Bot Telegram

Messenger telegram masih kurang populer di Indonesia, padahal Telegram memiliki banyak kelebihan dibanding messenger lain, misalnya: lebih cepat, bisa diakses via web, sinkronisasi pesan, dsb. Salah satu fitur yang baru diperkenalkan oleh Telegram adalah bot. Bot adalah software yang secara otomatis merespon pesan yang kita berikan.

Setelah saya membuat bot Bot Alkitab, beberapa orang bertanya bagaimana caranya membuat bot. Dengan harapan Telegram jad lebih populer, saya tuliskan di sini dasar pembuatan bot.

Sebelum membaca Artikel ini, silakan baca dulu artikel dari telegram yang memperkenalkan soal bot, lalu bereksperimen lah dengan bot-bot yang sudah ada, supaya bisa mengerti fitur bot dan interaksi dengan bot:

https://telegram.org/blog/bot-revolution

Mendaftarkan Bot

Sekarang setelah siap membuat bot, langkah pertama adalah mendaftarkan nama bot kita. Ini dilakukan dengan menggunakan BotFather.

Perintah yang perlu digunakan adalah /newbot. Perlu diperhatikan bahwa semua bot harus memiliki akhiran “Bot”. Setelah selesai, kita akan mendapatkan token, semacam ini: 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11. Token ini tidak boleh disebar (karena orang lain bisa mengambil alih bot Anda).

botfather

Setelah didaftarkan, kita bisa langsung menambahkan bot di daftar teman kita.

daftar-teman

Ketika mulai chat, ada tombol “Start”

tombol-start

Jika kita tekan itu, yang terjadi adalah kita mengirimkan perintah “/start” ke bot (semua perintah bot dimulai dengan “/”).

pesan-pertama

Tapi kita belum menulis kode untuk bot kita, jadi bot kita belum bisa membalas apapun.

Menerima Pesan

Bot bisa menerima pesan dengan dua cara: polling dan webhook.

Polling artinya kita yang akan meminta pesan ke server telegram. Kira-kira begini: eh ada nggak pesan buat bot saya, kalo nggak ada, bilang aja nggak ada setelah N detik ya. Kalau dalam N detik ada pesan masuk, langsung berikan ke saya pesannya.

Cara kedua adalah dengan webhook. Kira-kira begini: ini saya punya URL, kalau ada pesan masuk, segera posting ke URL ini ya, nanti saya proses. URL ini harus HTTPS.

Telegram hanya mau mengantarkan pesan dengan salah satu cara di atas, tidak bisa keduanya, defaultnya adalah cara pertama.

Cara pertama cocok jika server dijalankan secara internal. Misalnya jika dijalankan di raspberry pi di rumah. Kita tidak perlu IP publik, tidak perlu punya domain, tidak perlu setup HTTPS, dsb. Cara ini agak sedikit lebih lambat dari cara kedua jika penggunanya banyak.

Cara kedua cocok jika Anda sudah punya web server eksternal dan sudah punya HTTPS, atau memakai layanan yang sudah memakai HTTPS (contohnya Google App Engine).

Pertama saya bahas cara polling karena ini sangat praktis ketika development. Pertama kita coba akses pesan yang diterima bot. Kita bisa meminta menggunakan browser seperti ini:


https://api.telegram.org/botTOKEN/getUpdates

Contohnya seperti ini:

getupdates

Sebenarnya ada beberapa parameter ekstra yang bisa kita tambahkan. Pertama adalah timeout: menyatakan berapa lama kita akan menunggu sampai ada pesan. Kedua adalah limit yang menyatakan berapa pesan yang ingin kita terima (max 100). Dan ketiga yang penting adalah offset.

Jika Anda coba refresh URL sebelumnya (tanpa memberikan offset), maka telegram tidak tahu apakah Anda sudah memproses pesan itu atau tidak (batasnya 24 jam). Untuk memberi tahu telegram bahwa pesan tadi sudah kita baca, kita perlu memberikan offset berupa update_id terakhir plus 1, jadi untuk mendapatkan pesan-pesan setelah pesan di atas, saya bisa menambahkan offset seperti ini (sekalian saya berikan contoh memberikan timeout dan limit):


https://api.telegram.org/botTOKEN/getUpdates?offset=142757037&timeout=2&limit=1

Hasil kembalian getUpdates seperti ini:

{"ok":true,"result":[{"update_id":142757036,
"message":{"message_id":3,"from":{"id":24912310,"first_name":"Yohanes","last_name":"Nugroho","username":"yohanesn"},"chat":{"id":24912310,"first_name":"Yohanes","last_name":"Nugroho","username":"yohanesn"},"date":1436950746,"text":"\/start"}}]}

Isi “result” adalah array of message (ada berbagai jenis message, bisa teks, video, dokumen, dsb, tapi dalam tutorial ini yang akan saya tangani hanya yang berisi “text”. Anda bisa membaca API Telegram untuk menangani jenis pesan yang lain.

Untuk membalas pesan, kita bisa menggunakan sendMessage. Anda bisa mencoba di browser (menggunakan token Anda) seperti ini (lihat chat_id di JSON di atas):


https://api.telegram.org/botTOKEN/sendMessage?chat_id=24912310&text=hello

Jika kita ingin menampilkan pesan sebagai balasan dari message tertentu, kita bisa menambahkan reply_to_message_id. Misalnya di atas tercantum message_id adalah 3:


https://api.telegram.org/botTOKEN/sendMessage?chat_id=24912310&text=hello&message_id=3

Jika kita menggunakan Python, kita bisa mendapatkan pesan updatenya dengan library requests (urllib juga bisa, tapi requests lebih enak). Karena URL requestnya sama semua prefixnya, saya membuat fungsi request_url untuk mempersingkat. Berikutnya agar singkat, saya hanya akan membahas PHP saja (dan Anda tetap bisa dengan mudah menerjemahkan ke Python).

def request_url(method):
    return  "https://api.telegram.org/bot"+TOKEN+"/" + method

def getUpdates(offset, limit=100, timeout=100):
    r = requests.get(request_url("getUpdates"),
                     params={"offset":offset,
                      "limit": limit,
                      "timeout": timeout
                      } )
    #asumsi semuanya OK
    result = json.loads(r.content)
    if result["ok"]:
        return result["result"]
    return []

Kode yang sama di PHP:

<?php

include("token.php");

function request_url($method)
{
	global $TOKEN;
	return "https://api.telegram.org/bot" . $TOKEN . "/". $method;
}

function get_updates() 
{
        $resp = file_get_contents(request_url("getUpdates"));
        $update = json_decode($resp, true);
         
?>

Kerangka sebuah program PHP command line (metode polling) yang menangani pesan adalah seperti ini:

<?php
include("token.php");

function request_url($method)
{
	global $TOKEN;
	return "https://api.telegram.org/bot" . $TOKEN . "/". $method;
}

function get_updates($offset) 
{
	$url = request_url("getUpdates")."?offset=".$offset;
        $resp = file_get_contents($url);
        $result = json_decode($resp, true);
        if ($result["ok"]==1)
            return $result["result"];
        return array();
}

function send_reply($chatid, $msgid, $text)
{
    $data = array(
        'chat_id' => $chatid,
        'text'  => $text,
        'reply_to_message_id' => $msgid

    );
    // use key 'http' even if you send the request to https://...
    $options = array(
    	'http' => array(
        	'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        	'method'  => 'POST',
        	'content' => http_build_query($data),
    	),
    );
    $context  = stream_context_create($options);

    $result = file_get_contents(request_url('sendMessage'), false, $context);
    print_r($result);
}

function create_response($text)
{
   return "definisi " . $text;
}


function process_message($message)
{
    $updateid = $message["update_id"];
    $message_data = $message["message"];
    if (isset($message_data["text"])) {
	$chatid = $message_data["chat"]["id"];
        $message_id = $message_data["message_id"];
        $text = $message_data["text"];
        $response = create_response($text);
        send_reply($chatid, $message_id, $response);
    }
    return $updateid;
}


function process_one()
{
	$update_id  = 0;

	if (file_exists("last_update_id")) {
		$update_id = (int)file_get_contents("last_update_id");
	}

	$updates = get_updates($update_id);

	foreach ($updates as $message)
	{
     		$update_id = process_message($message);
	}
	file_put_contents("last_update_id", $update_id + 1);

}

while (true) {
	process_one();
}
          
?>

Anda bisa mengakses sourcenya di sini:

https://gist.github.com/yohanes/987e1d48cbca9fde9377

Perhatikan bahwa ini perlu dijalankan di command line seperit ini:

$ php telegram-poll.php

Dan selama program masih berjalan, maka pesan yang masuk akan dibalas. Jika dijalankan di web server, maka akan timeout setelah beberapa detik/menit.

Isi file token.php hanyalah seperti ini:

<?php
$TOKEN="TOKENANDA";
?>

Untuk metode webHook, perbedaannya hanya pada fungsi get_updates, dan process_one tidak diperlukan, loop while juga tidak diperlukan, karena pesan akan dikirim satu per satu dengan POST. Kita cukup membaca POST yang masuk (dengan membaca php//:input), dan mendecode JSON-nya.

<?php
//bagian awal sama dengan sebelumnya

$entityBody = file_get_contents('php://input');
$message = json_decode($entityBody, true);
process_message($message);

?>

Source lengkap di:

https://gist.github.com/yohanes/3181a5424d10ea5e2429

Untuk menggunakan methode webHook, Anda harus melakukan beberapa hal:

  1. Mempersiapkan URL HTTPS
  2. Menset urlWebhook

Untuk bagian pertama: Anda perlu memiliki hosting yang mendukung HTTPS, Anda juga bisa memakai layanan cloudflare.com yang otomatis membungkus web Anda dengan https. Berikutya kita perlu mensetup web hook. Contohnya jika URL file php tersebut adalah:

http://cintaprogramming.com/xx.php

maka kita set dengan cara mengunjungi (menggunakan browser atau curl):

https://api.telegram.org/botTOKEN/setWebhook?url=https://cintaprogramming.com/xxx.php

Anda akan mendapatkan balasan:

{"ok":true,"result":true,"description":"Webhook was set"}

Jika ingin kembali menggunakan metode polling, maka set URL menjadi kosong:

https://api.telegram.org/botTOKEN/setWebhook?url=

Anda akan mendapatkan balasan:

{"ok":true,"result":true,"description":"Webhook was deleted"}

Atau jika memang belum diset:

{"ok":true,"result":true,"description":"There is no webhook to delete"}

Berikutnya terserah Anda bagaimana ingin memproses data masukan dari pengguna, misalnya bisa query ke database, bisa melakukan komputasi, dsb.

Jika kode Anda jalan di versi lokal/polling, tapi tidak ketika menggunakan webhook, maka Anda perlu mendebug. Pertama test apakah: webhook dipanggil oleh telegram (bisa dicoba dengan menuliskan isi $entityBody ke file). Kedua cek apakah Anda bisa memanggil send_reply. Beberapa hosting mematikan file_get_contents untuk mengakses HTTP/HTTPS, atau mendisable modul SSL (untuk kasus ini, mungkin harus diganti memakai modul curl) . Coba skrip paling sederhana di atas sebelum menambahkan kode custom Anda untuk reply (misalnya Anda mengakses MySQL, siapa tahu kode Anda yang error karena salah database atau salah query).

Saran saya: gunakan polling dulu sampai yakin sudah benar, setelah itu baru gunakan webhook.

Contoh ini sebenarnya adalah penyederhanaan sebuah kamus. Seharusnya bot ini membalas dengan definisi dari database, tapi di contoh ini bot selalu membalas dengan “definisi ” + KATA.

Sebuah bot bisa memiliki banyak perintah yang diawali dengan “/” (slash), terserah pembuat bot yang mendefinisikan. Misalnya jika kita membuat bot cuaca, kita bisa membuat perintah: “/cuaca NAMAKOTA” (untuk mendapatkan cuaca saat ini) atau “/ramalan NAMAKOTA” (untuk mendapatkan ramalan seminggu). Untuk menangani perintah-perintah ini kita bisa menggunakan parsing teks sederhana. Contoh parsing yang bisa dilakukan split teks menjadi kata-kata: jadikan kata pertama menjadi lower case, dan trim (hapus spasinya), lalu cek apakah sama dengan “/cuaca” atau “/ramalan”. Dan berikutnya lakukan aksi sesuai dengan perintahnya.

Setelah kita memiliki perintah-perintah tersebut. Kita bisa mendaftarkan perintahnya ke BotFather supaya Telegram bisa melakukan autocomplete perintah ketika user mengetikkan karakter /.

Demikian tutorial singkat bot Telegram. Jika ada pertanyaan, silakan tinggalkan di bagiann komentar, dan akan berusaha saya jawab (atau mungkin akan saya buatkan tutorial bagian kedua untuk menjelaskan lebih detail).

Programming dan Penetration Testing

Pentest adalah kegiatan menyerang sistem komputer untuk mencari kelemahan security, atau dari Wikipedia:

A penetration test, or the short form pentest, is an attack on a computer system with the intention of finding security weaknesses, potentially gaining access to it, its functionality and data.

Pentesting dilakukan atas permintaan client, jadi bukan hacking ke sembarang website. Contoh sederhana pentesting seperti ini: coba jebol website perusahaan kami, apakah ada bug securitinya? atau: coba pergi ke lobi atau tempat parkir perusahaan kami, apakah ada WIFI terbuka, apakah dari situ bisa masuk ke sistem internal perusahaan kami?. Kami punya app mobile, apakah bisa “dijebol” (misalnya apakah kita bisa membuat request ke server supaya memberikan data user lain).

Karena ini blog mengenai programming, saya tidak akan membahas banyak mengenai pentesting, hanya ingin menunjukkan betapa keahlian programming bisa sangat berguna untuk pentesting. Dari contoh yang saya sebutkan di atas, scope dari pentesting bisa sangat banyak, mulai dari yang on site: datang dan mengecek kabel, wireless network, dsb, sampai ke level network dan aplikasi (baik web, desktop, mobile). Saya hanya ingin membahas aspek programming, untuk mendorong peminat bidang security agar mau belajar programming.

Perkiraan saya mungkin sekitar 70% pekerjaan pentesting bisa dilakukan dengan tools yang sudah tersedia, baik yang open source maupun komersial, tanpa butuh keahlian scripting ataupun programming. Sisanya bakal butuh programming. Bahkan saya yakin 100% beberapa jenis bug tidak bisa ditemukan tanpa keahlian programming.

Screenshot_2014-11-27-18-19-36

Kemampuan programming minimal yang dibutuhkan adalah bisa mengcompile atau menjalankan program dalam berbagai bahasa. Kadang di sebuah server tidak tersedia tool tertentu, jadi kita perlu mengcompile dari source karena OS di server itu sudah terlalu lama (misalnya masih banyak yang memakai RHEL 4). Jika tidak tahu bagaimana menjalankan sesuatu, maka sudah game over di titik ini. Pernah saya baca di blog pak Budi Rahardjo mengenai kompetisi CDC (Cyber Defense Competition):

Salah satu soal yang disampaikan adalah men-decode data base64 yang kemudian menjadi skrip Python, yang tinggal dijalankan. Lucunya ada banyak yang gak tahu Python. ha ha ha. Mereka kebingungan menjalankannya. Padahal tinggal “python namaskrip.py”. Mereka tidak perlu tahu bahasanya. hi hi hi. Ada yang pura-pura tahu dan me-rename menjadi bahasa C, menambahkan “#include ” dibagian awalnya, kemudian mencoba compile. Ya gak bakalan jalanlah. he he he.

Kejadian semacam di atas itu yang mendorong saya menulis tulisan seperti ini.

Keahlian lain adalah mencari program atau menulis program kecil dalam bahasa tertentu yang kadang tidak terlalu umum atau sudah kuno. Contoh: jika sebuah web server bisa menerima upload file, dan web server itu hanya bisa menjalankan ASP versi klasik, ya kita harus bisa mencari shell dalam ASP Classic (bukan ASP.NET). Berbeda dengan software development biasa di mana kita bisa memilih bahasa pemrograman atau teknologi yang ingin kita pakai, di sini kita dipaksa mengikuti apa yang tersetup di server.

Jika beruntung, sudah ada orang yang menuliskan program standar (web shell) yang memiliki fungsi seperti “file manager/file upload” (untuk mengupload tool tambahan), “shell” (untuk mengeksekusi command apapun di sisi server), dan “database shell” (untuk mengirimkan query apapun ke database). Jika tidak beruntung, atau ada batasan tertentu di server, mungkin kita perlu membuat tool baru. Contoh sederhana: jika server membatasi upload hanya 100 KB saja, sementara binary nmap yang ingin diupload (plus librarnya) besarnya beberapa megabyte, maka kita perlu membuat program kecil untuk mengupload parsial lalu menggabungkan hasil uploadnya.

Keahlian membaca kode dalam berbagai bahasa juga diperlukan. Dalam beberapa kasus, kita bisa mendapatkan akses ke source code aplikasi web (karena bug, karena salah konfigurasi, karena lupa ikut mengupload direktori “.git”, dsb). Setelah punya source code, kita bisa menemukan bug tambahan dengan membaca kodenya. Sebagai pentester, tentunya Anda tidak akan bilang: wah ternyata dia pake Python, saya nggak tau cara ngehack aplikasi web dengan Python.

Dengan membaca source code, hal paling minimal adalah mengerti di mana file konfigurasi supaya bisa mengekstrasi user/password database, berikutnya adalah mencari bug-bug tambahan seperti SQL Injection, hidden functionality, dsb.

Dengan maraknya OS Mobile, sekarang pentesting juga masuk ke ranah mobile. Di sini ilmu reverse engineering sangat diperlukan. Untuk OS Android, reverse engineering bisa dilakukan dengan decompiler yang bisa mengembalikan kode Java ke bentuk semula (kecuali sudah diobfuscate), jadi kembali keahlian membaca kode diperlukan.

Setelah mengetahui kodenya, biasanya kita perlu melakukan fuzzing request, alias mencoba-coba berbagai kemungkinan request. Untuk aplikasi berbasis HTTP, kita masih bisa memakai proxy (misalnya ZAP) dan mengubah-ubah request untuk tahu reaksi server (bagaimana jika nilaiya negatif, bagaimana jika nama file mengandung “../”, dsb). Tapi untuk aplikasi yang memakai protokol khusus via SSL, kita perlu memahami, lalu mengimplementasikan ulang client sendiri yang bisa melakukan fuzzing.

Pengetahuan mengenai best practice dalam sebuah bahasa juga diperlukan dalam membuat aplikasi yang aman. Contoh: untuk menghasilkan bilangan random untuk kriptografi di Java gunakan SecureRandom (jangan Random). Di Android untuk melakukan koneksi SSL menggunakan socket, jangan gunakan SSLFactory tapi gunakan SSLCertificateSocketFactory, dsb. Pekerjaan pentester cukup mudah di sini, hanya menyarankan saja, dan programmer yang akan mengimplementasikan saran tersebut.

Saya sudah banyak menemukan bug yang memerlukan banyak coding. Ada bug yang terkait dengan penyimpanan password (terenkripsi) yang disimpan lokal di device yang seharusnya aman, tapi ternyata saya bisa membuat tool yang cukup optimal untuk bisa mengcrack dalam 1 jam karena banyak hal kecil yang lupa dilakukan oleh programmer (lupa menginisialisasi IV, memakai EBC). Saya pernah menemukan bug fatal yang berhubungan dengan menggunakan algoritma hashing yang tidak aman (tidak memakai Cryptographic Hash Function). Dengan tools yang tersedia saja, tanpa pengetahuan programming (dan kriptografi), kedua bug itu tidak akan bisa ditemukan.

Jadi saran saya: untuk mereka yang tertarik di bidang security, pelajari juga bagian programmingnya. Ini saya masih bicara level pentesting yang kebutuhkan programmingnya masih minimal. Di bagian lagin security, keahlian programming lebih dibutuhkan lagi, misalnya membuat exploit butuh pemahaman yang lebih mendalam tentang sistem dan low level programming.

Dalam full security audit, selain pentesting kadang client menginginkan juga review kode mereka, jadi kita perlu bisa membaca, menjalankan, dan memberi saran yang berkaitan dengan security.

Buat saya sendiri sebagai programmer, saya jadi rajin membaca mengenai best security practice untuk berbagai bahasa dan framework. Jika ada yang bertanya: buat apa sih belajar bahasa X atau teknologi Y, saya bisa bilang: mungkin suatu saat ada sistem yang memakai teknologi itu yang perlu saya test.

Menjual Aplikasi di Appstore

Dulu waktu saya masih kuliah, menjual aplikasi tidaklah semudah sekarang. Waktu saya kuliah, pemrograman mobile masih cukup baru. Menjual aplikasi baik desktop maupun mobile juga tidak mudah (sekarang berbagai metode pembayaran sudah tersedia). Biasanya yang saya kerjakan adalah mencari proyek.

playstore

Saya punya saran bagi mahasiswa yang saat ini masih kuliah: cobalah membuat aplikasi, minimal satu dan menjualnya di sebuah application store. Mengapa saya menyarankan orang menjual aplikasi di sana? Tujuan utamanya adalah untuk belajar. Menurut saya ada banyak sekali yang bisa dipelajari dari menjual aplikasi di app store. Pelajaran ini bukan cuma dari sisi programming, tapi keseluruhan software development lifecycle.

Catatan: Biasanya orang-orang mengasosiasikan “App Store” dengan apple, dalam konteks artikel ini “App Store” adalah sembarang application store (misalnya Apple App Store, Nokia OVI, BlackBerry Appworld, Google Play, dsb).

Sejak “demam app store” banyak orang (termasuk non programmer) yang belajar memprogram dan berusaha membuat aplikasi yang laris agar menjadi jutawan. Memang mungkin menjadi jutawan dengan menjual aplikasi, tapi saran saya: jangan jadikan itu tolok ukur kesuksesan. Anda bisa tetap sukses belajar meskipun tidak menjadi jutawan dari appstore.

Apa saja yang bisa dipelajari dari menjual aplikasi di app store? pertama dari sisi programming: Anda belajar bagaimana memoles dan mempaketkan aplikasi supaya bisa dijual. Anda akan belajar membuat aplikasi yang layak pakai oleh end user. Kadang untuk proyek tertentu (misalnya proyek pemerintah), aplikasi yang dibuat asal jadi, asal memenuhi spesifikasi.

Ketika Anda punya pengguna, Anda akan belajar bagaimana berinteraksi dengan pengguna. Anda akan menghadapi bug report, feature request, pujian, dan juga cacian. Bahkan jika Anda membuat game yang amat bagus sekalipun, bisa ada yang protes dan memberi review 1 bintang karena mereka “stuck di level 5”. Jika aplikasi Anda cukup kompleks, akan ada bug yang hanya muncul di user tertentu, dan Anda belajar mendebug bersama pengguna aplikasi Anda.

Setelah ada perbaikan, Anda akan bisa merilis update software Anda (meluncurkan versi baru). Setelah Anda merilis beberapa versi, Anda akan sadar perlunya memakai versioning system. Bagi Anda yang belum memakai versioning system (Git, CVS, dsb), maka ini saat yang baik untuk belajar.

Setelah merilis aplikasi, jangan berhenti dan menunggu. Belajarlah mempromosikannya. Pertama: buatlah website untuk aplikasi Anda, bisa berupa halaman blog, atau mungkin Facebook page. Anda perlu belajar membuat teks dan screenshot yang menarik dan bahkan mungkin perlu membuat video. Setelah itu promosikan di media sosial seperti Twitter dan Facebook. Hubungi juga situs-situs komunitas dan mailing list komunitas. Anda akan belajar bagaimana mengirim email mempromosikan produk Anda.

Di titik ini Anda bisa mengetahui apakah Anda tertarik pada marketing atau tidak. Anda mungkin akan bereksperimen dengan harga yang berbeda, bereksperimen menggunakan iklan, menggunakan in app purchase, dan sebagainya. Jika Anda membuat aplikasi bagus, memasarkan dengan baik, dan beruntung, Anda bisa mendapatkan pendapatan lumayan dari app store ini dari mulai sekedar puluhan ribu rupiah sampai puluhan juta tiap bulannya.

Saya menambahkan kata “beruntung” karena kadang memang butuh keberuntungan supaya aplikasi sukses di pasaran. Kata “beruntung” juga sebagai penghibur bahwa kadang-kadang aplikasi yang sudah sangat bagus dan dipasarkan dengan mati-matian masih bisa gagal di appstore. Sedangkan aplikasi sangat sederhana kadang bisa sangat sukses. Jadi kadang bukan kesalahan pembuat aplikasi dan bukan kesalahan marketing. Bisa saja di saat yang bersamaan, ada aplikasi serupa yang sedang dipasarkan perusahaan yang lebih besar.

Tergantung app store mana yang Anda pilih, Anda mungkin harus menandatangani perjanjian tertentu. Anda akan belajar mengenai revenue sharing, pajak, sistem pembayaran, dsb. Anda akan belajar bahwa ada app store yang harganya sama di seluruh dunia (misalnya harga aplikasi 0.99 USD akan sama di manapun juga di dunia), tapi ada juga yang memvariasikan harga tergantung wilayah pembeli (misalnya: di Nokia Ovi Store harga 0.99 EURO di Eropa bisa menjadi 0.3 USD di India).

Sebagai perbandingan: mencari proyek software itu gampang-gampang susah, baik dari proses mencari, mengerjakan, sampai mengejar pembayarannya. Appstore itu sangat gampang: Anda bisa masuk ke app store dengan gratis (misal Blackberry), sekali bayar (25 USD untuk Google Play), atau per tahun (99 USD/tahun, Apple AppStore). Anda bisa langsung menjual app dengan mudah, tidak ada yang memburu deadline, pembayaran juga langsung masuk rekening (tidak perlu menagih).

Selain mendapatkan pengalaman, Andaikan tidak ada yang membeli aplikasi Anda, Anda tetap memiliki portfolio. Sudah banyak sekali penawaran pekerjaan dan proyek yang saya terima karena ada orang yang melihat aplikasi yang saya buat. Ini cukup wajar. Misalnya ada seseorang yang ingin membuat aplikasi resep masakan, mereka akan mencari orang yang sudah pernah membuat aplikasi sejenis itu.

Saya sendiri kurang sukses secara langsung dari appstore, tapi cukup banyak mendapat tawaran proyek karena aplikasi yang saya pajang di appstore. Walau demikian, secara langsung dari appstore ada pendapatan ekstra belasan sampai puluhan dollar sebulan yang cukup untuk membayar hosting, atau kadang-kadang membeli satu dua barang online untuk dioprek. Dapet 5 USD? cukup buat beli Arduino atau makan siang yang enak, 35 USD? bisa beli Raspberry Pi, atau duitnya bisa juga dipinjamkan jika tidak tau ingin diapakan.

Mengajarkan pemrograman pada anak-anak

Anak saya yang sekarang ini usianya 4 tahun sudah mulai saya ajari memprogram dengan tutorial dari code.org. Mulanya anak saya iseng meminjam laptop saya, dan dia bermain-main, katanya dia sedang “mrogram”, jadi ternyata dia mau “play pretend” jadi programmer. Karena code.org menyediakan pelajaran untuk usia 4+, saya perkenalkan dia pada situs tersebut, dan dia sangat menyukainya.

IMG_0635

Mungkin sebagian dari Anda bertanya-tanya: ngapain sih anak-anak diajari programming? Apa gunanya? kenapa nggak diajarin nanti aja? Nanti jadi orang yang lebih dekat dengan mesin daripada manusia lain?

Sejak 2 tahun yang lalu, saya sudah membeli dan membaca buku Seymour Papert, yang berjudul, Mindstorms: Children, Computers, And Powerful Ideas.  Sebenarnya saya ingin menuliskan review yang panjang mengenai bukunya, tapi sudah ada orang lain yang menuliskannya dengan cukup detail. Jadi akan saya ceritakan secara singkat saja.

Buku ini ditulis tahun 1980 dan direvisi tahun 1993. Buku ini ditulis oleh pionir AI, yang pernah bekerja sama bertahun-tahun dengan Jean Piaget, seorang psikolog dan filosofer yang terkenal karena studi epistemologi pada anak-anak (epistemologi = teori  mengenai pengetahuan). Jadi buku ini dituliskan oleh orang yang benar-benar mengerti ilmu perkembangan anak, dan yang benar-benar mengerti mesin.

Belajar memprogram adalah belajar membuat instruksi yang logis dan  terperinci, jadi ini melatih logika anak. Ketika belajar membuat program, kita akan membuat kesalahan, di sini kita akan belajar debugging.  Ketika belajar memprogram, seseorang tidak belajar mengenai “benar”, dan “salah”, tapi “apakah ini bisa diperbaiki?”, dan “bagaimana cara memperbaikinya?”.

Ilmu pemrograman sangat dekat dengan ilmu matematika, tapi dari sisi praktis. Bahasa pemrograman Logo yang dirancang oleh Seymour Papert merupakan salah satu contoh pendekatan pengajaran matematika melalui program.

Ilmu yang dipelajari dalam pemrograman bisa diaplikasikan dalam hidup sehari-hari . Di buku Mindstorm, contoh yang diberikan adalah juggling. Keahlian yang sepertinya sulit ini ternyata bisa dipelajari langkah-langkahnya secara detail, dan jika kita membuat kesalahan, bisa didebug. Tentunya ini tidak cuma berlaku untuk juggling, segala macam aktivitas dan proses bisa dipecah menjadi langkah-langkah sederhana, dan bisa didebug.

Mengenai ketakutan bahwa anak-anak akan lebih dekat pada mesin: menurut saya ketakutan ini tidak terlalu beralasan.  Sejauh ini saya melihat bahwa orang-orang komputer di berbagai komunitas yang saya temui (komunitas network, programming, dan security), semuanya  memiliki banyak teman. Saat ini, anak sayapun lebih suka bermain dengan orang daripada dengan mesin.

Menurut saya, orang-orang yang kurang bisa bersosialisasi adalah karena orang itu introvert, jadi tidak peduli bidangnya komputer atau bukan. Orang introvert mungkin lebih banyak yang tertarik pada dunia komputer karena lebih nyaman bagi mereka berada di depan komputer. Jadi bukan komputer yang membuat orang menjadi introvert, tapi orang introvert yang lebih tertarik pada dunia komputer.

Tentunya mengajarkan pemrograman pada anak adalah keputusan orang tua, dan juga tergantung pada kemampuan dan kesukaan anak. Sebagai orang tua yang mengerti komputer (dan berusaha banyak membaca mengenai perkembangan anak), saya merasa bahwa pelajaran pemrograman ini berharga, dan anak saya merasa ini adalah hal yang menyenangkan.

Saya bukan orang tua yang ingin memaksa anaknya mengikuti jejak saya. Saya akan sangat senang jika anak saya mengambil bidang lain (misalnya kedokteran), tapi bisa menggabungkannya dengan ilmu pemrograman. Tapi jika dia mengambil jalan lain yang tidak ada hubungannya dengan pemrograman pun, saya tidak keberatan.

Perlu dicatat, bahwa logika dan pemrograman hanya salah satu dari banyak hal yang saya ajarkan pada anak saya. Saya tutup dengan quote dari Seymour Papert:

“I FEEL VERY DEEPLY COMMITTED TO THE IDEA that, although rationality isn’t everything, and passion and interests and faith of various sorts count as much–nevertheless, rationality is a force for the good, and the more people that are capable of rational, critical thinking–the better the world will be; the more that have access to knowledge about the rest of the world–the better the world will be.”

–Seymour Papert, Mathematician, Computer Scientist, Educator – 2007 Interview – One Laptop Per Child

Untuk mereka yang putus asa mau jadi programmer

Sudah beberapa kali saya temukan di berbagai forum dan mailing list, orang-orang yang bertanya: kenapa program saya ini tidak jalan, dan kemudian mereka mempaste source code mereka. Biasanya saya akan menemukan kesalahan-kesalahan super fatal, mulai dari:

  1. Salah syntax
  2. Salah besar-kecil huruf di bahasa yang case sensitive (misalnya C)
  3. Salah logika

Saya bisa memahami bahwa orang-orang ini mungkin:

  1. Salah memilih jurusan Informatika/Ilmu komputer, atau
  2. Terpaksa mengambil kuliah pemrograman karena ini mata kuliah wajib meski jurusannya tidak langsung berhubungan dengan pemrograman

Untuk orang-orang dalam kategori pertama: sudah saatnya Anda memperbaiki cara belajar Anda, atau segeralah pindah jurusan. Jika Anda kesulitan mencari kerja karena Anda tidak bisa memprogram, itu murni kesalahan Anda.

20160409_113910 (1)

Untuk orang-orang dalam kategori kedua, saya akan berusaha memberikan panduan amat sangat dasar mengenai cara belajar memprogram, supaya setidaknya Anda bisa lulus kuliahnya. Orang-orang yang punya bakat memprogram tidak perlu belajar dengan cara ini.

Pertama: cobalah mengetik ulang banyak program, mengcompile dan menjalankannya.  Kalau perlu, cobalah mengetik satu bagian demi satu bagian, lalu compile. Nanti Anda akan dapat feeling mengenai: nama-nama fungsi, pentingnya besar kecil huruf, dan hal-hal kecil lainnya.

Ketika program sudah jalan, cobalah “merusak” programnya. Perhatikan apa pesan errornya ketika salah nama variabel, ketika kurang tanda kurung, dsb, jadi ketika ada error serupa, Anda tahu sebabnya apa.

Ketika membuat program baru, jangan langsung mengetikkan semua program sampai selesai, lalu baru dicompile. Misalnya untuk membuat stack dalam C, cobalah buat dulu bagian typedef, bagian inisialisasi stack, dan bagian main. Coba compile, ketika sudah benar, coba tambahkan “push” lalu compile, coba tambahkan “print” untuk mencetak isi stack, compile, test apakah sudah jalan atau belum. Coba tambahkan “pop”, compile dan lihat hasilnya sudah benar belum, dst.

Intinya adalah: memprogram perlu dilakukan selangkah demi selangkah. Jika Anda berusaha mengetik semuanya, baru dicompile, maka Anda akan bingung sendiri.

Selanjutnya cobalah mencari video tentang cara memakai debugger. Ini akan sangat membantu Anda mengetahui jalannya sebuah program, Anda akan tahu bagaimana nilai variabel berubah, dan Anda akan tahu di mana program Anda crash (biasanya jika Anda membuat program dalam bahasa C, akan crash). Dengan menggunakan tools yang modern seperti XCode atau Visual Studio, Anda bisa mulai menggunakan debugger dengan sangat mudah (dengan satu klik atau dua saja).

Jika Anda mau melakukan hal-hal tersebut, semoga Anda bisa lolos mata kuliah pemrograman dan mungkin bisa menemukan jalan Anda sebagai programmer.

 

Catatan: Lihat juga link “Kurikulum Pemrograman” dan “Cara Belajar Algoritma

 

 

Single Board Computer dan Single Board Microcontroller

 Belajar embedded system merupakan cara yang baik untuk lebih mengenal arsitektur komputer. Di PC/Tablet/Smartphone, ada begitu banyak “layer” yang mempersulit pemahaman kita tentang hardware, tapi di embedded system, kita bisa langsung berinteraksi dengan hardware, bahkan tanpa menggunakan sistem operasi sama sekali.

Saat ini ada dua jalur populer untuk belajar embedded system: menggunakan single board computer (misalnya: Raspberry Pi, BeagleBoard, BeagleBone Black, Cubie Board, RadXa, dsb), atau menggunakan single board microcontroller (misalnya: berbagai versi Arduino, Parallax Propeller, LaunchPad MSP430, dsb).  Singkatan SBC untuk single board computer sudah lazim digunakan, tapi single board microcontroller  biasanya tidak disingkat, tapi supaya artikel ini ringkas, akan saya singkat saja sebagai SBM.

Perlu diperhatikan bahwa saya menekankan pada kata populer, Anda tidak harus menggunakan SBM atau SBC untuk belajar embedded system, tapi keduanya akan membuat proses belajar menjadi lebih mudah.

Banyak pemula merasa bingung memilih dan membedakan fungsi keduanya. Jika Anda melihat berbagai proyek elektronik di Internet, sepertinya fungsi dan kemampuan keduanya hampir sama.   Untuk lebih jelasnya, saya akan membahas keduanya. Continue reading Single Board Computer dan Single Board Microcontroller

Safari Books Online + Review Buku

Saya sekedar mau sharing layanan Safari Books Online (ini saya nggak dibayar, nggak dapet referal atau apapun). Layanan ini semacam perpustakaan di mana kita bisa meminjam buku selama menjadi member.

Paket termurahnya 9.99 USD/bulan, kita mendapatkan 5 slot buku yang bisa kita baca penuh. Setelah memasukkan sebuah buku ke dalam sebuah slot, bukunya hanya bisa dikeluarkan 30 hari kemudian. Kita bisa membaca bukunya offline menggunakan aplikasi yang mereka sediakan (untuk iOS/Android/BlackBerry). Mereka juga menyediakan trial 15 hari (tapi kita harus memberikan nomor kartu kredit).

Bagi sebagian orang, layanan ini tidak cocok, karena mereka ingin terus memiliki satu buku untuk dibaca ulang, tapi bagi saya yang jarang membaca ulang sebuah buku (kalau ada bagian penting, bisa saya copy paste), layanan ini sangat cocok.

Kenapa saya mau sharing hal tersebut? Harga sebuah buku asli sangat mahal, bahkan versi ebooknya sekalipun. Contohnya buku SDN: Software Defined Network harganya 47.99 (menurut kurs saat ini: lebih dari 500 ribu rupiah). Buku tersebut bisa dibaca sebagai satu slot dalam pakt 9.99 USD per bulan. Saya ingin hidup legal, tapi juga belum mampu membeli segala sesuatu yang saya inginkan.

Saya sedikit menyesal, kenapa tidak menemukan layanan ini dari dulu. Saya pernah mencicipi akses ke layanan ini ketika jadi member ACM, tapi jumlah buku yang ada sangat sedikit (beberapa ratus buku saja), dan waktu itu belum bisa offline. Beberapa buku yang sudah saya baca (sudah saya beli) ternyata ada di sini. Jadi sekalian di posting ini saya ceritakan beberapa buku yang menarik (yang saya miliki dan sudah saya baca) yang bisa ditemukan di Safari Books Online:

Tangled WebThe Tangled Web oleh Michal Zalewski. Buku yang sangat bagus yang membahas semua aspek security Web, dari mulai protokol HTTP sampai semua aspek browser. Bacaan wajib untuk orang yang berkecimpung di dunia web. Buku ini bukan untuk orang yang benar-benar pemula, dibutuhkan pengetahuan dasar mengenai protokol HTTP, tentang HTML, dan juga tentang JavaScript.

9781597492997_s-stealing-network
Stealing the Network: The Complete Series Collector’s Edition
Sebenarnya ini tadinya 3 buku novel yang dijadikan satu. Saya baru selesai membaca bagian pertama dan setengah bagian kedua. Buku ini bagus karena menjelaskan masalah security dalam bentuk cerita yang menarik. Di bagian pertama (buku pertama), ceritanya terpisah (seperti kumpulan cerpen), di buku selanjutnya, ceritanya memiliki hubungan.

9780735634688_s-code
CODE
Buku ini membahas hal yang amat dasar sekali, bagaimana informasi diproses dari mulai manipulasi bit. Buku ini berbeda dari semua buku pengenalan komputer yang lain, caranya bercerita sangat menarik, penjelasannya sangat sederhana. Buku ini sangat cocok untuk pemula.

Sebenarnya saya tidak menemukan hal yang baru di sini (karena saya sudah mengerti semuanya), tapi saya membacanya sampai habis karena saya mengagumi caranya bercerita. Suatu hari saya ingin bisa menjelaskan ke anak saya seperti ini.

9781118107874_s-app-empire
App Empire: Make Money, Have a Life, and Let Technology Work for You
Buku ini menjelaskan mengenai bagaimana mendapatkan uang yang banyak dari aplikasi mobile. Banyak triknya yang tidak berlaku lagi (dan menurut saya mengesalkan bagi pengguna aplikasi), tapi buku ini memberikan pencerahan pada saya mengenai berbagai trend di dunia mobile. Buku ini banyak menjual mimpi, tapi mungkin bisa memotivasi Anda untuk mempertimbangkan dunia mobile.


Don’t Make Me Think!: A Common Sense Approach to Web Usability, Second Edition
Selain mengenai teknik pemrograman, saya juga suka membaca buku mengenai usability. Buku ini cukup ringkas dan menjelaskan dengan baik berbagai aspek usabilitas dalam web, walaupun masih kurang membahas teknologi terbaru (buku ini tahun 2005). Sebagian besar hal yang dijelaskan sangat obvious, tapi Anda akan menyadari betapa banyaknya website yang tidak memperhatikan usabilitas.

9781430219484_s-coders-at-workCoders at Work: Reflections on the Craft of Programming. Buku ini isinya kumpulan cerita dan pandangan hidup banyak programmer. Di sini kita bisa melihat bahwa para programmer hebat memiliki pandangan hidup yang berbeda dalam memandang masalah pemrograman. Tidak ada kebenaran absolut dalam hal pemrograman, tidak ada gaya yang paling benar. Anda bisa melihat review yang lebih lengkap yang sudah pernah saya tuliskan sebelumnya di situs ini.

Meski koleksi bukunya sangat banyak, ada juga buku-buku yang tidak ada di sana. Kali lain akan saya tuliskan buku-buku menarik yang tidak saya temui di sana.