Obfuscator — ano ito, mga paraan ng obfuscation ng code at mga tool sa proteksyon

May-akda: IT Sectr Nai-publish: 2026-05-19 Oras ng pagbabasa: 8 min

Obfuscator — isang tool na nagko-convert ng source code sa isang mahirap basahin na anyo nang hindi binabago ang functionality nito. Ginagamit ang Obfuscator para protektahan ang intelektwal na pag-aari, pahirapan ang pagsusuri ng code at pigilan ang reverse engineering. Ayon sa Android Developers Documentation, ang obfuscation sa pamamagitan ng R8 at ProGuard ay isang karaniwang yugto ng production build ng mga Android application.

Mga pangunahing punto

  • Obfuscation — pag-convert ng code sa isang mahirap intindihin na anyo habang pinapanatili ang execution logic
  • ProGuard — klasikong obfuscator para sa Java at Android na may suporta sa compression, optimization at obfuscation
  • R8 — modernong Android obfuscator na pumapalit sa ProGuard, naka-embed sa Android Gradle Plugin
  • Pangalan ng variable ay pinapalitan ng maiikling identifier (a, b, c) para pahirapan ang pag-intindi ng code
  • Control flow obfuscation — paggulo sa daloy ng execution sa pamamagitan ng dead branches at pagdoble ng mga kondisyon

Ano ang Obfuscator?

Obfuscator — program na nagsasagawa ng obfuscation: pag-convert ng nababasang code sa katumbas na functionally ngunit hindi nababasa ng tao. Ang mga pangunahing gawain ng obfuscator — pagpapalit ng pangalan ng mga identifier (identifier mangling), pag-alis ng debug information, paggulo ng control flow (control flow obfuscation) at encryption ng string literals (string encryption).

Ang obfuscation ay hindi encryption. Na-encrypt na code ay hindi maaaring isagawa nang walang decryption. Ang obfuscated code ay direktang isinasagawa ng JVM, ART o JavaScript engine, ngunit napakahirap intindihin ng tao. Hindi nagbibigay ang obfuscation ng ganap na proteksyon — ang motivated na espesyalista ay palaging maaaring ibalik ang logic sa pamamagitan ng deobfuscator o runtime debugging.

Kasaysayan ng pag-unlad ng mga obfuscator

Ang unang komersyal na obfuscator na ProGuard ay lumitaw noong 2002 bilang tool para sa Java applets. Sa paglago ng Android (2008), naging pamantayan ang ProGuard para sa mobile development. Noong 2018, inilabas ng Google ang R8 bilang kapalit ng ProGuard para sa Android Gradle Plugin 3.4. Ang R8 ay 2-3 beses na mas mabilis kaysa ProGuard at bumubuo ng mas compact na bytecode dahil sa malalim na optimization sa antas ng SSA (Static Single Assignment) — isang format ng intermediate representation na nagpapahintulot sa pagsusuri ng data flow.

Sa web development, ang obfuscation ay nag-evolve mula sa simpleng pagpapalit (YUI Compressor, 2007) hanggang sa kumplikadong AST transformer (Obfuscator.io, 2016). Ang mga modernong JavaScript obfuscator ay gumagamit ng control flow flattening, opaque predicates (mga kondisyon na laging true o false ngunit hindi halata sa analyzer) at string encryption na may self-decrypt sa runtime. Isinasama ng Jscrambler (2012) ang obfuscation sa proteksyon laban sa debugger at DRM mechanisms.

Saklaw ng aplikasyon ng obfuscation ay malawak. Sa mobile development, pinoprotektahan ng mga obfuscator ang code laban sa pagnanakaw sa pamamagitan ng APK decompiler (jadx, APKTool, dex2jar). Sa web development, pinoprotektahan ng JavaScript obfuscation ang mga algorithm, API key at business logic ng client side. Sa mga library at SDK, pinipigilan ng obfuscation ang paggamit ng code ng mga kakumpitensya.

Ano ang ginagawa ng obfuscator sa code

TeknikBago ang obfuscationPagkatapos ng obfuscation
Pagpapalit ng pangalan ng klaseNetworkManagera
Pagpapalit ng pangalan ng methodsendRequest()b()
Encryption ng string"API_KEY"decrypt("x9fK2p")
Paggulo ng mga kondisyonif (a > b)if (a > b ? true : false)

Mga paraan ng obfuscation ng code

Identifier mangling (pagpapalit ng pangalan ng mga identifier) — ang pinakakaraniwang paraan. Ang mga pangalan ng klase, method, field at variable ay pinapalitan ng maiikling hindi impormatibong string: a, b, c, aa, ab. Ito ay nagpapahirap sa pag-intindi ng layunin ng bawat elemento ng code. Ang ProGuard at R8 ay gumagamit ng magkakaparehong pangalan para sa iba't ibang uri (klase A, field A, method A), lalong ginugulo ang pagsusuri.

Control flow obfuscation (paggulo ng control flow) ay nagbabago ng istruktura ng code upang ang linear sequence ay hindi halata. Ang mga dead branches ay idinadagdag, ang mga kondisyon ay binabaligtad (if (!a) sa halip na if (a)), ang mga operator na parang goto (break/continue na may label) ay isinisingit. Ginagawa nitong napakahirap ang pagsusuri sa pamamagitan ng decompiler at debugger.

Halimbawa ng JavaScript obfuscation sa pamamagitan ng Obfuscator.io

js
// Source code
function authenticate(token) {
  const url = "https://api.example.com/auth";
  const headers = { Authorization: "Bearer " + token };
  return fetch(url, { method: "POST", headers });
}
js
// Pagkatapos ng Obfuscator.io sa high mode
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 ay nagdagdag ng mga string array, self-invoking function para guluhin ang array, pinalitan ang pangalan ng lahat ng identifier at pinalitan ang mga string ng array index. Ang source code na 5 linya ay naging 20+ hindi nababasang linya, ngunit ang functionality ng authenticate(token) ay ganap na napanatili. Ang deobfuscation ay posible sa pamamagitan ng AST analysis, ngunit nangangailangan ng oras.

ProGuard at R8: obfuscation ng mga Android application

ProGuard — klasikong obfuscator para sa Java at Android, ginagamit mula 2002. Ang ProGuard ay gumaganap ng tatlong gawain: compression (shrinking — pag-alis ng hindi ginagamit na mga klase at method), optimization (optimization ng bytecode) at obfuscation (pagpapalit ng pangalan ng mga identifier). Ang ProGuard ay naka-embed sa Android Gradle Plugin sa pamamagitan ng file na proguard-rules.pro na may mga exception rule para sa mga library.

R8 — mas modernong obfuscator, isinama sa Android Gradle Plugin simula AGP 3.4. Ang R8 ay gumaganap ng parehong function tulad ng ProGuard, ngunit mas mabilis (isinulat mula sa simula sa Kotlin) at mas mahusay (mas mahusay na nag-o-optimize ng bytecode para sa ART Runtime). Ang configuration ng R8 ay ginagawa sa pamamagitan ng parehong proguard-rules.pro file tulad ng para sa ProGuard. Para i-activate ang R8, sapat na itakda ang minifyEnabled true sa build.gradle.

Mapping file at deobfuscation ng mga crash report

Mapping file — resulta ng trabaho ng R8/ProGuard, naglalaman ng korespondensya sa pagitan ng orihinal at obfuscated na pangalan ng mga klase, method at field. Ang mapping file ay kritikal para sa pagsusuri ng mga crash report: kung wala ito, ang stack trace ay maglalaman ng a.a.b sa halip na com.example.app.MainActivity.onCreate. Ang Firebase Crashlytics at Sentry ay awtomatikong naglo-load ng mga mapping file at ibinabalik ang orihinal na pangalan sa mga report.

Ang mga mapping file ay dapat i-upload sa Firebase o Sentry sa bawat pag-publish ng bagong bersyon ng application. Kung ang mapping file ay nawala o hindi na-upload, lahat ng crash report pagkatapos ng obfuscation ay magiging hindi nababasa. Ang Android Gradle Plugin ay awtomatikong nagse-save ng mapping file sa build/outputs/mapping/release/mapping.txt. Para sa Firebase ginagamit ang Crashlytics Gradle Plugin, na nag-u-upload ng mapping sa pagbuo ng release version.

Configuration ng ProGuard/R8 para sa Android

groovy
// app/build.gradle — obfuscation sa pamamagitan ng R8
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(
                "proguard-android-optimize.txt"),
                "proguard-rules.pro"
        }
    }
}
none
# proguard-rules.pro — mga panuntunan sa pagpapanatili
# Panatilihin ang data model para sa Gson
-keep class com.example.model.** { *; }

# Panatilihin ang mga klase para sa Retrofit interfaces
-keep,allowobfuscation interface com.example.api.*

# Huwag i-obfuscate ang pampublikong aktibidad
-keep class * extends android.app.Activity {
    public protected *;
}

# Alisin ang mga log sa produksyon
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(...);
    public static int v(...);
    public static int d(...);
}

Mga -keep rule sa proguard-rules.pro ay kritikal — kung wala ang mga ito, tatanggalin o papalitan ng R8 ang pangalan ng mga klase at method na ginagamit sa pamamagitan ng reflection (Gson, Retrofit, Room). Inaalis ng assumenosideeffects ang mga tawag sa Log.v at Log.d mula sa production code. Ang mga library tulad ng Gson, Retrofit at OkHttp ay nagbibigay ng mga ready-made rule sa proguard.txt sa loob ng AAR.

JavaScript obfuscation: Obfuscator.io at Jscrambler

Obfuscator.io — ang pinakasikat na open-source JavaScript obfuscator na may suporta para sa pagpapalit ng pangalan ng identifier, string encryption, control flow flattening at debug protection. Ang configuration ng obfuscation ay ginagawa sa pamamagitan ng JSON-config o CLI. Ang libreng bersyon ay sumusuporta sa mga basic method; ang Enterprise version ay nagdaragdag ng polymorphic code at self-defense.

Jscrambler — komersyal na JavaScript obfuscator na may pinalawak na proteksyon: polymorphic transformations (bawat execution ay bumubuo ng bagong obfuscated code), proteksyon laban sa debugger (detection ng DevTools), proteksyon laban sa screenshot (self-defending) at expiration mechanisms (humihinto ang code sa paggana pagkatapos ng tiyak na petsa). Ginagamit ang Jscrambler sa mga banking application at DRM system.

Configuration ng Obfuscator.io

js
// obfuscate.js — configuration ng 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);

Mga parameter Obfuscator.io: controlFlowFlattening: 0.75 ginugulo ang control flow sa 75% ng mga block; stringArray: true naglilipat ng mga string sa array; debugProtection pumipigil sa pagbukas ng DevTools; disableConsoleOutput nag-aalis ng console.log. Kung mas mataas ang mga threshold, mas mahaba ang oras ng obfuscation at laki ng code, ngunit mas mahirap ang pagsusuri.

Mga limitasyon at panganib ng obfuscation

Hindi pinoprotektahan ng obfuscation laban sa runtime analysis. Maaaring patakbuhin ng attacker ang application sa debugger (Frida, Objection, Xposed) at harangin ang mga method sa real-time. Pinoprotektahan ng obfuscation laban sa static analysis (decompilation ng APK, pagbabasa ng bytecode), ngunit hindi laban sa dynamic analysis. Para sa proteksyon laban sa runtime analysis, kinakailangan ang mga karagdagang hakbang: SSL Pinning, Root Detection, Integrity Verification.

Ang laki ng application pagkatapos ng obfuscation ay maaaring tumaas ng 20-50%. Ang control flow obfuscation ay nagdaragdag ng mga dead branch at nagdo-doble ng mga kondisyon — pinapataas nito ang dami ng bytecode. Ang string encryption ay pinapalitan ang maiikling string literals ng mga tawag sa decrypt(), na nagpapataas din ng laki. Para sa mga mobile application ito ay kritikal, dahil ang laki ng APK ay direktang nakakaapekto sa conversion sa Google Play.

Ang performance ay naaapektuhan din. Ang control flow obfuscation ay nagdaragdag ng mga karagdagang pagsusuri at pagsasanga, pinapataas ang oras ng execution ng mga method ng 5-15%. Ang string encryption ay nagdaragdag ng tawag sa decrypt sa bawat pag-access sa string. Para sa mga function na kritikal sa performance (onDraw sa Android, render sa React), ang obfuscation ay dapat i-disable sa pamamagitan ng -keep rule.

Mga Madalas Itanong

Ano ang pagkakaiba ng obfuscation at encryption ng code?

Encryption ay ginagawang hindi ma-execute ang code nang walang decryption — kailangan ng decryptor para sa execution. Obfuscation ay ginagawang hindi nababasa ang code ngunit direktang ma-execute. Ang encryption ay nagbibigay ng mas malakas na proteksyon, ngunit nangangailangan ng loader-decryptor na maaaring mismo ay masuri.

Maaari bang ma-deobfuscate ang code?

Deobfuscation ay posible, ngunit mahirap. Ang mga tool tulad ng jadx, JEB Decompiler at UnConfuser ay nagre-restore ng bytecode na may partial deobfuscation. Ang kumpletong pag-restore ng source code na may orihinal na pangalan ay imposible — ang mga pangalan ay nawawala nang permanente. Ang mga modernong obfuscator (R8, ProGuard) ay lumalaban sa automatic deobfuscation.

Kailangan ba ang obfuscation para sa pag-publish sa Google Play?

Google Play ay hindi nangangailangan ng obfuscation, ngunit mariing inirerekomenda ito sa pamamagitan ng minifyEnabled sa build.gradle. Ang mga application na walang obfuscation ay madaling ma-decompile sa pamamagitan ng APKTool at jadx, na ginagawa silang mahina sa pagnanakaw ng API key, modifikasyon at pandarambong. Karamihan sa malalaking application ay gumagamit ng R8 o ProGuard.

Paano naaapektuhan ng obfuscation ang mga crash report?

Ang mga crash report pagkatapos ng obfuscation ay naglalaman ng mga obfuscated na pangalan (a.b.c sa halip na com.example.app.MainActivity). Para sa pag-restore ginagamit ang mga mapping file na nabuo ng R8/ProGuard. Ang mapping file ay dapat i-upload sa Firebase Crashlytics o Sentry para sa automatic deobfuscation ng stack trace.

Ano ang String Encryption sa obfuscation?

String Encryption — pagpapalit ng string literals (API key, URL, mensahe) ng naka-encrypt na data na may tawag sa decrypt function sa runtime. Pinoprotektahan nito ang mga kumpidensyal na string mula sa pagbabasa sa pamamagitan ng simpleng paghahanap sa decompiled code. Ang R8/ProGuard ay sumusuporta sa string encryption sa pamamagitan ng -encryptstrings rule.

Buod

  • Obfuscator — tool para gawing mahirap basahin ang code habang pinapanatili ang functionality
  • R8 at ProGuard — karaniwang Android obfuscator, naka-embed sa Android Gradle Plugin
  • Identifier mangling pinapalitan ang pangalan ng klase at method ng maiikling hindi impormatibong identifier
  • Obfuscator.io — open-source JavaScript obfuscator na may control flow flattening at debug protection
  • Hindi pinoprotektahan ng obfuscation laban sa dynamic runtime analysis sa pamamagitan ng Frida at Objection
  • Mapping file ay kinakailangan para sa deobfuscation ng crash report at dapat i-upload sa Crashlytics

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din