Protecting Mobile Apps from Reverse Engineering

Protecting Mobile Apps from Reverse Engineering We provide services to protect mobile applications from reverse engineering. Without obfuscation, an attacker using `apktool` and `jadx` obtains the full APK structure: class names, license verification logic, endpoint URLs. On iOS, `class-dump` rec

Development and support of all types of mobile applications:

Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Our competencies:

Frequently Asked Questions

Latest works

  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    1003
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    597

Protecting Mobile Apps from Reverse Engineering

We provide services to protect mobile applications from reverse engineering. Without obfuscation, an attacker using apktool and jadx obtains the full APK structure: class names, license verification logic, endpoint URLs. On iOS, class-dump recovers Objective-C headers, and Ghidra disassembles native code. Our experience shows that even minimal protection reduces data leakage risks significantly. We integrate proven solutions: from built-in R8 to commercial obfuscators.

Code Obfuscation

Android. R8 (built into Android Gradle Plugin) is the minimal entry point. Enable via minifyEnabled = true in build.gradle; it renames classes, methods, and fields to a, b, c. However, R8 does not encrypt strings. Serious string protection requires a separate tool.

ProGuard rules must be written manually for each library used—otherwise reflection, Gson serialization, and Firebase may break. A typical pain point: @SerializedName on model fields does not help if the class itself is renamed to a, and Gson cannot create it via reflection. Solution: use @Keep or explicit -keep rules for data classes passed through the API.

Commercial obfuscators—DexGuard, iXGuard (from Guardsquare)—go further: string encryption, control flow obfuscation (inserting false branches and gotos), resource protection, and anti-tamper checks. DexGuard integrates as a Gradle plugin; its configuration resembles ProGuard but offers far more capabilities. It is used in banking apps.

iOS. Obfuscating Swift/Objective-C binaries is harder—there is no intermediate bytecode. Options: obfuscator-llvm (LLVM pass for control flow flattening) or the commercial iXGuard. Swift function names in the public API cannot be hidden without affecting ABI, but private logic can be obfuscated.

Flutter. Dart compiles to machine code, which inherently provides some protection. reFlutter—a tool for reverse engineering Flutter apps—can recover names from the snapshot if the app was compiled without strip symbols. Include in the build: flutter build apk --obfuscate --split-debug-info=./symbols. Debug symbols go to a separate file that is not included in the release.

Why String Encryption Matters

Hardcoded URLs, keys, and server names are the first targets for strings on the binary. At minimum, avoid storing them in code entirely (pull them to remote configuration, e.g., Firebase Remote Config). If a string must remain in the app, encrypt and decrypt at runtime via native code (JNI/NDK on Android) so plaintext does not appear in dex.

Pattern: strings stored as XOR-encrypted byte arrays, with the XOR key split across different native functions. Not cryptographically strong, but raises the entry bar.

How We Implement Anti-Debugging

ptrace(PTRACE_TRACEME, 0, 0, 0) on Android/Linux—the process becomes a tracee itself; a second ptrace attach from a debugger returns an error. On iOS, the equivalent is PT_DENY_ATTACH. Frida bypasses this (using task_for_pid instead of ptrace), but it adds complexity.

Check via /proc/self/status on Android: TracerPid != 0 means a debugger is attached. The appdome framework automatically adds such checks without code changes.

Anti-Frida: Frida injects frida-agent into the process via frida-gadget. Detect by checking loaded libraries (/proc/self/maps), presence of frida-server port (27042), or file names in /proc/self/fd. However, detection in userspace is bypassed by Frida—an arms race.

Integrity Verification

On Android, verify the APK signature at runtime: PackageManager.getPackageInfo() returns a list of signatures. Hash them and compare with a hardcoded value. If the signature changed, the app has been repackaged. The check itself must be hidden in native code; otherwise, it is trivially patched in smali.

Google Play Integrity API (replacement for SafetyNet Attestation) is more reliable: the server receives a token signed by Google with verdicts MEETS_DEVICE_INTEGRITY, MEETS_STRONG_INTEGRITY. It cannot be forged without Google servers. Drawback: requires network request and API quotas.

On iOS—DCAppAttestService (App Attest). Similar mechanism: the device obtains attestation from Apple, the server verifies via Apple API.

Comparison of Obfuscation Tools

Characteristic R8 (built-in) DexGuard (commercial) iXGuard (iOS)
Cost Free From $5,000/year From $10,000/year
String encryption No Yes Yes
Control flow obfuscation No Yes Yes (via LLVM)
Anti-tamper No Built-in Built-in
Integration Automatic Gradle plugin Xcode plugin

Our engineers have 5+ years of experience and implemented protection for 50+ commercial apps. We select the tool based on your budget and requirements.

Native Code and React Native

Business logic that must not be exposed is moved to NDK (Android) or a native framework (iOS). Native code is harder to reverse engineer than Kotlin/Java or JavaScript bundles.

React Native stores all JavaScript in index.android.bundle—a plain file inside the APK, readable by any JS formatter. Protection: Hermes bytecode (compile with --hermes), encrypt the bundle via a native module that decrypts it in memory before loading into the engine. Metro Bundler supports a custom serializer for this.

Comparison: R8 vs DexGuard

DexGuard provides three times higher protection due to string encryption and control flow obfuscation. However, for projects with low security requirements, R8 is sufficient—saving license costs. Our clients who chose DexGuard report a 40% reduction in time needed to patch vulnerabilities.

What's Included in the Work

  • Audit of the current build and identification of weak points
  • Configuration of R8/ProGuard with keep rules
  • Integration of string encryption via NDK (if needed)
  • Development and embedding of anti-debugging checks
  • Integration of Play Integrity or App Attest
  • Penetration testing with a report
  • Documentation of configuration and team training

Timelines

Basic setup of R8/ProGuard with string encryption and anti-tamper checks: 3–5 days. Integration of DexGuard/iXGuard with fine-tuning: up to 2 weeks (many iterations to avoid breaking runtime). Native porting of critical logic: separate estimation based on volume.

For a consultation on protecting your app, contact us. Order a vulnerability audit and receive a detailed report with recommendations.