Obfuscator — kod karartma yöntemleri ve koruma araçları açıklaması

Yazar: IT Sectr Yayınlanma: 2026-05-19 Okuma süresi: 8 dk

Obfuscator, kaynak kodu işlevselliğini değiştirmeden okunması zor bir forma dönüştüren bir araçtır. Obfuscator, fikri mülkiyeti korumak, kod analizini zorlaştırmak ve tersine mühendisliği önlemek için kullanılır. Android Developers Dokümantasyonu'na göre, R8 ve ProGuard aracılığıyla karartma, Android uygulamalarının üretim derlemesinde standart bir adımdır.

Önemli Noktalar

  • Karartma, yürütme mantığını koruyarak kodu anlaşılması karmaşık bir forma dönüştürür
  • ProGuard, sıkıştırma, optimizasyon ve karartmayı destekleyen klasik bir Java ve Android karartıcıdır
  • R8, ProGuard'ın yerini alan, Android Gradle Plugin'e entegre modern bir Android karartıcıdır
  • Değişken adları, kod anlayışını zorlaştırmak için kısa tanımlayıcılarla (a, b, c) değiştirilir
  • Kontrol akışı karartması, ölü dallar ve koşul tekrarları yoluyla yürütme akışını karıştırır

Obfuscator Nedir?

Obfuscator, karartma işlemini gerçekleştiren bir programdır: okunabilir kodu işlevsel olarak eşdeğer ancak insanlar için okunamaz koda dönüştürmek. Bir karartıcının ana görevleri tanımlayıcı karıştırma (identifier mangling), hata ayıklama bilgilerini kaldırma, kontrol akışı karartması ve dize şifrelemedir.

Karartma şifreleme değildir. Şifrelenmiş kod, şifre çözme olmadan yürütülemez. Karartılmış kod, doğrudan JVM, ART veya JavaScript motorunda çalışır, ancak insanların anlaması son derece zordur. Karartma mutlak koruma sağlamaz — kararlı bir uzman, her zaman bir karartma giderici veya çalışma zamanı hata ayıklama yoluyla mantığı kurtarabilir.

Karartıcıların Gelişim Tarihi

İlk ticari karartıcı ProGuard, 2002 yılında Java applet'leri için bir araç olarak ortaya çıktı. Android'in (2008) büyümesiyle ProGuard, mobil geliştirme için standart haline geldi. 2018'de Google, Android Gradle Plugin 3.4 için ProGuard'ın yerine R8'i yayınladı. R8, ProGuard'dan 2–3 kat daha hızlıdır ve SSA (Static Single Assignment) düzeyinde derin optimizasyon sayesinde daha kompakt bayt kodu üretir — bu, veri akışı analizine izin veren bir ara temsil biçimidir.

Web geliştirmede karartma, basit küçültücülerden (YUI Compressor, 2007) karmaşık AST dönüştürücülerine (Obfuscator.io, 2016) kadar evrildi. Modern JavaScript karartıcıları, kontrol akışı düzleştirme, opak yüklemler (her zaman doğru veya yanlış olan ancak analizci için açık olmayan koşullar) ve çalışma zamanında kendi kendine şifre çözme ile dize şifreleme kullanır. Jscrambler (2012), karartmayı hata ayıklayıcı koruması ve DRM mekanizmalarıyla entegre eder.

Uygulama alanı geniştir. Mobil geliştirmede, karartıcılar APK derleyicileri (jadx, APKTool, dex2jar) aracılığıyla kod hırsızlığına karşı korur. Web geliştirmede, JavaScript karartması algoritmaları, API anahtarlarını ve istemci tarafı iş mantığını korur. Kütüphanelerde ve SDK'larda karartma, rakiplerin kodu kullanmasını engeller.

Bir Karartıcının Kodla Yaptıkları

TeknikKarartmadan ÖnceKarartmadan Sonra
Sınıf yeniden adlandırmaNetworkManagera
Metot yeniden adlandırmasendRequest()b()
Dize şifreleme"API_KEY"decrypt("x9fK2p")
Koşul karartmaif (a > b)if (a > b ? true : false)

Kod Karartma Yöntemleri

