Bir Kılavuz: Kod Gizleme Tersine Mühendislik

Yayınlanan: 2021-11-17

Kod gizleme rakamları, uygulama korsanlığını önlemek için en popüler uygulama güvenlik yaklaşımlarından biridir. Tüm dünyadaki güvenlik uzmanları tarafından en sık önerilen AppSec çabalarından biridir ve genellikle uygulamanızın çok düşük güvenlik gereksinimleriyle ilgilenir. Bu strateji, genellikle bilgisayar korsanlığı girişimlerine karşı büyük bir savunma mekanizması olarak kullanılır ve kod yerleştirme, tersine mühendislik ve müşterilerin ve uygulama kullanıcılarının kişisel bilgilerini değiştirme gibi tipik tehditlere karşı koruma sağlar.

Kodun gizlenmesi?

Yürütülebilir dosyaları artık anlaşılır, anlaşılır veya pratik olmayacak şekilde gizleme uygulaması, kod gizleme olarak bilinir. Kaynak kodu, üçüncü bir tarafın değil, yürütmeyi kavraması bile anlaşılmaz ve zor olacak ölçüde karıştırılmıştır. Son kullanıcı kullanıcı arabirimi veya kodun amaçlanan çıktısı, belirsizlikten etkilenmez. Kodu, bir yazılımın yürütülebilir koduna erişimi olan herhangi bir potansiyel bilgisayar korsanı için işe yaramaz hale getirmek için yalnızca bir önlem adımıdır.

Kodu gizlemek neden gereklidir?

Kodun gizlenmesi, kişisel fayda için hacklenebilirlik açısından önemli bir dezavantaja sahip olan açık kaynaklı yazılımlar için özellikle önemlidir. Geliştiriciler, bir programı tersine mühendislik yapmayı zorlaştırarak, ürünlerinin fikri mülkiyetinin güvenlik risklerine, yasa dışı erişime ve uygulama kusurlarının keşfedilmesine karşı korunduğunu garanti eder.

Kullanılan karartma tekniğinin türünden bağımsız olarak, bu yaklaşım tehlikeli kaynak kodunu kısıtlar ve çeşitli düzeylerde program güvenliği sağlar. Zaman, maliyet ve kaynak nedenlerinin tümü, geri derlenmiş kod okunaksız hale geldiğinden, gizlendiğinde kodunuzu terk etmeyi tercih eder.

Kod Gizleme Teknikleri

Gizleme çeşitli düzeylerde çalışır: anlamsal/sözcüksel kod yapısı düzeyinde veya veri yapısı/kontrol akışı düzeyinde uygulanabilir. Gizleme stratejileri, kod üzerindeki eyleme bağlı olarak da farklılık gösterir. Temelde, güvenlik ekibi, geliştirme ekibi ile işbirliği içinde kod üzerinde kullanılacak gizleme türünü belirler.

Gizleme yeniden adlandırılmalıdır.

Bu yaklaşım, değişkenleri kafa karıştırıcı bir şekilde adlandırmayı gerektirir, böylece onları kullanmanın asıl amacı akıllıca gizlenir. Yöntemler ve değişkenler çeşitli gösterimler ve sayılarla yeniden adlandırıldığından, kod çözücüler kontrol akışını anlamakta zorlanırlar. Bu gizleme yöntemi yaygın olarak Java,.NET ve Android platform uygulama kodunu gizlemek için kullanılır. Bu, uygulama için bir koruma katmanı sağlamak için doğrudan kaynak kodunu hedeflediğinden, düzen gizleme olarak sınıflandırılır.

Verilerin gizlenmesi

Bu yöntem, kodda kullanılan veri yapılarına odaklanır ve bilgisayar korsanının programın gerçek amacına erişmesini imkansız hale getirir. Bu, verilerin yazılım tarafından bellekte saklanma şeklini ve nihai sonucu üretmek için bu verilerin nasıl işlendiğini değiştirmeyi gerektirebilir. Bu prosedür çeşitli şekillerde yapılabilir:

1. Toplamanın Gizlenmesi
Bunun sonucunda verilerin yazılıma kaydedilme şekli değişir. Örneğin diziler, daha sonra program boyunca başvurulabilecek birden çok alt diziye bölünebilir.

2. Veri depolamanın gizlenmesi
Bu, verilerin bellekte depolanma şeklini etkiler. Örneğin geliştiriciler, değişken davranışının gerçek doğasını gizlemek için yerel ve küresel değişken depolama arasında geçiş yapabilir.

