_| _| _|_| _|_|_| _|_|_| _|_| _|_|_|_| _|_|_| _|_| _|_|_|_| _| _| _| _| _| _| _| _| _| _|_|_|_| _| _| _| _| _| _| _| _| _| _| _| _|_|_| _|_|_| _| _| _|_| _|_|_|_| _| _| _| _|_|_| ECHO MAGAZINE VOLUME VIII, ISSUE XXII, PHILE 0x005.TXT Cara Praktis Cracking Aplikasi Mac OS X - grumpy grumpy/at/console ---[ Pendahuluan Cracking aplikasi komputer termasuk ke dalam ranah yang sangat unik dan menarik. Tulisan ini membahas bagaimana melakukan cracking aplikasi secara praktis dengan platform Mac OS X dan yang digunakan sebagai contoh adalah aplikasi text editor populer TktMt dan sejumlah aplikasi games dari BFG. Sebagai penghargaan terhadap pemilik dan pengembang aplikasi-aplikasi yang menjadi target dan menghindari indexing dari bot mesin pencari, saya akan menggunakan alias untuk merujuk ke aplikasi-aplikasi tersebut. Silakan melihat bagian kata kunci untuk mengetahui aplikasi apa saja yang menjadi target. Sebagai peringatan, tulisan ini lebih ditujukan guna memberikan pemahaman bagaimana model copy protection dari aplikasi digunakan untuk menciptakan model pengamanan yang lebih baik dikemudian hari dan bukan mendukung aktifitas ilegal. Selain itu, tulisan ini juga bertujuan untuk mengilustrasikan bahwa ada cukup banyak hal yang berhubungan dengan hacking/cracking yang dapat dilakukan dengan cara-cara praktis, membuktikan bahwa hacker/cracker akan menempuh jalan yang paling mudah untuk mencapai tujuannya. ---[ Arsitektur Aplikasi Mac OS X Mac OS X adalah sistem operasi mendukung berbagai teknologi pengembangan seperti UNIX, Java, Cocoa dan Carbon. Dapat dikatakan bahwa Mac OS X adalah platform yang cukup populer. Seiring dengan hal tersebut, pengembangan aplikasi yang menggunakan platform ini juga sudah masuk ke dalam tahapan yang matang. Silakan merujuk ke tautan, Mac OS X System Architecture[1], untuk mendapatkan gambaran yang lebih jelas mengenai penggunaan teknologi dalam platform Mac OS X. +------------------------------------------------------------------------+ | | | USER EXPERIENCE | | | | Aqua Dashboard Spotlight Accessibility | | | +------------------------------------------------------------------------+ +------------------------------------------------------------------------+ | | | APPLICATION FRAMEWORKS | | | | Cocoa Carbon Java | | | +------------------------------------------------------------------------+ +------------------------------------------------------------------------+ | | | GRAPHICS & MEDIA | | | | Quicktime Core Audio Core Image Core Video OpenGL | | | +------------------------------------------------------------------------+ +------------------------------------------------------------------------+ | | | DARWIN | | | +------------------------------------------------------------------------+ Lapisan Darwin dari Mac OS X terdiri dari kernel, drivers, dan sejumlah bagian yang mengadopsi sistem BSD dan teknologi open source lainnya. Saya akan melewatkan pembahasan mengenai kernel, driver, dukungan file-system, dukungan jaringan dan dukungan-dukungan lainnya dan fokus hanya kepada dukungan pengembangan aplikasi. Sistem arsitektur Mac OS X yang sedemikian kompleks dan fleksibel, memungkinkan adopsi dan adaptasi teknologi menjadi tidak terbatas. Di sisi lain, dengan keleluasaan penggunaan teknologi, memungkinkan teknik-teknik cracking menjadi sangat bervariasi. Aplikasi Mac OS X saat ini dibuat dengan konteks fleksibilitas yang sangat tinggi. Hal ini terjadi karena telah terjadi perpindahan tren penggunaan arsitektur dari PowerPC menjadi Intel CPU dan bermula dar mendukung aplikasi 32-bit menjadi aplikasi 64-bit sejak Mac OS X versi 10.5. Saat ini aplikasi Mac OS X selayaknya mendukung empat arsitektur yang berbeda: - 32-bit Intel (i386) - 32-bit PowerPC (ppc) - 64-bit Intel (x86_64) - 64-bit PowerPC (ppc64) Apple sangat merekomendasikan para pengembang untuk mendukung keempat arsitektur tersebut dan memperkenalkan konsep "universal binaries". Salah satu tempat untuk mendapatkan referensi yang baik tentang pengembangan di platform Mac OS X adalah situs Mac Dev Center[2]. Aplikasi Mac OS X saat ini lebih banyak dibuat dengan framework Cocoa. Selain Cocoa, aplikasi juga dapat dibuat dengan bahasa framework Carbon (populer sebelum Mac OS X diperkenalkan). Selain Cocoa dan Carbon, pengembang juga bisa menggunakan framework Java, Qt, GTK, dan lain-lain. Dalam tulisan ini, saya hanya akan fokus membahas tentang aplikasi yang menggunakan framework Cocoa. Mengenai dukungan bahasa pemrograman, Apple menyediakan dukungan langsung untuk pengembangan aplikasi yang menggunakan C, C++, Objective-C, Objective-C++, dan lain-lain. Selain itu, untuk bahasa pemrograman lain biasanya diberikan dari pengembang pihak ketiga seperti GTK dan Qt. Dalam dokumentasi Trolltech[3], Trenton Schulz menjelaskan secara singkat mengenai aplikasi secara umum diinstal pada platform Mac OS X. Saya mencoba menuliskannya kembali di sini. Mac OS X menangani sebagian besar aplikasi sebagai "bundel". Bundel adalah struktur direktori yang mengumpulkan file-file terkait. Bundel digunakan untuk aplikasi GUI, framework, dan paket instaler. Ketika dikonfigurasi dengan benar, bundel membuat untuk penyebaran menjadi lebih mudah. Pengembang biasanya mengarsipkan aplikasi menggunakan beberapa metode yang disukai, seperti menggunakan zip, tar, dmg, rar, dan lain sebagainya. Pengguna kemudian membuka arsip tersebut dan drag aplikasi ke mana pun yang mereka sukai (biasanya di direktori /Applications) dan siap untuk digunakan. Lihat diagram berikut untuk mengetahui bagaimana struktur direktori secara umum dari sebuah aplikasi Mac OS X. Nama yang memiliki tanda kurung siku "[]" adalah direktori. [AplikasiXYZ.app] | '-- [Contents] | '-- [Frameworks] | '-- [MacOS] | | | '-- AplikasiXYZ | '-- [Resources] | '-- [PlugIns] | '-- [SharedFrameworks] | '-- Info.plist | '-- PkgInfo ---[ Software Copy Protection Copy protection untuk aplikasi komputer untuk pengguna personal bukanlah hal baru. Seperti halnya kucing dan tikus, pembuat aplikasi dan crackers saling berkejaran dalam hal mencegah bagaimana sebuah aplikasi (berhubungan dengan hak cipta) diperbanyak secara ilegal. Sebuah laman di Wikipedia tentang copy protection[4] menjelaskan banyak hal yang berhubungan dengan subyek ini. Dalam artikel tersebut dijelaskan pula beberapa teknik dalam copy protection yang populer seperti: - Dongle yang harus terhubung ke komputer; - Bus enkripsi untuk lingkup yang membutuhkan pengamanan tingkat tinggi, seperti ATM, komunikasi data yang aman, dan lain-lain; - Kunci registrasi, cukup populer digunakan; - Nama dan nomor seri registrasi; - Keyfile yang akan dibaca oleh aplikasi sebelum aplikasi tersebut mulai dapat digunakan; - Aktivasi lewat telepon; - Aktivasi lewat Internet, seperti aktivasi Microsoft's Windows Genuine Advantage; - Code morphing dan code obfuscation. ---[ Aplikasi Umum Yang Digunakan Apple merilis "Developer Tools" yang berisi sejumlah aplikasi yang dapat digunakan untuk membuat/mengkompail dan melakukan debug/disassemble. "Developer Tools" ini dapat ditemukan dalam paket instal DVD Mac OS X ataupun diunduh dari website Apple Developer Connection http://developer.apple.com/. Aplikasi yang umum digunakan untuk mendebug dan dapat ditemukan dalam "Developer Tools" antara lain: - gdb(1), GNU debugger - nm(1), Object File Symbol Table Viewer - nasm(1), Netwide Assembler, a portable 80x86 assembler - ndisasm(1), Netwide Disassembler, an 80x86 binary file disassembler Selain itu, terdapat aplikasi bawaan yang juga dapat dimanfaatkan seperti: - strings(1), menampilkan "printable strings" dari sebuah object, binari atau file - vmmap(1), menampilkan area virtual memory yang dialokasikan dalam sebuah proses - lipo(1), untuk menangani binari Universal - xxd(1), membuat hexdump - file(1), untuk mencari tahu jenis file - otool(1), menampilkan object dari file Anda juga dapat menginstal aplikasi pihak ketiga sebagai tambahan jika diperlukan seperti: - otx, http://otx.osxninja.com/ - class-dump, http://www.codethecode.com/projects/class-dump/ - hte, http://hte.sourceforge.net - ptool, HexFiend, ocalc, 0xEd http://reverse.put.as/tools/ - nasm, dapat diinstal melalui macports Catatan: Jika saya menuliskan program(1) berarti Anda dapat membaca manualnya dengan perintah "man 1 program". ---[ Contoh: TxtMt Cukup banyak tautan yang dapat dijadikan sebagai referensi ketika saya mencari informasi dengan kata kunci "Reverse Engineering in Mac OS X". Anda dapat memulainya dengan bahasan pada website Wikibooks[5] mengenai subyek ini. Untuk mempermudah pemahaman, saya mencoba langsung dengan contoh bagaimana melakukan reversing dan cracking secara praktis. Sebagai target adalah aplikasi text editor populer TxtMt (silakan merujuk ke bagian "Kata Kunci" untuk mengetahui informasi lebih lanjut mengenai aplikasi ini). Saya menggunakan versi rilis terbaru 1.5.9 dengan batasan 30 hari trial. $ curl -O http://download.xxx.com/TxtMt_1.5.9.dmg $ open TxtMt_1.5.9.dmg $ mount ... /dev/disk5s2 on /Volumes/TxtMt 1.5.9 (hfs, local, nodev, nosuid, read-only, noowners, mounted by grumpy) Selanjutnya adalah menyalin aplikasi TxtMt yang ada di volume TxtMt ke direktori kerja. Mari kita tengok struktur aplikasi tersebut. $ find TxtMt.app -type d -maxdepth 2 TxtMt.app TxtMt.app/Contents TxtMt.app/Contents/MacOS TxtMt.app/Contents/PlugIns TxtMt.app/Contents/Resources TxtMt.app/Contents/SharedSupport Terdapat sebuah file binari yang dapat dieksekusi dan terdapat dalam direktori TxtMt.app/Contents/MacOS $ ls TxtMt.app/Contents/MacOS TxtMt Untuk mencari tahu jenis file tersebut... $ cd TxtMt.app/Contents/MacOS $ file TxtMt TxtMt: Mach-O universal binary with 2 architectures TxtMt (for architecture ppc): Mach-O executable ppc TxtMt (for architecture i386): Mach-O executable i386 Dapat diketahui bahwa file binari tersebut adalah Universal binary yang mendukung 2 arsitektur PPC dan i386. Kemudian, saya mencoba membaca "display name list (symbol table)" menggunakan nm(1) dan mencari simbol yang "menarik". "Menarik" di sini adalah simbol yang berhubungan dengan rutin registrasi, lisensi atau batas akhir penggunaan dari aplikasi. $ nm TxtMt > TxtMt-nm.txt Kata kunci "license" digunakan untuk menampilkan simbol-simbol yang berhubungan. $ grep -i license TxtMt-nm.txt 0008640e t -[OakRegistrationManager changeLicense:] 00085b2e t -[OakRegistrationManager changeToLicenseInformationView:] 00085940 t -[OakRegistrationManager lostLicense:] 00086840 t -[OakRegistrationManager setLicenseInfo:] 000855f8 t -[OakRegistrationManager setLicenseKey:] 002156c0 s _LicenseTypes 001f862c s _OakRegistrationLicenseKey 0019d6be s __GLOBAL__I_LicenseTypes Proses registrasi aplikasi TxtMt nampaknya ditangani oleh rutin OakRegistrationManager. Lalu saya mencoba kata kunci "register". $ grep -i register TxtMt-nm.txt 0006e06e t +[OakColorWell registerColorWell:] 0006e088 t +[OakColorWell unregisterColorWell:] 0003365e t +[OakHTMLOutputManager registerIdleWindow:forUUID:] 000336c2 t +[OakHTMLOutputManager unregisterIdleWindowForUUID:] 00006cd0 t -[AppDelegate registerUntitledDocument] 00006cfc t -[AppDelegate registerUntitledProject] 00006ce2 t -[AppDelegate unregisterUntitledDocument:] 00006d0e t -[AppDelegate unregisterUntitledProject:] 0012e412 t -[Bundle registerBundleItem:] 00085576 t -[OakRegistrationManager canRegister] 000075f4 t __Z13is_registeredv 000e27be t __Z27register_movement_functionsR10action_map 001025d2 t __Z28register_transform_functionsR10action_map ... Saya tertarik dengan dua baris berikut: 00085576 t -[OakRegistrationManager canRegister] 000075f4 t __Z13is_registeredv Walaupun ada rutin lain yang dapat dibypass untuk melewati masa waktu penggunaan aplikasi, namun saya lebih tertarik pada dua baris di atas. Saya kemudian menggunakan otool(1) $ otool -LtV TxtMt > TxtMt-otool.txt Selain otool(1), tool lain yang dapat dimanfaatkan adalat otx. $ otx -arch i386 TxtMt > TxtMt-otx.txt Kemudian, saya melihat hasil output dari otool untuk melihat hasil bongkaran (disassemble) dari aplikasi TxtMt khusus untuk offset 00085576 dan 000075f4. -[OakRegistrationManager canRegister]: 00085576 pushl %ebp 00085577 movl %esp,%ebp 00085579 subl $0x08,%esp 0008557c calll 0x1000075f4 00085581 leave 00085582 movzbl %al,%eax 00085585 ret ... __Z13is_registeredv: 000075f4 pushl %ebp 000075f5 movl %esp,%ebp 000075f7 pushl %edi 000075f8 pushl %esi 000075f9 pushl %ebx 000075fa subl $0x0000010c,%esp 00007600 movl 0x00218454,%eax ... 00007dbf calll 0x002258da ; symbol stub for: __Unwind_Resume 00007dc4 xorl %esi,%esi 00007dc6 movb $0x01,0xffffff20(%ebp) 00007dcd movb $0x01,0xffffff21(%ebp) 00007dd4 jmpl 0x100007987 00007dd9 leal 0xf4(%ebp),%esp 00007ddc movl %ecx,%eax 00007dde popl %ebx 00007ddf popl %esi 00007de0 popl %edi 00007de1 leave 00007de2 ret 00007de3 nop Beberapa hal yang sepertinya harus diinvestigasi lebih lanjut... - Pada fungsi [OakRegistrationManager canRegister]: 0008557c calll 0x1000075f4 - Pada fungsi __Z13is_registeredv 00007ddc movl %ecx,%eax Mari kita pastikan dengan menggunakan gdb(1). $ gdb -q TxtMt Reading symbols for shared libraries ................. done (gdb) b * 0x00007ddc Breakpoint 1 at 0x7ddc (gdb) r Starting program: /Users/grumpy/Hack/TxtMt.app/Contents/MacOS/TxtMt ... Reading symbols for shared libraries .... done Breakpoint 1, 0x00007ddc in is_registered () (gdb) Breakpoint 1, 0x00007ddc in is_registered () (gdb) set $eax = 1 (gdb) c Continuing. Breakpoint 1, 0x00007ddc in is_registered () (gdb) c Continuing. Breakpoint 1, 0x00007ddc in is_registered () ... Tekan "c" sampai muncul registration box, kemudian quit gdb(1). (gdb) q The program is running. Exit anyway? (y or n) y Lalu bagaimana kita melakukan membypass proses registrasi? Mari kita coba pahami bagaimana prosedur registrasi dan verifikasi serial number secara umum. +---------------------+ | Aplikasi_Dijalankan | +---------------------+ | v +------------+ ----- +------------------------+ | Registrasi |--> < Belum >--> | Masukkan_Serial_Number | +------------+ ----- +------------------------+ | | v v ----- +-------------------+ < Sudah > <-----------------| Verifikasi_Serial | ----- +-------------------+ | v +----------------------+ | Aplikasi_Jalan_Penuh | +----------------------+ Cracker dapat: - memanipulasi proses [Verifikasi_Serial] untuk menerima input apa saja yang diberikan pengguna; - lompat langsung pada status ; - menghilangkan prosedur [Registrasi]. Saya mulai menggunakan aplikasi TxtMt ini sejak 2006. Karena saya belum terbiasa melakukan cracking, saya mencoba dengan dasar pemikiran sederhana dan memilih pilihan terakhir, menghilangkan prosedur [Registrasi]. Yang saya lakukan waktu itu adalah menghilangkan prosedur [OakRegistrationManager canRegister]. Prosedur ini hanya saya temukan 1 kali pada hasil bongkaran binari. Proses menghilangkan prosedur tersebut dapat dilakukan dengan binary patching. Dan oleh karena saya termasuk orang yang malas, saya melakukan patching secara "kasar". Saya menggunakan fungsi Perl substitusi inline dan mengganti "canRegister" menjadi "fooRegister". Mengapa hanya melakukan s/can/foo/? Karena saya harus menjaga integritas file agar checksum-nya sama. $ perl -pi.orig -e 's/canRegister/fooRegister/' TxtMt dan aplikasipun dapat digunakan tanpa perlu melakukan registrasi. Tahun 2008, saya menemukan sebuah artikel blog[6] yang ditulis oleh "hlinzhou" dan membahas bagaimana melakukan cracking pada aplikasi yang sama dengan metode kedua, lompat langsung pada status . ---[ Contoh: BFG - TWH BFG adalah portal yang menjual berbagai aplikasi games untuk platform PC dan Mac. BFG menjual aplikasi games yang dikembangkan oleh pihak ketiga dan memberikan demo untuk waktu yang terbatas, biasanya 60 menit. Di sini, saya menjadikan aplikasi game TWH sebagai contoh. Setelah mengunduh dan membuka arsip, saya mencoba menganalisa konten dari aplikasi game tersebut. $ cd /Volumes/TWH $ find TWH.app -type d -maxdepth 4 TWH.app TWH.app/Contents TWH.app/Contents/MacOS TWH.app/Contents/Resources TWH.app/Contents/Resources/.TWH.app TWH.app/Contents/Resources/.TWH.app/Contents TWH.app/Contents/Resources/MonitorResources.bundle TWH.app/Contents/Resources/MonitorResources.bundle/Contents Saya agak terkejut ketika menemukan direktori .TWH.app dalam direktori TWH.app/Contents/Resources. Kemudian, saya mencoba menginvestigasi... $ cd TWH.app/Contents/MacOS $ file TWH TWH: Mach-O universal binary with 2 architectures TWH (for architecture i386): Mach-O executable i386 TWH (for architecture ppc): Mach-O executable ppc Dengan menggunakan strings(1) untuk menampilkan "printable text" dari binari TWH, saya menemukan informasi menarik. $ strings TWH __dyld_make_delayed_module_initializer_calls __dyld_mod_term_funcs /usr/lib/libSystem.B.dylib __cxa_atexit __cxa_finalize atexit drain runDemoUIWithEntryFlag: ... NSString NSFileManager NSBundle NSAutoreleasePool NSApplication %s/.%s /Resources GameAppName %s/.%s/Contents/MacOS/%s /System/Library/Frameworks/Carbon.framework/Versions/Current/Support/LaunchCFMApp kill %@/Resources %@/MonitorResources.bundle %@/Library/Preferences/BFG/%@/.settings %@/.bfgl%@/.sysdata %@/.gmsave %@/Library/Preferences/BFG %s/%@ %@/.bfgl%@ NSMutableArray NSObject BFGLicenses UTF8String ... Ternyata binari TWH adalah "wrapper" untuk menangani demo dan registrasi. Ketika saya mencoba menjalankan aplikasi .TWH.app yang ada di direktori tersebut, dan ternyata bisa. Catatan: Aplikasi .TWH.app tidak dapat ditemukan jika diakses lewat Finder.app karena ada "." di depan nama direktori dan dianggap sebagai direktori yang "hidden". Kemudian saya menyalin aplikasi "asli" ke direktori yang saya inginkan. $ mkdir /Applications/Games/TWH $ cp -r /Volumes/TWH/TWH.app/Contents/Resources/.TWH.app \ /Applications/Games/TWH/TWH.app ---[ Penutup Cracking aplikasi Mac OS X tidak jauh berbeda dengan cracking aplikasi pada platform lainnya seperti pada Windows dan Unix/Linux. Pemahaman mengenai assembly memang diperlukan, namun tidak menjadi keharusan. Penggunaan logika dan teori praktis lebih menjadi keutamaan. Saya sertakan referensi ekstra untuk menambah wawasan Anda mengenai isu cracking. ---[ Kata Kunci Gunakan algoritma Base64 untuk memetakan kembali kata kunci ke plain text. TxtMt: VGV4dE1hdGUK BFG: QmlnIEZpc2ggR2FtZXMK TWH: VGhlIFdoaXRlIEhvdXNlCg== Silakan googling untuk mendapatkan informasi lebih lanjut mengenai aplikasi-aplikasi yang saya contohkan. ---[ Referensi [1] Apple, "Mac OS X System Architechture", ADC, http://bit.ly/9WvZQV (diakses pada 18 Mei 2010) [2] Apple, "Mac Dev Center", http://bit.ly/a1GZot (diakses pada 18 Mei 2010) [3] Trenton Schulz, "Deploying Applications on Mac OS X", Trolltech Documentation, http://bit.ly/bs0jkA (diakses pada 18 Mei 2010) [4] Kontributor Wikipedia, "Copy Protection", Wikipedia, The Free Encyclopedia, http://bit.ly/c5y7RS (diakses pada 18 Mei 2010) [5] Kontributor Wikibooks, "Reverse Engineering/Mac OS X", Wikibooks, The Open-Content Textbooks Collection, http://bit.ly/dcw7Zi (diakses pada 18 Mei 2010) [6] hlinzhou, "TxtMt Blasting Notes", Why write a post-it?, http://bit.ly/bjFzuj (diakses pada 18 Mei 2010) [X] Allan Odgaard, "Using OpenSSL for license keys", Sigpipe 13, http://bit.ly/bfqY83 (diakses pada 18 Mei 2010) [X] SiuL+Hacky, "FLEXlm: The Flexible lies manager", http://bit.ly/9RxhYe (diakses pada 18 Mei 2010) [X] +ReZiDeNt, "Reverse Engineering a Linux/X Target", http://bit.ly/9PNOCx (diakses pada 18 Mei 2010) [X] curious, "Reverse engineering - PowerPC Cracking on OSX with GDB", Phrack Issue 63, http://bit.ly/aYf3y2 (diakses pada 18 Mei 2010) [X] Robin Lu, "Mac Reverse Engineering Notes", Bibimbap, http://bit.ly/9s5v9i (diakses pada 18 Mei 2010) [X] nemo, "The Objective-C Runtime: Understanding and Abusing", Phrack Issue 66, http://bit.ly/cNNDvf (diakses pada 18 Mei 2010)