Identifier Mangling en yaygın yöntemdir. Sınıfların, metotların, alanların ve değişkenlerin adları kısa, bilgi vermeyen dizelerle değiştirilir: a, b, c, aa, ab. Bu, her kod öğesinin amacını anlamayı zorlaştırır. ProGuard ve R8, farklı türler (sınıf A, alan A, metot A) için aynı adları kullanarak analizi daha da karmaşık hale getirir.

Kontrol Akışı Karartması, doğrusal sıranın belirgin olmaması için kod yapısını değiştirir. Ölü dallar eklenir, koşullar tersine çevrilir (if (a) yerine if (!a)), goto benzeri operatörler (etiketlerle break/continue) eklenir. Bu, bir derleyici ve hata ayıklayıcı aracılığıyla analizi son derece zaman alıcı hale getirir.

Obfuscator.io ile JavaScript Karartma Örneği

js
// Kaynak kod
function authenticate(token) {
  const url = "https://api.example.com/auth";
  const headers = { Authorization: "Bearer " + token };
  return fetch(url, { method: "POST", headers });
}
js
// Obfuscator.io yüksek modda sonra
const _0x4f2e = ["https://api.example.com/auth",
  "Authorization", "Bearer ", "POST"];
(function(_0x5a3b, _0x4f2e) {
  const _0x1c2d = function(_0x3e4f) {
    while (--_0x3e4f) {
      _0x5a3b["push"](_0x5a3b["shift"]());
    }
  };
  _0x1c2d(++_0x4f2e);
}(_0x4f2e, _0x1c2d));

function _0x1c2d(_0x5a3b, _0x4f2e) {
  return _0x4f2e[_0x5a3b];
}

function _0x3e4f(_0x1c2d) {
  const _0x5a3b = _0x1c2d(0, "https://api.example.com/auth");
  const _0x4f2e = { Authorization: "Bearer " + _0x1c2d };
  return fetch(_0x5a3b, { method: "POST", headers: _0x4f2e });
}

Obfuscator.io dize dizileri, diziyi karıştırmak için kendi kendini çağıran bir işlev ekledi, tüm tanımlayıcıları yeniden adlandırdı ve dizeleri dizi indeksleriyle değiştirdi. Orijinal 5 satır kod, 20+ okunamaz satıra dönüştü, ancak authenticate(token) işlevselliği tamamen korundu. Karartma giderme AST analizi yoluyla mümkündür, ancak zaman gerektirir.

ProGuard ve R8: Android Uygulamalarının Karartılması

ProGuard, 2002'den beri kullanılan Java ve Android için klasik bir karartıcıdır. ProGuard üç görevi yerine getirir: sıkıştırma (kullanılmayan sınıfları ve metotları kaldırma), optimizasyon (bayt kodu optimizasyonu) ve karartma (tanımlayıcıları yeniden adlandırma). ProGuard, kütüphaneler için istisna kurallarıyla proguard-rules.pro dosyası aracılığıyla Android Gradle Plugin'e entegre edilir.

R8, AGP 3.4'ten itibaren Android Gradle Plugin'e dahil edilen daha modern bir karartıcıdır. R8, ProGuard ile aynı işlevleri yerine getirir ancak daha hızlıdır (sıfırdan Kotlin'de yazılmıştır) ve daha verimlidir (ART Runtime için daha iyi bayt kodu optimizasyonu). R8, ProGuard ile aynı proguard-rules.pro dosyaları kullanılarak yapılandırılır. R8'i etkinleştirmek için build.gradle'da minifyEnabled true olarak ayarlamak yeterlidir.

Mapping Dosyaları ve Çökme Raporlarının Karartmasını Giderme

Mapping dosyası, R8/ProGuard'ın çıktısıdır ve sınıfların, metotların ve alanların orijinal ve karartılmış adları arasındaki eşlemeyi içerir. Mapping dosyası, çökme raporlarını analiz etmek için kritiktir: onsuz, bir yığın izi com.example.app.MainActivity.onCreate yerine a.a.b içerecektir. Firebase Crashlytics ve Sentry, mapping dosyalarını otomatik olarak yükler ve raporlarda orijinal adları geri yükler.

Mapping dosyaları, her yeni uygulama sürümüyle Firebase veya Sentry'ye yüklenmelidir. Mapping dosyası kaybolursa veya yüklenmezse, karartmadan sonraki tüm çökme raporları okunamaz hale gelir. Android Gradle Plugin, mapping dosyasını otomatik olarak build/outputs/mapping/release/mapping.txt konumuna kaydeder. Firebase, sürüm derlemesi sırasında mapping'i yükleyen Crashlytics Gradle Plugin'ini kullanır.

Android için ProGuard/R8 Yapılandırması

groovy
// app/build.gradle — R8 ile karartma
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(
                "proguard-android-optimize.txt"),
                "proguard-rules.pro"
        }
    }
}
none
# proguard-rules.pro — koruma kuralları
# Gson için veri modelini koru
-keep class com.example.model.** { *; }

# Retrofit arayüzleri için sınıfları koru
-keep,allowobfuscation interface com.example.api.*

# Genel etkinlikleri karartma
-keep class * extends android.app.Activity {
    public protected *;
}

# Üretimde günlükleri kaldır
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(...);
    public static int v(...);
    public static int d(...);
}

proguard-rules.pro dosyasındaki -keep kuralları kritiktir — bunlar olmadan R8, yansıma (Gson, Retrofit, Room) yoluyla kullanılan sınıfları ve metotları kaldıracak veya yeniden adlandıracaktır. assumentSideEffects, üretim kodundan Log.v ve Log.d çağrılarını kaldırır. Gson, Retrofit ve OkHttp gibi kütüphaneler, AAR içindeki proguard.txt dosyasında hazır kurallar sağlar.

JavaScript Karartması: Obfuscator.io ve Jscrambler

Obfuscator.io, tanımlayıcı yeniden adlandırma, dize şifreleme, kontrol akışı düzleştirme ve hata ayıklayıcı korumasını destekleyen en popüler açık kaynak JavaScript karartıcısıdır. Yapılandırma JSON yapılandırması veya CLI aracılığıyla yapılır. Ücretsiz sürüm temel yöntemleri destekler; Enterprise sürümü polimorfik kod ve kendini koruma ekler.

Jscrambler, gelişmiş korumaya sahip ticari bir JavaScript karartıcısıdır: polimorfik dönüşümler (her çalıştırma yeni karartılmış kod üretir), hata ayıklayıcı koruması (DevTools algılama), ekran görüntüsü koruması (kendini savunma) ve süre sonu mekanizmaları (kod belirli bir tarihten sonra çalışmayı durdurur). Jscrambler, bankacılık uygulamalarında ve DRM sistemlerinde kullanılır.

Obfuscator.io Yapılandırması

js
// obfuscate.js — Obfuscator.io yapılandırması
const JavaScriptObfuscator = require("javascript-obfuscator");
const fs = require("fs");

const code = fs.readFileSync("app.js", "utf8");
const result = JavaScriptObfuscator.obfuscate(code, {
  compact: true,
  controlFlowFlattening: true,
  controlFlowFlatteningThreshold: 0.75,
  numbersToExpressions: true,
  simplify: false,
  stringArray: true,
  stringArrayThreshold: 0.8,
  debugProtection: true,
  disableConsoleOutput: true,
});

fs.writeFileSync("app.obfuscated.js", result.code);

Parametreler Obfuscator.io: controlFlowFlattening: 0.75, blokların %75'inde kontrol akışını karıştırır; stringArray: true, dizeleri bir diziye taşır; debugProtection, DevTools'un açılmasını engeller; disableConsoleOutput, console.log'u kaldırır. Eşikler ne kadar yüksekse, karartma süresi ve kod boyutu o kadar büyük olur, ancak analiz o kadar zor olur.

Karartmanın Sınırlamaları ve Riskleri

Karartma, çalışma zamanı analizine karşı koruma sağlamaz. Bir saldırgan, uygulamayı bir hata ayıklayıcıda (Frida, Objection, Xposed) çalıştırabilir ve metotları gerçek zamanlı olarak yakalayabilir. Karartma, statik analize (APK derlemesini çözme, bayt kodu okuma) karşı korur, ancak dinamik analize karşı korumaz. Çalışma zamanı koruması için ek önlemler gereklidir: SSL Pinning, Root Detection, Integrity Verification.

Uygulama boyutu karartmadan sonra %20–50 oranında artabilir. Kontrol akışı karartması ölü dallar ekler ve koşulları tekrarlar — bu, bayt kodu boyutunu artırır. Dize şifreleme, kısa dize değişmezlerini decrypt() çağrılarıyla değiştirir, bu da boyutu artırır. Mobil uygulamalar için bu kritiktir, çünkü APK boyutu Google Play'deki dönüşümü doğrudan etkiler.

Performans da etkilenir. Kontrol akışı karartması ek kontroller ve dallar ekleyerek metot yürütme süresini %5–15 artırır. Dize şifreleme, her dize erişiminde bir decrypt çağrısı ekler. Performans açısından kritik işlevler için (Android'de onDraw, React'te render), -keep kuralları aracılığıyla karartma devre dışı bırakılmalıdır.

Sıkça Sorulan Sorular

Karartma, kod şifrelemeden nasıl farklıdır?

Şifreleme, kodu şifre çözme olmadan yürütülemez hale getirir — yürütme için bir şifre çözücü gerekir. Karartma, kodu okunamaz hale getirir ancak doğrudan yürütülebilir hale getirir. Şifreleme daha güçlü koruma sağlar ancak kendisi analiz edilebilecek bir şifre çözücü yükleyici gerektirir.

Kodun karartması giderilebilir mi?

Karartma giderme mümkündür ancak emek yoğundur. jadx, JEB Decompiler ve UnConfuser gibi araçlar, kısmi karartma giderme ile bayt kodunu geri yükler. Orijinal adlarla orijinal kaynak kodun tamamen geri yüklenmesi imkansızdır — adlar geri dönülemez şekilde kaybolur. Modern karartıcılar (R8, ProGuard) otomatik karartma gidermeye karşı dirençlidir.

Google Play'de yayınlamak için karartma zorunlu mu?

Google Play karartma gerektirmez ancak build.gradle'da minifyEnabled aracılığıyla şiddetle tavsiye eder. Karartma olmayan uygulamalar, APKTool ve jadx aracılığıyla kolayca derlenebilir, bu da onları API anahtarı hırsızlığına, değişikliğe ve korsanlığa karşı savunmasız hale getirir. Çoğu büyük uygulama R8 veya ProGuard kullanır.

Karartma çökme raporlarını nasıl etkiler?

Çökme raporları karartmadan sonra karartılmış adlar (com.example.app.MainActivity yerine a.b.c) içerir. Geri yükleme için R8/ProGuard tarafından oluşturulan mapping dosyaları kullanılır. Otomatik yığın izi karartma giderme için mapping dosyasının Firebase Crashlytics veya Sentry'ye yüklenmesi gerekir.

Karartmada Dize Şifreleme Nedir?

Dize Şifreleme, dize değişmezlerini (API anahtarları, URL'ler, mesajlar) şifrelenmiş verilerle ve çalışma zamanında decrypt işlev çağrısıyla değiştirir. Bu, hassas dizelerin derlenmiş kodda basit arama yoluyla okunmasını önler. R8/ProGuard, -encryptstrings kuralı aracılığıyla dize şifrelemeyi destekler.

Özet

  • Obfuscator, işlevselliği koruyarak kodu okunması zor bir forma dönüştüren bir araçtır
  • R8 ve ProGuard, Android Gradle Plugin'e entegre edilmiş standart Android karartıcılardır
  • Identifier Mangling, sınıf ve metot adlarını kısa bilgi vermeyen tanımlayıcılarla değiştirir
  • Obfuscator.io, kontrol akışı düzleştirme ve hata ayıklayıcı korumasına sahip açık kaynak bir JavaScript karartıcısıdır
  • Karartma, Frida ve Objection aracılığıyla dinamik çalışma zamanı analizine karşı koruma sağlamaz
  • Mapping dosyaları çökme raporu karartma giderme için gereklidir ve Crashlytics'e yüklenmelidir

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun