Bagaimana versi perangkat lunak yang retak dibuat dan mengapa pengembang tidak dapat mencegahnya?


Versi perangkat lunak yang retak dibuat dengan menggunakan debugger. (Debugger adalah jenis perangkat lunak khusus yang memungkinkan pemrogram mendekonstruksi perangkat lunak mereka menjadi bagian-bagian penyusunnya untuk tujuan menemukan bug, dan dengan demikian menghilangkan bug. Selain itu, debugger dapat digunakan untuk rekayasa balik, atau untuk melihat apa yang ada di dalam perangkat lunak , untuk mempelajari logikanya. Metode terakhir ini sebagian besar digunakan oleh peneliti malware untuk mempelajari apa yang dilakukan malware (atau virus komputer) di dalam. Namun metode ini juga dapat digunakan oleh penyerang untuk “memecahkan” (atau memotong) perangkat lunak legal pendaftaran, atau kadang-kadang, untuk mengubah perilaku normal perangkat lunak, misalnya dengan menyuntikkan kode berbahaya ke dalamnya.)

Dalam contoh kode ini “RegistrationName” dan “RegistrationCode” adalah string teks khusus yang akan diterima oleh pengguna perangkat lunak yang sah setelah membayar lisensi. (Nama biasanya adalah nama asli orang tersebut atau alamat emailnya, dan kodenya adalah serangkaian karakter unik/khusus yang terikat pada nama tersebut.)
Dalam logika di atas, fungsi bernama “isRegistrationCodeGood()” akan memeriksa apakah “RegistrationName” dan “RegistrationCode” diterima menggunakan beberapa metode berpemilik. Jika ya, itu akan kembali benar. Jika tidak, palsu. Kode keluar itu akan menentukan cabang (atau ruang lingkup) mana yang akan diikuti oleh eksekusi.
Jadi logika di atas akan menunjukkan bahwa pendaftaran gagal dan keluar:

Atau, jika kode registrasi dan nama cocok, detail registrasi akan disimpan di penyimpanan persisten (seperti File System atau System Registry) menggunakan fungsi bernama “rememberRegistrationParameters()” dan kemudian menampilkan pesan terima kasih kepada pengguna yang telah mendaftar:

Seorang “cracker” jelas ingin mendapatkan hasil kedua untuk setiap kode registrasi yang dia masukkan. Tapi mereka punya masalah. Mereka tidak memiliki kode sumber C++, bagian yang saya tunjukkan di atas. (Saya harap tidak!)
Jadi satu-satunya jalan bagi penyerang adalah membongkar kode biner (yang selalu dikirimkan dengan perangkat lunak dalam bentuk file .exe dan .dll di Windows, dan sebagian besar sebagai Unix yang dapat dieksekusi di dalam paket .app di Mac.) Penyerang akan kemudian gunakan debugger untuk mempelajari kode biner dan coba temukan logika registrasi yang saya sebutkan di atas.
Selanjutnya Anda dapat melihat diagram alur untuk potongan kode yang saya tunjukkan di C++, disajikan melalui debugger tingkat rendah. Atau, karena kode akan dibaca dalam bentuk biner setelah kompilasi:
(Agar mudah dibaca, saya menambahkan komentar di sebelah kanan dengan nama fungsi dan variabel. Mereka tidak akan ada dalam kode yang bisa dilihat penyerang.)

(Untuk memahami apa yang ditunjukkan di atas, penyerang harus memiliki pengetahuan yang baik tentang instruksi bahasa Assembly untuk kode asli.)
Saya juga perlu menunjukkan bahwa memiliki cuplikan pembongkaran seperti di atas adalah hasil akhir untuk penyerang. Kesulitan utama baginya adalah untuk menemukannya di antara jutaan dan jutaan baris kode serupa lainnya. Dan itulah tantangan utama mereka. Tidak banyak orang yang bisa melakukannya dan itulah mengapa software “cracking” adalah keahlian khusus.
Jadi setelah menemukan potongan kode di atas dalam file biner perangkat lunak, “cracker” memiliki dua pilihan:
1) Ubah (atau tambal) biner.
2) Merekayasa balik fungsi “isRegistrationCodeGood()” dan menyalin logikanya untuk membuat apa yang dikenal sebagai “KeyGen” atau “Generator Kunci”.
Mari kita tinjau keduanya:
Pilihan pertama cukup mudah. Sejak penyerang sampai sejauh ini, dia tahu Set Instruksi Intel x64 dengan cukup baik. Jadi mereka cukup mengubah lompatan bersyarat dari “jnz short loc_7FF645671430” di alamat 00007FF645671418 (dilingkari merah di tangkapan layar) menjadi lompatan tanpa syarat, atau “jmp short loc_7FF645671430”. Ini akan secara efektif menghapus entri kode pendaftaran yang gagal dan apa pun yang diketik pengguna akan diterima sebagai pendaftaran yang valid.
Perhatikan juga bahwa modifikasi ini dapat dicapai dengan mengubah hanya satu byte dalam kode biner dari 0x75 ke 0xEB:

Tetapi pendekatan ini datang dengan “harga” untuk memodifikasi file biner asli. Untuk itu penyerang perlu menulis sendiri “patcher” (atau executable kecil yang akan menerapkan modifikasi yang saya jelaskan di atas.) Kelemahan dari pendekatan ini untuk penyerang adalah bahwa menambal file eksekusi asli akan merusak tanda tangan digitalnya, yang mungkin mengingatkan pengguna akhir atau vendor. Selain itu, “patcher” yang dapat dieksekusi yang dibuat oleh penyerang dapat dengan mudah ditandai dan diblokir oleh perangkat lunak antivirus pengguna akhir, atau mengarahkan penyelidik kriminal ke identitas penyerang.
Pilihan kedua sedikit lebih rumit. Seorang penyerang harus mempelajari fungsi “isRegistrationCodeGood()” dan menyalinnya ke dalam program kecilnya sendiri yang akan secara efektif menduplikasi logika yang diterapkan dalam perangkat lunak asli dan membiarkannya menghasilkan kode pendaftaran dari nama apa pun, sehingga memberikan pengguna perangkat lunak yang tidak bermoral itu. kemampuan untuk mendaftarkannya tanpa melakukan pembayaran.
Vendor dari banyak produk perangkat lunak utama memahami dampak potensial dari metode kedua dan mencoba mencegahnya dengan meminta apa yang dikenal sebagai “otentikasi.” Ini pada dasarnya adalah langkah kedua setelah pendaftaran, di mana perangkat lunak mengirimkan nama pendaftaran ke server web perusahaan yang mengembalikan respons kembali ke perangkat lunak apakah kode itu sah atau tidak. Ini dilakukan oleh Microsoft ketika Anda membeli Windows (mereka menyebutnya “Aktifkan Windows”) dan juga oleh Adobe, dan banyak perusahaan lainnya. Langkah kedua ini dapat dilakukan di belakang layar di latar belakang saat perangkat lunak sedang berjalan, dan biasanya akan menyebabkan pembatalan pendaftaran sebelumnya jika diperoleh secara ilegal.
Jadi sekarang Anda tahu bagaimana perangkat lunak “diretas”.
Biarkan saya menjawab mengapa tidak mungkin untuk mencegahnya. Semuanya bermuara pada fakta bahwa setiap kode perangkat lunak perlu dibaca baik oleh CPU (dalam hal kode asli biner) atau oleh juru bahasa atau kompiler JIT (dalam hal kode JavaScript atau .NET.) Ini berarti bahwa jika ada cara untuk membaca/menafsirkan sesuatu, tidak peduli seberapa rumit atau berbelit-belit itu, penyerang dengan pengetahuan dan ketekunan yang cukup akan dapat membacanya juga, dan dengan demikian merusaknya.
Ada argumen bahwa perangkat lunak berbasis cloud lebih aman, yang memang benar, karena kode (biner)-nya tetap ada di server dan pengguna akhir tidak memiliki akses langsung ke sana. Dan meskipun perangkat lunak berbasis cloud jelas merupakan masa depan, ia memiliki beberapa kelemahan utama yang tidak akan pernah memungkinkannya untuk sepenuhnya menggantikan perangkat lunak konvensional Anda. Untuk menyebutkan beberapa saja:
Tidak semua orang memiliki koneksi internet, atau bersedia mengunggah datanya secara online. Selain itu, koneksi internet seseorang bisa sangat mahal atau terlalu lambat untuk membuat perangkat lunak berjalan sangat lambat.
Lalu ada pertanyaan tentang komputasi terdistribusi. Misalnya, Blizzard Entertainment tidak akan pernah membuat “World of Warcraft” berjalan sepenuhnya di server mereka karena sumber daya komputasi yang sangat besar diperlukan untuk membuat setiap adegan untuk setiap pemain yang mereka miliki. Oleh karena itu, demi kepentingan terbaik mereka, biarkan komputer masing-masing pengguna melakukan rendering sebagai gantinya.
Sebagai pengembang perangkat lunak sendiri, saya jelas tidak suka ketika orang mencuri lisensi perangkat lunak. Tapi saya harus menerimanya dan menjalaninya. Berita baiknya adalah tidak banyak orang yang mau bekerja lebih keras dan mencari versi perangkat lunak yang sudah di-crack. Masalah utama bagi mereka yang melakukannya, adalah bahwa dengan mengunduh executable yang ditambal, atau KeyGen atau Patcher penyerang, mereka secara efektif “mempercayai” dia untuk tidak memasukkan sesuatu yang “jahat” ke dalamnya yang tidak “diiklankan pada paket. ” (hal-hal seperti trojan, malware, atau keyloggers.) Jadi pertanyaan untuk orang-orang itu menjadi — apakah sepadan dengan biaya lisensi perangkat lunak untuk berpotensi menginfeksi sistem Anda dengan virus jahat?
Di sisi lain persamaan, beberapa pengembang bereaksi sangat negatif terhadap setiap upaya untuk mencuri lisensi perangkat lunak mereka. (Saya juga ada di sana.) Mereka mencoba menerapkan semua jenis tindakan pencegahan — mulai dari menipu para insinyur balik, hingga menambahkan jebakan dalam kode yang mungkin melakukan sesuatu yang buruk jika kode tersebut mendeteksi sedang di-debug, hingga mengaburkan atau mengacak kode, untuk menegakkan semua jenis skema DRM yang berbelit-belit, hingga memblokir pengguna dari negara tertentu. Saya pribadi mencoba untuk menjauh dari semua tindakan itu. Dan inilah alasannya:
A) Segala jenis taktik anti-reverse-engineering dapat dilewati oleh penyerang dengan ketekunan yang cukup. Jadi mengapa repot-repot dan membuang waktu saya ketika saya dapat menginvestasikan waktu itu untuk menambahkan sesuatu yang berguna ke perangkat lunak saya yang akan membuatnya lebih produktif bagi pengguna yang sah?
B) Beberapa pengepakan kode dapat membuat kesalahan positif dengan perangkat lunak antivirus, yang jelas tidak baik untuk pemasaran perangkat lunak tersebut. Ini juga menciptakan kerumitan yang tidak perlu bagi pengembang untuk men-debug perangkat lunak.
C) Menambahkan jebakan dalam kode juga dapat “salah sasaran” pada pengguna sah Anda, yang akan membuat mereka marah dan bahkan dapat menyebabkan tuntutan hukum.
D) Setiap skema DRM mungkin akan menangkap sekitar 100 pengguna ilegal dan sangat merepotkan 10.000 pengguna yang sah. Jadi mengapa melakukannya untuk pelanggan Anda yang baik?
E) Statistik kami menunjukkan bahwa sekitar 75% dari semua lisensi ilegal berasal dari Cina, Rusia, Brasil, untuk menyebutkan pelanggar terburuk. (Saya juga mengerti bahwa alasannya mungkin karena pendapatan yang jauh lebih rendah yang dimiliki orang-orang di negara-negara tersebut.) Masalah utama bagi kami adalah kenyataan bahwa jika kami menerapkan DRM kami atau menambahkan beberapa otentikasi pendaftaran yang kuat, banyak orang yang ingin melewati pendaftaran kami hanya akan menggunakan nomor kartu kredit curian. Dan kami tidak memiliki kendali atasnya. Sistem kami akan menggunakannya untuk mengirimi mereka lisensi yang sah hanya agar pembayaran terpental dalam waktu beberapa minggu. Akibatnya, kami akan kehilangan uang yang dibayarkan untuk lisensi, ditambah perusahaan kartu kredit akan mengenakan biaya tolak bayar tambahan ke akun kami, yang dapat berkisar dari $0,25 hingga $20 per pembelian buruk di luar biaya lisensi.
F) Seperti yang ditunjukkan dalam komentar, beberapa perusahaan sebenarnya dapat mengambil manfaat dari mengizinkan salinan bajakan dari perangkat lunak mereka. Microsoft misalnya mendapat banyak publisitas gratis dari orang-orang yang menggunakan OS Windows mereka, hal yang sama berlaku untuk Adobe dengan Photoshop mereka. Itu adalah poin bagus yang saya setujui.
Jadi filosofi saya sekarang ini — jika seseorang ingin bekerja lebih keras dan mencuri perangkat lunak kami, lakukanlah! Mereka pergi sejauh ini untuk melakukannya, jadi mereka mungkin punya alasan yang bagus. Sisi positifnya, ada begitu banyak pelanggan lain yang menghargai pekerjaan yang dilakukan untuk menciptakan perangkat lunak yang jumlahnya jauh lebih banyak daripada yang tidak.
 Terima kasih semuanya! Saya merasa senang karena ilmu yang saya bagikan bermanfaat bagi orang lain.

Leave a Reply

Your email address will not be published. Required fields are marked *