Obfuscator — шта је то, методе обфускације кода и алати за заштиту

Аутор: IT Sectr Објављено: 2026-05-19 Време читања: 8 мин

Obfuscator — алат који претвара изворни код у тешко читљив облик без промене његове функционалности. Obfuscator се користи за заштиту интелектуалне својине, отежавање анализе кода и спречавање реверзног инжењеринга. Према Android Developers Documentation, обфускација кроз R8 и ProGuard је стандардна фаза продукцијске изградње Android апликација.

Главне тачке

  • Обфускација — претварање кода у сложен облик за разумевање уз очување логике извршења
  • ProGuard — класични обфускатор Java и Android са подршком за компресију, оптимизацију и обфускацију
  • R8 — савремени Android обфускатор који замењује ProGuard, уграђен у Android Gradle Plugin
  • Име променљивих се замењује кратким идентификаторима (a, b, c) ради отежавања разумевања кода
  • Control flow obfuscation — замршавање тока извршења кроз мртве гране и дуплирање услова

Шта је Obfuscator?

Obfuscator — програм који врши обфускацију: претварање читљивог кода у еквивалентан по функционалности, али нечитак за човека. Главни задаци обфускатора су преименовање идентификатора (identifier mangling), уклањање отклањајућих информација, замршавање тока управљања (control flow obfuscation) и шифровање стринг литерала (string encryption).

Обфускација није шифровање. Шифровани код се не може извршити без дешифровања. Обфускирани код се извршава директно од стране JVM, ART или JavaScript мотора, али га човек веома тешко разуме. Обфускација не пружа апсолутну заштиту — мотивисани стручњак увек може да поврати логику путем деобфускатора или отклањања грешака у runtime-у.

Историја развоја обфускатора

Први комерцијални обфускатор ProGuard појавио се 2002. године као алат за Java аплете. Са растом Android-а (2008), ProGuard је постао стандард за мобилни развој. 2018. Google је објавио R8 као замену за ProGuard за Android Gradle Plugin 3.4. R8 је 2-3 пута бржи од ProGuard-а и генерише компактнији бајт-код захваљујући дубокој оптимизацији на нивоу SSA (Static Single Assignment) — формата посредног представљања који омогућава анализу тока података.

У веб развоју, обфускација је еволуирала од једноставних замена (YUI Compressor, 2007) до сложених AST трансформатора (Obfuscator.io, 2016). Савремени JavaScript обфускатори користе control flow flattening, opaque predicates (услове који су увек true или false, али неочигледни за анализатор) и шифровање стрингова са самодешифровањем у runtime-у. Jscrambler (2012) интегрише обфускацију са заштитом отклањача грешака и DRM механизмима.

Област примене обфускације је широка. У мобилном развоју, обфускатори штите код од крађе кроз APK декомпилаторе (jadx, APKTool, dex2jar). У веб развоју, JavaScript обфускација штити алгоритме, API кључеве и пословну логику клијентске стране. У библиотекама и SDK-овима, обфускација спречава коришћење кода од стране конкурената.

Шта обфускатор ради са кодом

ТехникаПре обфускацијеПосле обфускације
Преименовање класаNetworkManagera
Преименовање методаsendRequest()b()
Шифровање стрингова"API_KEY"decrypt("x9fK2p")
Замршавање условаif (a > b)if (a > b ? true : false)

Методе обфускације кода

Identifier mangling (преименовање идентификатора) — најраспрострањенији метод. Имена класа, метода, поља и променљивих се замењују кратким, неинформативним стринговима: a, b, c, aa, ab. Ово отежава разумевање намене сваког елемента кода. ProGuard и R8 користе идентична имена за различите типове (класа A, поље A, метод A), додатно замршавајући анализу.

Control flow obfuscation (замршавање тока управљања) мења структуру кода тако да линеарна секвенца постаје неочигледна. Додају се мртве гране (dead branches), услови се инвертују (if (!a) уместо if (a)), убацују се goto-слични оператори (break/continue са ознакама). Ово чини анализу кроз декомпилатор и отклањач грешака изузетно напорном.