3. İsteğe bağlı olarak şaşırtma elde etme
Bu yaklaşım, programın/kod parçacığının işlevselliğini değiştirmeden verilerin sırasını değiştirir. Geliştiriciler bunu, değişken referansının her bir örneği için çağrılan ayrı bir modül oluşturarak başarır.

4. Dizeleri şifreleme
Bu teknik, okunabilir tüm dizeleri şifreleyerek okunaksız bir kodla sonuçlanır. Yazılım çalıştırıldığında, çalışma zamanında şifrelerinin çözülmesi gerekir.

5. Kontrol/Kod Akışının Gizlenmesi
Kontrolün kod tabanının bir bölümünden diğerine iletilme şekli, programın hedefini belirlemede çok önemlidir. Bu akışı gizlemek, genellikle oyunun akışını bozmanın en karlı yoludur. Bu şaşırtma stratejisi, kodun belirli bir yolu nasıl ve neden izlediğini anlamalarını zorlaştırarak bilgisayar korsanlarını uzak tutar.

Rastgele ve beklenmedik ifadelerin yanı sıra, asla yürütülmeyecek olan gereksiz büyük/küçük harf geçişli ifadelerin (ölü kod) dahil edilmesi, bu şaşırtma stratejisini gerçekleştirmenin en yaygın yollarından biridir. Bu iddiaların, hedeflenen bilgisayar korsanını şaşırtmaktan başka bir işlevi yoktur. Koşullu program oryantasyonu durumunda, program yürütme ifadeleri sırasındaki bu değişiklik son derece yararlıdır.

Gizleme hata ayıklanıyor.

Hata ayıklama bilgileri, kaynak kodun yeniden derlenmesi ve yeniden derlenmesi yoluyla program akışı ve kusurlar hakkında önemli bilgilerin belirlenmesinde sıklıkla yararlıdır. Kimliklerini, satır numaralarını değiştirerek veya hata ayıklama verilerine erişimi tamamen kapatarak bu tür tanımlayıcı verileri gizlemek çok önemlidir.

Şaşılık ele alınmalıdır.

Bellek programlama hataları, özellikle C ve C++ gibi bellek güvenli olmayan dillerde saldırılarda yaygınlaştı. Güvenlik kusurları genellikle kontrolsüz dizi erişimi gibi hatalardan kaynaklanır. Adres gizleme yaklaşımı, kodun sanal adresleri ve programın verileri, dönüştürülen kod her gerçekleştirildiğinde rastgele seçildiğinden, tersine mühendisliği zorlaştırır. Sonuç olarak, bellek hatası saldırılarının çoğu deterministik değildir ve başarı olasılığı çok düşüktür.

Kişiselleştirilmiş Kodlama

Geliştiriciler, dizeleri özel bir algoritmayla şifrelemek için bu yaklaşımı kullanır ve ardından orijinal kodu kurtarmak için bir kod çözücü işlevi sağlar.

Çalışma Zamanında Geçilen Bağımsız Değişkenler

Programı, çalışma zamanında parametreleri bekleyecek şekilde değiştirmek mümkündür. Değişkenleri çözmek için kullanıcının hem koda hem de şifre çözme anahtarına sahip olması gerekir.

Uygulamaları çeşitli güvenlik tehditlerine karşı korumak için katmanlı bir savunma yöntemi geliştirmek için güvenlik ekibi aynı anda birden fazla teknik kullanmayı seçebilir.

Çözüm

Özetlemek gerekirse, tek başına yanlış yönlendirme, gelişmiş güvenlik endişeleriyle mücadelede etkisizdir. Yapay zeka yazılımının mevcudiyeti ve bilgisayar korsanlarının becerisi nedeniyle kodu gizlemek daha zordur, ancak imkansız değildir. Sonuç olarak, kriptografi tüm yazılım güvenliği endişeleri için her derde deva değildir.
Geliştirme ekibi, güvenlik ihtiyacına, programın doğasına ve performans karşılaştırmasına bağlı olarak, kodlarını güvenilmeyen bir ortamda güvenceye almak için çeşitli kod gizleme yaklaşımları kullanabilir. Bunlar, her bir yaklaşımın avantaj ve dezavantajları dikkate alınarak gerçekleştirilmelidir. Şifreleme, RASP, veri saklama düzenlemeleri vb. gibi diğer AppSec girişimleri bu strateji tarafından desteklenmelidir. AppSealing gibi RASP çözümleriyle birleştirildiğinde, günümüzün güvenlik endişelerine karşı güçlü bir panzehir haline gelir.