Obfuscator — bu nima, kod obfuskatsiyasi usullari va himoya vositalari

Muallif: IT Sectr Nashr etilgan: 2026-05-19 O'qish vaqti: 8 daq

Obfuscator — manba kodini funksionalligini o'zgartirmasdan o'qish qiyin bo'lgan shaklga aylantiruvchi vosita. Obfuscator intellektual mulkni himoya qilish, kod tahlilini qiyinlashtirish va reverse engineeringning oldini olish uchun qo'llaniladi. Android Developers Documentation ma'lumotlariga ko'ra, R8 va ProGuard orqali obfuskatsiya Android ilovalarining ishlab chiqarish qurilishining standart bosqichidir.

Asosiy fikrlar

  • Obfuskatsiya — kodni bajarish mantiqini saqlagan holda tushunish qiyin bo'lgan shaklga aylantirish
  • ProGuard — Java va Android uchun klassik obfuskator, siqish, optimallashtirish va obfuskatsiyani qo'llab-quvvatlaydi
  • R8 — ProGuard o'rnini bosuvchi zamonaviy Android obfuskatori, Android Gradle Plugin-ga o'rnatilgan
  • O'zgaruvchilar nomi kodni tushunishni qiyinlashtirish uchun qisqa identifikatorlar (a, b, c) bilan almashtiriladi
  • Control flow obfuscation — o'lik shoxchalar va shartlarni takrorlash orqali bajarish oqimini chigallashtirish

Obfuscator nima?

Obfuscator — obfuskatsiyani amalga oshiruvchi dastur: o'qiladigan kodni funksional jihatdan ekvivalent, ammo inson uchun o'qib bo'lmaydigan shaklga aylantiradi. Obfuskatorning asosiy vazifalari — identifikatorlarni qayta nomlash (identifier mangling), disk raskadka ma'lumotlarini olib tashlash, boshqaruv oqimini chigallashtirish (control flow obfuscation) va satr literallarini shifrlash (string encryption).

Obfuskatsiya shifrlash emas. Shifrlangan kod shifrni ochmasdan bajarilmaydi. Obfuskatsiya qilingan kod to'g'ridan-to'g'ri JVM, ART yoki JavaScript dvigateli tomonidan bajariladi, ammo inson uni tushunishi juda qiyin. Obfuskatsiya mutlaq himoyani ta'minlamaydi — motivatsiyalangan mutaxassis har doim deobfuskator yoki runtime tuzatish vositalari orqali mantiqni tiklashi mumkin.

Obfuskatorlarning rivojlanish tarixi

Birinchi tijorat obfuskatori ProGuard 2002 yilda Java appletlari uchun vosita sifatida paydo bo'ldi. Androidning o'sishi bilan (2008) ProGuard mobil ishlanma uchun standartga aylandi. 2018 yilda Google Android Gradle Plugin 3.4 uchun ProGuard o'rnini bosuvchi R8 ni chiqardi. R8 ProGuarddan 2-3 marta tezroq va SSA (Static Single Assignment) — ma'lumotlar oqimini tahlil qilish imkonini beruvchi oraliq taqdimot formati darajasida chuqur optimallashtirish hisobiga ixchamroq bayt kodini yaratadi.

Veb-ishlanmada obfuskatsiya oddiy almashtirishlardan (YUI Compressor, 2007) murakkab AST transformatorlarigacha (Obfuscator.io, 2016) evolyutsiya qildi. Zamonaviy JavaScript obfuskatorlari control flow flattening, opaque predicates (har doim true yoki false bo'lgan, ammo analizator uchun aniq bo'lmagan shartlar) va runtime da o'z-o'zidan shifrni ochadigan satr shifrlashidan foydalanadi. Jscrambler (2012) obfuskatsiyani tuzatish vositalaridan himoya va DRM mexanizmlari bilan birlashtiradi.

Qo'llash sohasi keng. Mobil ishlanmada obfuskatorlar kodni APK dekompilyatorlaridan (jadx, APKTool, dex2jar) himoya qiladi. Veb-ishlanmada JavaScript obfuskatsiyasi algoritmlar, API kalitlari va mijoz tomonidagi biznes mantiqini himoya qiladi. Kutubxonalar va SDK larda obfuskatsiya kodning raqobatchilar tomonidan ishlatilishini oldini oladi.