Пример обфускације JavaScript кроз Obfuscator.io

js
// Изворни код
function authenticate(token) {
  const url = "https://api.example.com/auth";
  const headers = { Authorization: "Bearer " + token };
  return fetch(url, { method: "POST", headers });
}
js
// Након Obfuscator.io у high режиму
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 је додао низове стрингова, само-позивајућу функцију за мешање низа, преименовао све идентификаторе и заменио стрингове индексима низа. Изворни код од 5 линија претворио се у 20+ нечитљивих линија, али функционалност authenticate(token) је у потпуности сачувана. Деобфускација је могућа кроз AST анализу, али захтева време.

ProGuard и R8: обфускација Android апликација

ProGuard — класични обфускатор за Java и Android, у употреби од 2002. године. ProGuard обавља три задатка: компресију (shrinking — уклањање некоришћених класа и метода), оптимизацију (оптимизација бајт-кода) и обфускацију (преименовање идентификатора). ProGuard се уграђује у Android Gradle Plugin преко датотеке proguard-rules.pro са правилима изузећа за библиотеке.

R8 — модернији обфускатор, укључен у Android Gradle Plugin почев од AGP 3.4. R8 обавља исте функције као ProGuard, али брже (написан од нуле у Kotlin-у) и ефикасније (боље оптимизује бајт-код за ART Runtime). Подешавање R8-а се врши кроз исте proguard-rules.pro датотеке као и за ProGuard. За укључивање R8-а довољно је поставити minifyEnabled true у build.gradle.

Mapping датотеке и деобфускација извештаја о падовима

Mapping датотека — резултат рада R8/ProGuard-а, која садржи везу између оригиналних и обфускираних имена класа, метода и поља. Mapping датотека је критична за анализу извештаја о падовима: без ње, stack trace ће садржати a.a.b уместо com.example.app.MainActivity.onCreate. Firebase Crashlytics и Sentry аутоматски учитавају mapping датотеке и враћају оригинална имена у извештајима.

Mapping датотеке се морају учитати у Firebase или Sentry приликом сваког објављивања нове верзије апликације. Ако се mapping датотека изгуби или не учита, сви извештаји о падовима након обфускације постају нечитљиви. Android Gradle Plugin аутоматски чува mapping датотеку у build/outputs/mapping/release/mapping.txt. За Firebase се користи Crashlytics Gradle Plugin који учитава mapping при изградњи release верзије.

Конфигурација ProGuard/R8 за Android

groovy
// app/build.gradle — обфускација кроз R8
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(
                "proguard-android-optimize.txt"),
                "proguard-rules.pro"
        }
    }
}
none
# proguard-rules.pro — правила чувања
# Сачувај модел података за Gson
-keep class com.example.model.** { *; }

# Сачувај класе за Retrofit интерфејсе
-keep,allowobfuscation interface com.example.api.*

# Не обфускуј јавне активности
-keep class * extends android.app.Activity {
    public protected *;
}

# Уклони логиве у продукцији
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(...);
    public static int v(...);
    public static int d(...);
}

Правила -keep у proguard-rules.pro су критична — без њих R8 ће обрисати или преименовати класе и методе који се користе кроз рефлексију (Gson, Retrofit, Room). assumenosideeffects уклања позиве Log.v и Log.d из продукцијског кода. Библиотеке попут Gson, Retrofit и OkHttp испоручују готова правила у proguard.txt унутар AAR-а.

JavaScript обфускација: Obfuscator.io и Jscrambler

Obfuscator.io — најпопуларнији отворени JavaScript обфускатор са подршком за преименовање идентификатора, шифровање стрингова, замршавање тока управљања (control flow flattening) и заштиту отклањања грешака (debug protection). Подешавање обфускације се врши кроз JSON-конфиг или CLI. Бесплатна верзија подржава основне методе; Enterprise верзија додаје полиморфни код и самозаштиту.

Jscrambler — комерцијални JavaScript обфускатор са проширеном заштитом: полиморфне трансформације (свако покретање генерише нови обфускирани код), заштита отклањача грешака (детекција DevTools), заштита од снимања екрана (self-defending) и механизми истека (код престаје да ради након одређеног датума). Jscrambler се користи у банкарским апликацијама и DRM системима.

Конфигурација Obfuscator.io

js
// obfuscate.js — конфигурација Obfuscator.io
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);

Параметри Obfuscator.io: controlFlowFlattening: 0.75 замршава ток управљања у 75% блокова; stringArray: true премешта стрингове у низ; debugProtection спречава отварање DevTools; disableConsoleOutput уклања console.log. Што су прагови виши, то је време обфускације и величина кода већа, али је анализа тежа.

Ограничења и ризици обфускације

Обфускација не штити од runtime анализе. Нападач може покренути апликацију у отклањачу грешака (Frida, Objection, Xposed) и пресретати методе у реалном времену. Обфускација штити од статичке анализе (декомпилација APK-а, читање бајт-кода), али не и од динамичке. За заштиту од runtime анализе потребне су додатне мере: SSL Pinning, Root Detection, Integrity Verification.

Величина апликације након обфускације може порасти за 20-50%. Control flow obfuscation додаје мртве гране и дуплира услове — ово повећава количину бајт-кода. String encryption замењује кратке стринг литерале позивима decrypt(), што такође повећава величину. За мобилне апликације ово је критично, јер величина APK-а директно утиче на конверзију у Google Play-у.

Перформансе такође трпе. Control flow obfuscation додаје додатне провере и гранања, повећавајући време извршења метода за 5-15%. String encryption додаје позив decrypt при сваком приступу стрингу. За критичне функције по перформансе (onDraw у Android-у, render у React-у) обфускацију треба искључити кроз -keep правила.

Често постављана питања

Како се обфускација разликује од шифровања кода?

Шифровање чини код неизвршивим без дешифровања — за извршење је потребан дешифратор. Обфускација чини код нечитљивим, али директно извршивим. Шифровање пружа јачу заштиту, али захтева учитавач-дешифратор који сам може бити анализиран.

Може ли се код деобфусковати?

Деобфускација је могућа, али напорна. Алати попут jadx, JEB Decompiler и UnConfuser враћају бајт-код са делимичном деобфускацијом. Потпуно враћање изворног кода са оригиналним именима је немогуће — имена се неповратно губе. Савремени обфускатори (R8, ProGuard) су отпорни на аутоматску деобфускацију.

Да ли је обфускација обавезна за објављивање у Google Play-у?

Google Play не захтева обфускацију, али је снажно препоручује кроз minifyEnabled у build.gradle. Апликације без обфускације се лако декомпилирају путем APKTool-а и jadx-а, што их чини рањивим на крађу API кључева, модификацију и пиратерију. Већина великих апликација користи R8 или ProGuard.

Како обфускација утиче на извештаје о падовима?

Извештаји о падовима након обфускације садрже обфускирана имена (a.b.c уместо com.example.app.MainActivity). За враћање се користе mapping датотеке генерисане од стране R8/ProGuard-а. Mapping датотека мора бити учитана у Firebase Crashlytics или Sentry ради аутоматске деобфускације stack trace-ова.

Шта је String Encryption у обфускацији?

String Encryption — замена стринг литерала (API кључеви, URL-ови, поруке) шифрованим подацима са позивом decrypt функције у runtime-у. Ово штити поверљиве стрингове од читања кроз једноставну претрагу у декомпилираном коду. R8/ProGuard подржавају string encryption кроз правило -encryptstrings.

Закључак

  • Obfuscator — алат за претварање кода у тешко читљив облик уз очување функционалности
  • R8 и ProGuard — стандардни Android обфускатори, уграђени у Android Gradle Plugin
  • Identifier mangling замењује имена класа и метода кратким неинформативним идентификаторима
  • Obfuscator.io — отворени JavaScript обфускатор са control flow flattening и заштитом отклањања грешака
  • Обфускација не штити од динамичке runtime анализе кроз Frida и Objection
  • Mapping датотеке су неопходне за деобфускацију извештаја о падовима и морају се учитати у Crashlytics

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође