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
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.
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.
| Texnika | Obfuskatsiyadan oldin | Obfuskatsiyadan keyin |
|---|---|---|
| Sinflarni qayta nomlash | NetworkManager | a |
| Metodlarni qayta nomlash | sendRequest() | b() |
| Satrlarni shifrlash | "API_KEY" | decrypt("x9fK2p") |
| Shartlarni chigallashtirish | if (a > b) | if (a > b ? true : false) |
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.
// Manba kodi
function authenticate(token) {
const url = "https://api.example.com/auth";
const headers = { Authorization: "Bearer " + token };
return fetch(url, { method: "POST", headers });
}// 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 — 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 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.
// app/build.gradle — R8 orqali obfuskatsiya
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
"proguard-android-optimize.txt"),
"proguard-rules.pro"
}
}
}# 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.
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.
// 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.
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
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.
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 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.
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.
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
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.