Obfuskator kod bilan nima qiladi

TexnikaObfuskatsiyadan oldinObfuskatsiyadan keyin
Sinflarni qayta nomlashNetworkManagera
Metodlarni qayta nomlashsendRequest()b()
Satrlarni shifrlash"API_KEY"decrypt("x9fK2p")
Shartlarni chigallashtirishif (a > b)if (a > b ? true : false)

Kod obfuskatsiyasi usullari

Identifier mangling (identifikatorlarni qayta nomlash) — eng keng tarqalgan usul. Sinflar, metodlar, maydonlar va o'zgaruvchilar nomlari qisqa, ma'lumotsiz satrlar bilan almashtiriladi: a, b, c, aa, ab. Bu kodning har bir elementining maqsadini tushunishni qiyinlashtiradi. ProGuard va R8 har xil turlar (sinf A, maydon A, metod A) uchun bir xil nomlardan foydalanib, tahlilni yanada chigallashtiradi.

Control flow obfuscation (boshqaruv oqimini chigallashtirish) kod tuzilishini shunday o'zgartiradiki, chiziqli ketma-ketlik aniq bo'lmaydi. O'lik shoxchalar (dead branches) qo'shiladi, shartlar teskari aylantiriladi (if (a) o'rniga if (!a)), goto-ga o'xshash operatorlar (break/continue yorliqlar bilan) qo'yiladi. Bu dekompilyator va tuzatish vositalari orqali tahlilni juda qiyinlashtiradi.

Obfuscator.io orqali JavaScript obfuskatsiyasi namunasi

js
// Manba kodi
function authenticate(token) {
  const url = "https://api.example.com/auth";
  const headers = { Authorization: "Bearer " + token };
  return fetch(url, { method: "POST", headers });
}
js
// Obfuscator.io yuqori rejimidan keyin
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 satr massivlari, massivni aralashtirish uchun o'zini-chaqiruvchi funksiya qo'shdi, barcha identifikatorlarni qayta nomladi va satrlarni massiv indekslari bilan almashtirdi. 5 satrli manba kodi 20+ o'qib bo'lmaydigan satrga aylandi, ammo authenticate(token) funksionalligi to'liq saqlandi. Deobfuskatsiya AST tahlili orqali mumkin, ammo vaqt talab qiladi.

ProGuard va R8: Android ilovalarining obfuskatsiyasi

ProGuard — 2002 yildan beri qo'llaniladigan Java va Android uchun klassik obfuskator. ProGuard uchta vazifani bajaradi: siqish (shrinking — foydalanilmayotgan sinflar va metodlarni olib tashlash), optimallashtirish (bayt kodini optimallashtirish) va obfuskatsiya (identifikatorlarni qayta nomlash). ProGuard Android Gradle Plugin-ga proguard-rules.pro fayli orqali kutubxonalar uchun istisno qoidalari bilan o'rnatiladi.

R8 — AGP 3.4 dan boshlab Android Gradle Plugin-ga kiritilgan zamonaviy obfuskator. R8 ProGuard bilan bir xil funktsiyalarni bajaradi, lekin tezroq (noldan Kotlin tilida yozilgan) va samaraliroq (ART Runtime uchun bayt kodini yaxshiroq optimallashtiradi). R8 sozlamasi ProGuard uchun bo'lgani kabi bir xil proguard-rules.pro fayllari orqali amalga oshiriladi. R8 ni faollashtirish uchun build.gradle da minifyEnabled true ni o'rnatish kifoya.

Mapping fayllari va crash report larning deobfuskatsiyasi

Mapping fayli — R8/ProGuard ishining natijasi, sinflar, metodlar va maydonlarning asl va obfuskatsiya qilingan nomlari o'rtasidagi moslikni o'z ichiga oladi. Mapping fayli crash report larni tahlil qilish uchun juda muhim: usiz stack trace da com.example.app.MainActivity.onCreate o'rniga a.a.b bo'ladi. Firebase Crashlytics va Sentry avtomatik ravishda mapping fayllarini yuklaydi va hisobotlarda asl nomlarni tiklaydi.

Mapping fayllari ilovaning har bir yangi versiyasini nashr qilishda Firebase yoki Sentry ga yuklanishi kerak. Agar mapping fayli yo'qolsa yoki yuklanmasa, obfuskatsiyadan keyingi barcha crash report lar o'qib bo'lmaydigan bo'lib qoladi. Android Gradle Plugin mapping faylini avtomatik ravishda build/outputs/mapping/release/mapping.txt da saqlaydi. Firebase uchun Crashlytics Gradle Plugin ishlatiladi, u release versiyasini yig'ishda mapping ni yuklaydi.

Android uchun ProGuard/R8 konfiguratsiyasi

groovy
// app/build.gradle — R8 orqali obfuskatsiya
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(
                "proguard-android-optimize.txt"),
                "proguard-rules.pro"
        }
    }
}
none
# proguard-rules.pro — saqlash qoidalari
# Gson uchun ma'lumot modelini saqlash
-keep class com.example.model.** { *; }

