Apakah penting untuk mengaburkan kode aplikasi C ++?


11

Di dunia Java, sepertinya terkadang menjadi masalah, tapi, bagaimana dengan C ++? Apakah ada solusi yang berbeda?

Saya sedang memikirkan fakta bahwa seseorang dapat mengganti pustaka C ++ dari OS tertentu dengan versi berbeda dari pustaka yang sama, tetapi penuh dengan simbol debug untuk memahami apa yang kode saya lakukan. APAKAH hal yang baik untuk menggunakan perpustakaan standar atau populer?

Ini juga dapat terjadi dengan beberapa perpustakaan dll di bawah Windows diganti dengan "versi debug" dari perpustakaan itu. Apakah lebih baik memilih kompilasi statis? Dalam aplikasi komersial, saya melihat bahwa untuk inti dari aplikasi mereka, mereka mengkompilasi semuanya secara statis dan sebagian besar dll (perpustakaan dinamis pada umumnya) digunakan untuk menawarkan beberapa teknologi pihak ketiga seperti solusi anti-pembajakan (saya melihat ini di banyak permainan ), Pustaka GUI (seperti Qt), pustaka OS, dll.

Apakah kompilasi statis setara dengan kebingungan di dunia Java? Dalam istilah yang lebih baik, apakah ini solusi terbaik dan paling terjangkau untuk melindungi kode Anda?


4
Ingat, apa pun yang Anda lakukan, seseorang dengan terlalu banyak waktu akan dapat mengurangi / mendekompilasi itu
Zavior

13
Banyak kompiler datang dengan /Osakelar kebingungan. Beberapa bahkan memiliki beberapa tingkat kebingungan, hingga /O3;)
MSalters

@MSalters Tidak, g ++ punya -O3;)
BЈовић

@Zavior Atau hanya merekayasa ulang, sederhana dan sederhana. Bahkan tidak memerlukan biner sendiri, hanya analisis menyeluruh dari perangkat lunak.
John Weisz

Jawaban:


27

Jangan Buang Waktu Anda untuk Kehilangan Pertempuran

Seperti disebutkan dalam banyak jawaban serupa lainnya untuk C ++ dan bahasa lain, ini sebagian besar tidak berguna .

Bacaan lebih lanjut

Bacaan yang dipilih pada topik (tidak semua spesifik C ++, tetapi prinsip-prinsip umum berlaku):

Jawaban StackExchange

Dokumen

Kutipan terkenal tentang Kebingungan:

Lalu akhirnya, ada pertanyaan tentang kode privasi. Ini adalah penyebab yang hilang. Tidak ada transformasi yang akan mencegah peretas untuk memahami program Anda. Ini ternyata benar untuk semua program dalam semua bahasa, itu hanya lebih jelas dengan JavaScript karena disampaikan dalam bentuk sumber. Manfaat privasi yang diberikan oleh kebingungan adalah ilusi. Jika Anda tidak ingin orang lain melihat program Anda, cabut server Anda. - Douglas Crockford


Tidak pernah?

Saya tidak mengatakan Anda tidak boleh mengaburkan dan bahwa tidak ada alasan bagus untuk itu, tetapi saya serius mempertanyakan kebutuhan untuk itu dalam banyak kasus, dan efektivitas biaya.

Selain itu, ada situasi di mana kebingungan merupakan persyaratan de-facto. Misalnya, jika Anda menulis virus, jelas kebingungan (dan yang dinamis, lebih disukai) adalah hal yang baik untuk kelangsungan hidup program Anda karena kemampuannya untuk mereplikasi. Namun, ini hampir tidak merupakan kasus "umum" ...


Kami pernah menggunakan dongle perangkat keras di mana ada persyaratan lisensi untuk mengaburkan semua panggilan fungsi dongle - dan mereka menyediakan alat untuk melakukannya. Selalu membuat saya sedikit curiga dengan kualitas 'perlindungan' mereka!
Martin Beckett

@ MartinBeckett: memang sedikit aneh.
haylem

3

Tidak, ini tidak sepadan dengan usaha, dan saya pikir itu sama sekali tidak perlu. Fungsi yang Anda panggil mungkin dapat ditebak oleh fungsi yang Anda berikan.

Alasan obfuscators ada untuk Java adalah karena pemetaan antara kode byte Java dan kode sumber Java didefinisikan dengan cukup baik, dan nama-nama semua fungsi dan variabel anggota disimpan dalam kode byte (terlepas dari apakah mereka publik, pribadi, atau dilindungi ) jadi penerjemah kode byte Java dapat menyajikan beberapa Java generik yang memperlihatkan struktur sumber asli dengan cukup baik untuk sumber yang tidak dikobekan.

C ++ mengkompilasi langsung ke bahasa mesin. Ini bisa dibongkar, tetapi bahasa assembly cukup membosankan untuk dihadapi. Dekompilasi jauh lebih sulit karena semua perubahan yang dilakukan pengoptimal terhadap kode selama kompilasi.


0

Memikirkan hal ini, ada beberapa jenis kebingungan. Mari kita mulai dengan kebingungan kode sumber, yang merupakan buang-buang waktu; cukup sulit untuk dipahami tanpa itu! Jadi mari kita fokus pada kebingungan dari paket pengiriman, tentang bagaimana kode dikirimkan kepada pengguna.

Kebingungan kecil

Kebingungan kecil ada untuk mencegah pengguna biasa dari menjulurkan jari mereka dan memecahkan barang dengan mudah. Itu tidak menghalangi hacker yang ditentukan, tetapi memiliki nilai dalam membantu memastikan bahwa hal-hal yang Anda dukung untuk mendukung adalah apa yang sebenarnya Anda sampaikan. Tingkat perlindungan yang diperlukan untuk hal semacam ini benar-benar sangat rendah; paket pengiriman hanya harus tidak terlihat dapat dibaca dan diedit (tanpa alat khusus) dan itu cukup bagus.

Minifikasi Javascript adalah contohnya, meskipun tidak dipasarkan seperti itu. Tidak ada orang waras yang ingin membaca dan mengedit file JS yang diperkecil, bahkan jika secara teknis dimungkinkan untuk melakukannya jika Anda sudah bertekad / cukup gigih.

Demikian pula dengan pengiriman aplikasi Java. Hanya mengemas kode menjadi JAR yang dapat dieksekusi akan menghentikan sebagian besar kebodohan, meskipun itu memiliki semua kekuatan tanda "Tolong Jauhi Rumput" yang sopan di taman kota.

Bahkan ketika memberikan kode C ++, menghilangkan simbol yang tidak perlu dari executable akan cukup untuk memenuhi syarat sebagai kebingungan kecil. Kuncinya adalah canggung untuk membaca hasilnya sebagai pengguna, tetapi tidak masalah untuk mengeksekusinya sebagai komputer.

Kebingungan besar

Kebingungan utama adalah menjaga pengguna yang bertekad dan berpengetahuan luas . Ini juga merupakan kekalahan total; jika sebuah komputer dapat menjalankannya, seseorang dapat mengambilnya secara terpisah dan mencari tahu apa yang dilakukannya. Cara terdekat yang bisa Anda dapatkan adalah membuat program mendekripsi sendiri secara terus-menerus, mengubah apa yang dilakukannya pada satu waktu menjadi hal yang sama sekali berbeda dengan yang dilakukannya di waktu lain. Menciptakan hal seperti itu akan agak sulit dan masih tidak akan membuat hacker yang sangat baik keluar (meskipun mereka akan benar-benar sangat marah dengan Anda pada akhir itu pada jumlah upaya yang diperlukan untuk mendekripsi semua kode yang memodifikasi sendiri).

Jauh lebih baik untuk berpikir dalam hal solusi lain. Misalnya, Anda dapat menyimpan "mahkota perhiasan" dari kode di server yang Anda kontrol dan hanya mengizinkan panggilan layanan untuk itu, membuat klien pada dasarnya adalah hadiah gratis yang merupakan ujung depan dari bit-bit berharga. Atau Anda bisa pergi lebih banyak kontrak / jalur hukum, dan hanya menyerahkan yang dapat dieksekusi ke organisasi yang secara resmi setuju untuk tidak mencari-cari di dalam kode Anda atau memberikan kompensasi kepada Anda jika mereka melakukannya (sehingga itu akan menjadi semacam NDA). Tujuannya adalah untuk menciptakan insentif kuat bagi peretas untuk tidak meretas, dan bagi pengguna untuk menjaga kode dari peretas yang tidak terikat oleh perjanjian.

Tetapi Anda tidak boleh berasumsi bahwa kode Anda tidak pernah dapat di-crack. Dengan virtualisasi, setiap keadaan program dari suatu eksekusi dapat diperiksa dan dilacak, dan apa pun yang mencoba untuk mengalahkan itu (misalnya, pelacakan jam ke sumber waktu eksternal) akan jauh lebih mungkin menyebabkan masalah bagi pengguna yang sah daripada peretas. (Lihat riwayat DRM untuk mengetahui bagaimana bahkan penerbit informasi yang sangat bertekad tidak dapat menjaga keamanan sistem mereka begitu kode ada di tangan lawan mereka.) Adalah jauh lebih baik untuk fokus pada benar-benar membuat pengguna yang sah bahagia. Kerugian dari retakan sesekali tidak akan dibandingkan dengan uang ekstra yang dibawa melalui pelanggan yang puas dengan benar.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.