Application security feature

Binary protection

How to evaluate binary protection for mobile apps: which compiled code needs hardening, who enforces what, and how Otukan resists disassembly and patching.

  • Android
  • iOS
  • Flutter
  • React Native
Patched executables is met at the hardened binary boundary before it reaches the appPatched executablesHardened binaryYour app
  • Hard to disassemble

    Native libraries, executables and framework bytecode are transformed so disassemblers produce output that is slow to follow and costly to map.

  • Patches do not stick

    Integrity checks woven through the compiled code notice when an instruction is changed, so flipping a check or unlocking a feature fails.

  • Your server decides

    Tamper signals reach your backend, which keeps authority over entitlements, limits and payments whatever happens to the binary.

Binary attacks Otukan handles

Pick an attack to see how Otukan detects it, how the app responds and what your backend receives.

Instruction patching

  1. Detect

    Integrity checks woven into the compiled code compare protected regions with the release you built.

  2. Respond

    A patched region triggers the response you set, from a recorded signal to stopping the app.

  3. Report

    A code-integrity signal travels with the next request to your backend.

Unlocked paid features

  1. Detect

    Licence and entitlement checks are hardened and duplicated, so a single patched branch no longer opens the feature.

  2. Respond

    The app defers to your server's answer about what the user has paid for.

  3. Report

    Your backend sees the mismatch between the app's claim and its own records.

Debugger-assisted analysis

  1. Detect

    Otukan detects a debugger or tracer attached to the running release build.

  2. Respond

    Critical routines are withheld or the session ends, so the analyst cannot step through them quietly.

  3. Report

    A debugging signal reaches your backend with the session it came from.

Dumped and re-signed iOS apps

  1. Detect

    Otukan checks the running executable's signing identity against your release, which a dumped and redistributed copy no longer carries.

  2. Respond

    The copy is stopped before sensitive code runs, and its code is still hardened because the obfuscation is part of the code itself.

  3. Report

    An integrity signal tells your backend the request comes from a re-signed app.

Injected libraries

  1. Detect

    Otukan detects foreign code loaded into the app's process to replace or wrap compiled routines.

  2. Respond

    Sensitive flows are restricted or the session ends, per your policy.

  3. Report

    An injection signal travels with the request for your risk decision.

Binary hardening in Otukan

Each control targets a different step an analyst takes, from opening the binary to changing it.

  • Native code obfuscation

    Restructures compiled functions in native libraries and executables so their logic is hard to reconstruct.

  • Symbol and metadata stripping

    Removes names, debug data and export details that turn a disassembly into a map of your app.

  • Anti-disassembly measures

    Adds constructs that mislead automated analysis tools and slow manual reading of the code.

  • Code integrity checks

    Places checks throughout the binary that notice patched instructions and changed code regions at runtime.

  • Anti-tampering

    Confirms the app package, its resources and its signing identity match your release.

  • Code injection prevention

    Detects foreign code loaded into the app's process to change its behaviour from the inside.

You choose the response

Set a response for each user flow. Start by observing, then tighten flow by flow as the signals prove themselves.

Observe

Signal sent to your backend

Rolling out a new policy and measuring real-world signals.

Warn

This device looks modified. Continue with care.

Conditions some genuine users create, such as developer settings.

Restrict

Payments are unavailable on this device.

Payments, stored data and account changes.

Terminate

Session closed for your security.

Clear tampering on a high-risk flow.

How it works

  1. Rank the code

    Identify the libraries and routines whose logic or checks attackers would most like to read or change.

  2. Choose hardening

    Pick obfuscation and integrity levels per module, heavier on critical code and lighter on hot paths.

  3. Build protected

    Protection runs in your existing build and release pipeline, and your signing keys remain yours.

  4. Test and ship

    Run your QA suite and a patch attempt on the protected build before store submission.

Free for app publishers

Check your app's exposure

A passive review of your published app by an Otukan engineer. No files, no access to your systems. Findings go by email to the verified publisher.

You finish the request on the next page.

Evaluate binary protection by naming the compiled code an attacker would open first and the change they would most like to make, then checking two things: how long it takes to understand that code, and whether the app notices when it is altered. Otukan hardens native libraries, executables and framework bytecode on Android and iOS, including Flutter and React Native apps, so disassembly is slow and patched instructions trigger the response you set. Hardening raises the cost of analysis and makes changes visible to your backend. It does not replace server-side authority over money, entitlements and access.

The threat and the buyer task

Binary attacks are quiet. They happen on the attacker’s own machine, against a copy of your app downloaded from Google Play or the App Store, and they never touch your servers until the modified app starts sending requests.

Flows at risk

Mobile flowWhat sits in compiled codeTypical attack
Paid features and subscriptionsEntitlement checks, feature flagsPatch the branch that says “not paid”
Game economy and scoringScore validation, anti-cheat logicChange limits, rates or checks
Security controlsRoot, jailbreak and integrity checksRemove the check before release to others
Proprietary algorithmsSignal processing, fare calculation, matchingLift the routine for a rival product
Request signingCode that assembles and signs requestsRecreate it outside the app

Where the trust boundary sits

The boundary is the compiled binary itself. Android apps ship DEX bytecode, which decompiles readily, and native libraries, which disassemble. iOS apps ship a Mach-O executable that Apple encrypts for distribution, but that encryption is removed when the app is dumped from a jailbroken device, leaving ordinary machine code. Flutter compiles Dart ahead of time into a native library, and React Native ships a JavaScript bundle, compiled to bytecode when the app uses the Hermes engine. Each form needs hardening of its own. How these layers combine against decompilers and live probing is covered on mobile app reverse engineering protection.

Control fit

Binary protection works best when the app, the operating system and your backend each do the job they are placed to do.

LayerResponsibilityWhat it cannot do
Operating systemEnforces code signing on install and launch; on iOS, refuses unsigned code on devices that are not jailbrokenProtect against a re-signed copy on a modified device, or against reading the code
The app, hardened by OtukanObfuscates compiled code, strips names, checks code integrity at runtime and applies your responseStop an attacker with unlimited time from studying a copy offline
Your backendHolds authority over entitlements, limits and payments; acts on integrity signalsSee what happens inside the app without those signals

On Android, Play App Signing means Google signs the release your users install with the app signing key it holds. Otukan’s integrity data expects that signature, so legitimate store builds pass while re-signed copies do not. Neighbouring package-level checks are covered on mobile app anti-tampering.

Why integrity and obfuscation belong together

Obfuscation alone buys time until the routine is understood. Integrity checks alone can be found and removed if the surrounding code is readable. Otukan interleaves the two, so the checks are hidden by the obfuscation and the obfuscated code is guarded by the checks.

Evaluation

A credible evaluation of binary protection covers three areas: platform scope, evidence of resistance and effect on your users.

Platforms and code forms

Confirm scope separately for native Android code, Android bytecode, iOS executables, Flutter compiled code and React Native bundles. Scope on one platform says nothing about the other, so ask for each one by name.

Evidence of resistance

Ask for a before-and-after disassembly of a sample library and a patch attempt on a protected build. In an authorised lab, the patch should trigger the integrity signal and your chosen response. On a legitimate device, the unmodified build should run with no signal. After each protected release, repeat install, update, sign-in and the entitlement or payment flow, recording OS versions, devices, outcomes and reviewer.

User impact

Hardening changes the compiled code, so measure size, start-up and the responsiveness of hot paths with your own app. Otukan lets you set hardening per module, which keeps performance-sensitive code light and critical code heavy. Check that crash reports stay readable through the mapping files. How to turn industry index findings into a code and binary protection test of your own app is covered on turning index findings into tests.

For the wider set of package and runtime controls, return to code and data protection.

Common questions

  • How is binary protection different from code obfuscation?

    Obfuscation makes code hard to understand. Binary protection adds a second goal: making the compiled output hard to change without the app noticing. Otukan combines the two, so an analyst who eventually understands a routine still faces integrity checks when they try to patch it, and your backend hears about the attempt.

  • Will hardened native code slow down our hot paths?

    Hardening is set per module, so you can apply heavy protection to licence checks, key handling and security logic while keeping rendering loops and media code light. We measure start-up and responsiveness with your team on devices you choose before the protected release ships, so you decide with figures from your own app.

  • Can we still read crash reports from a hardened build?

    Yes. Otukan produces a mapping file for each protected build, so stack traces can be turned back into readable function names by your team. Keep the mapping files private, because they describe exactly what the hardening hides.

  • If the binary is hardened, can we trust what the app tells our server?

    Treat the app's statements as evidence, not as authority. Hardening makes patching slow and noisy, and the integrity signal tells your server when something changed. Decisions with money or access attached, such as entitlements, limits and payments, should still be confirmed on your backend.

On the mobile engineering team?

How protection fits your build, signing and release, platform by platform.

Make patching your app slow and loud

Tell us the platform, the framework and the compiled code you most need to harden, such as native libraries, licence checks or security logic. We never request binaries, signing keys or production credentials.

Or request a technical demo