# Retrofit interfeyslari uchun sinflarni saqlash
-keep,allowobfuscation interface com.example.api.*

# Ommaviy activity larni obfuska qilmaslik
-keep class * extends android.app.Activity {
    public protected *;
}

# Ishlab chiqarishda loglarni olib tashlash
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(...);
    public static int v(...);
    public static int d(...);
}

-keep qoidalari proguard-rules.pro da juda muhim — ularsiz R8 refleksiya (Gson, Retrofit, Room) orqali ishlatiladigan sinflar va metodlarni o'chirib yuboradi yoki qayta nomlaydi. assumenosideeffects ishlab chiqarish kodidan Log.v va Log.d chaqiruvlarini olib tashlaydi. Gson, Retrofit va OkHttp kabi kutubxonalar AAR ichidagi proguard.txt da tayyor qoidalarni taqdim etadi.

JavaScript obfuskatsiyasi: Obfuscator.io va Jscrambler

Obfuscator.io — identifikatorlarni qayta nomlash, satrlarni shifrlash, boshqaruv oqimini chigallashtirish (control flow flattening) va tuzatishdan himoya (debug protection) qo'llab-quvvatlashi bilan eng mashhur ochiq JavaScript obfuscatoridir. Obfuskatsiya sozlamasi JSON-konfig yoki CLI orqali amalga oshiriladi. Bepul versiya asosiy usullarni qo'llab-quvvatlaydi; Enterprise versiyasi polimorf kod va o'zini-o'zi himoya qilishni qo'shadi.

Jscrambler — kengaytirilgan himoyaga ega tijorat JavaScript obfuscatori: polimorf transformatsiyalar (har bir ishga tushirish yangi obfuskatsiya qilingan kod yaratadi), tuzatish vositalaridan himoya (DevTools aniqlash), ekran tasvirlaridan himoya (self-defending) va muddat tugash mexanizmlari (kod ma'lum sanadan keyin ishlashni to'xtatadi). Jscrambler bank ilovalari va DRM tizimlarida qo'llaniladi.

Obfuscator.io konfiguratsiyasi

js
// obfuscate.js — Obfuscator.io konfiguratsiyasi
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);

Parametrlar Obfuscator.io: controlFlowFlattening: 0.75 bloklarning 75 foizida boshqaruv oqimini chigallashtiradi; stringArray: true satrlarni massivga chiqaradi; debugProtection DevTools ochilishining oldini oladi; disableConsoleOutput console.log ni olib tashlaydi. Chegaralar qanchalik yuqori bo'lsa, obfuskatsiya vaqti va kod hajmi shunchalik katta, ammo tahlil shunchalik qiyin.

Obfuskatsiyaning cheklovlari va xavflari

Obfuskatsiya himoya qilmaydi runtime tahlilidan. Hujumchi ilovani tuzatish vositasida (Frida, Objection, Xposed) ishga tushirib, metodlarni real vaqtda tutib olishi mumkin. Obfuskatsiya statik tahlildan (APK dekompilyatsiyasi, bayt kodini o'qish) himoya qiladi, ammo dinamik tahlildan emas. Runtime tahlilidan himoyalanish uchun qo'shimcha choralar talab qilinadi: SSL Pinning, Root Detection, Integrity Verification.

Ilova hajmi obfuskatsiyadan keyin 20-50% oshishi mumkin. Control flow obfuscation o'lik shoxchalar qo'shadi va shartlarni takrorlaydi — bu bayt kodining miqdorini oshiradi. String encryption qisqa satr literallarini decrypt() chaqiruvlari bilan almashtiradi, bu ham hajmni oshiradi. Mobil ilovalar uchun bu juda muhim, chunki APK hajmi to'g'ridan-to'g'ri Google Play dagi konversiyaga ta'sir qiladi.

Ishlash tezligi ham ta'sir ko'radi. Control flow obfuscation qo'shimcha tekshirishlar va tarmoqlanishlarni qo'shib, metodlarning bajarilish vaqtini 5-15% oshiradi. String encryption har bir satrga murojaatda decrypt chaqiruvini qo'shadi. Ishlash tezligi uchun muhim funksiyalarda (Android da onDraw, React da render) obfuskatsiya -keep qoidalari orqali o'chirilishi kerak.

Tez-tez so'raladigan savollar

Obfuskatsiyaning kod shifrlashdan farqi nimada?

Shifrlash kodni shifrni ochmasdan bajarib bo'lmaydigan qiladi — bajarish uchun deshifrator kerak. Obfuskatsiya kodni o'qib bo'lmaydigan, ammo to'g'ridan-to'g'ri bajariladigan qiladi. Shifrlash kuchliroq himoya beradi, ammo o'zi tahlil qilinishi mumkin bo'lgan yuklovchi-deshifratorni talab qiladi.

Kodni deobfuska qilish mumkinmi?

Deobfuskatsiya mumkin, ammo mehnat talab qiladi. jadx, JEB Decompiler va UnConfuser kabi vositalar qisman deobfuskatsiya bilan bayt kodini tiklaydi. Asl nomlar bilan manba kodini to'liq tiklash mumkin emas — nomlar qaytarib bo'lmaydigan darajada yo'qoladi. Zamonaviy obfuskatorlar (R8, ProGuard) avtomatik deobfuskatsiyaga chidamli.

Google Play da nashr qilish uchun obfuskatsiya majburiymi?

Google Play obfuskatsiyani talab qilmaydi, lekin build.gradle da minifyEnabled orqali uni qattiq tavsiya qiladi. Obfuskatsiyasiz ilovalar APKTool va jadx orqali osonlikcha dekompilyatsiya qilinadi, bu ularni API kalitlarini o'g'irlash, modifikatsiya va qaroqchilikka zaif qiladi. Ko'pchilik yirik ilovalar R8 yoki ProGuard dan foydalanadi.

Obfuskatsiya crash report larga qanday ta'sir qiladi?

Crash report lar obfuskatsiyadan keyin obfuska qilingan nomlarni o'z ichiga oladi (com.example.app.MainActivity o'rniga a.b.c). Tiklash uchun R8/ProGuard tomonidan yaratilgan mapping fayllari ishlatiladi. Mapping fayli stack trace larni avtomatik deobfuskatsiya qilish uchun Firebase Crashlytics yoki Sentry ga yuklanishi kerak.

Obfuskatsiyada String Encryption nima?

String Encryption — satr literallarini (API kalitlari, URL lar, xabarlar) runtime da decrypt funksiyasini chaqirish bilan shifrlangan ma'lumotlarga almashtirish. Bu maxfiy satrlarni dekompilyatsiya qilingan koddagi oddiy qidiruv orqali o'qishdan himoya qiladi. R8/ProGuard -encryptstrings qoidasi orqali string encryption ni qo'llab-quvvatlaydi.

Xulosa

  • Obfuscator — kodni funksionallikni saqlab, o'qish qiyin bo'lgan shaklga aylantiruvchi vosita
  • R8 va ProGuard — Android Gradle Plugin-ga o'rnatilgan standart Android obfuskatorlari
  • Identifier mangling sinf va metod nomlarini qisqa ma'lumotsiz identifikatorlar bilan almashtiradi
  • Obfuscator.io — control flow flattening va tuzatishdan himoya bilan ochiq JavaScript obfuscatori
  • Obfuskatsiya himoya qilmaydi Frida va Objection orqali dinamik runtime tahlilidan
  • Mapping fayllari crash report larni deobfuskatsiya qilish uchun zarur va Crashlytics ga yuklanishi kerak

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing