# bagbak dumps decrypted IPAs, and its author deprecated it

> bagbak is a Node CLI that drives Frida against a jailbroken iOS device to dump decrypted app binaries, including extensions, as IPA archives. The README recommends two different tools built on mremap_encrypted instead, because running the target app is limited by the SDK and by RASP, which makes this a project to read as a reference rather than to adopt.

**ChiChou/bagbak** — [deprecated] Yet another frida based iOS dumpdecrypted. Also decrypts app extensions

- Repository: https://github.com/ChiChou/bagbak
- Stars: 1,511 · Forks: 219
- Language: TypeScript
- License: MIT
- Published: 2026-10-16 · Updated: 2026-10-16 · Language: en
- Canonical page: https://hysenlabs.com/projects/chichou-bagbak

## Why the README tells you not to use it

The most important section of this README is the deprecation notice, and it is more useful than the feature list.

The stated reason is mechanical rather than ethical: the decryption approach requires running the target app, which is limited by the target SDK and by RASP, among other things. In other words, the technique is fragile. An app that refuses to launch under instrumentation, or that protects its own code at runtime, will not produce a dump. That is a technical ceiling, not a policy one.

The recommended alternatives share a different approach. The `mremap_encrypted` approach does not require running the app at all, and the README lists three projects built on it: UnFairPlay, which with some tweaking also works on jailbroken iOS, unfaird, and macOSAppstoreDecrypter.

So the useful way to read this repository in 2026 is as a reference implementation of a technique that has been superseded. The command surface, the dump modes and the agent layout are still readable, and the deprecation tells you which direction the technique moved.

One more line is worth recording because it is refreshingly honest: the README explains the project name has no meaning and was typed while listening to a song.

## Requirements: jailbreak plus a matching Frida

bagbak requires a jailbroken iOS device and Frida, and the version pairing is called out explicitly: bagbak@5 requires frida@17, and if your frida-server is v16 you should install `npm install -g bagbak@4` instead.

That single sentence removes most of the support friction people hit. Frida's major version has to line up between the desktop tool and the server running on the device, and the tool takes the version boundary as an install-time decision rather than something you debug later.

On the device side you need the Frida tooling for iOS. On the desktop side, Node.js and a global install:

```bash
npm install -g bagbak
```

package.json sets `engines.node` to `>=20.0.0` and the package is ESM only, with `type` set to `module`. The build uses tsdown, the published entry point is `dist/index.mjs`, and the executable is `dist/bin/bagbak.mjs`.

It was tested on iOS 15 with Dopamine and iOS 16 with palera1n, which identifies the working configurations the author documented.

The package is published with `publishConfig` provenance enabled. That is a supply-chain property worth having on a tool that injects into other processes.

## Dump modes and the device connection options

Usage is a bundle identifier or an app name, followed by an optional dump mode as the second argument.

The modes are `all` by default, producing a full IPA with all binaries decrypted; `main`, aliased `app`, for the main binary only; `extensions`, aliased `ext` and `exts`, for extension binaries only; and `binaries`, aliased `bin` and `executables`, which decrypts everything and outputs a zip instead of an IPA.

The extension support is the reason to look at this project at all if your interest is security research. Extensions are separate binaries with their own entitlements, embedded in an app bundle and easy to overlook when analysing a single target.

Connection flags cover the usual Frida cases: `-U` for USB, which is the default, `-R` for a remote frida-server, `-D <uuid>` for a specific device, and `-H <host>` for a named host.

The rest of the option list includes `-l` to list installed apps, `-j` to emit that list as JSON, which the README notes only works with `--list`, `-d` for debug output, and `-o <output>` for the IPA filename or directory. There is also `--remove-keys <keys>`, which takes comma-separated Info.plist keys to strip from the dumped bundle.

That last flag shows the tool's practical use clearly. Dumping with a device whitelist still in Info.plist produces an app that will not install on a different device, so removing `UISupportedDevices` is what makes the output usable elsewhere. The README's own example does exactly that:

```bash
bagbak --remove-keys UISupportedDevices com.google.chrome.ios
```

## What is actually in the package

The repository layout shows a two-part design: a Node CLI on the desktop and an agent that runs inside the target process on the device.

At the root there is `index.ts`, `lib/` and `bin/` for the CLI, and an `agent/` directory whose built output is shipped as part of the package. The `files` array in package.json lists exactly three things: the built CLI under `/dist`, `agent/dist/app.js` and `agent/dist/springboard.js`.

The presence of a SpringBoard agent is the detail that explains the technique. Dumping requires enumerating running processes on the device, and SpringBoard is where that view comes from, which is why a SpringBoard script is part of the published artifact.

Dependencies are few and specific: `frida` for the instrumentation bridge, `frida-remote-stream` for streaming over a remote server, `commander` for the CLI, and `chalk` for output. There is no XML parser, no zip library and no crypto in the dependency list, which is interesting given the job description, and suggests the archive assembly and container handling lean on what the platform provides.

There is also a Chinese README at `README.zh-CN.md`, and both `bun.lock` and `package-lock.json` at the root.

On testing, package.json is blunt: the test script is `echo 'Not supported'`. For a tool that injects into arbitrary processes across iOS versions, there is no automated coverage, so confidence comes from the author's manual matrix of devices rather than from a suite.

## Conclusion

Adopt bagbak only if you are doing reverse engineering on apps installed on your own jailbroken device and already run Frida 17, since the tool requires both a jailbroken device and a matching frida-server. Do not start new work on it, because the author's own README calls the approach no longer recommended and points to UnFairPlay and unfaird. Verify first that your frida-server major version matches, since bagbak@5 needs frida@17 and version 4 is the fallback, and note that test coverage is declared as unsupported in package.json.

## FAQ

### Which Frida version does bagbak need?

bagbak@5 requires frida@17. The README says that if your frida-server is v16 you should install `npm install -g bagbak@4` instead, because the two versions have to match.

### Why is bagbak deprecated?

Because its approach requires running the target app, which is limited by the target SDK and by RASP. The README recommends alternatives built on the mremap_encrypted approach, which does not need the app to run, naming UnFairPlay, unfaird and macOSAppstoreDecrypter.

### How do I dump only the app extensions from an iOS app?

Pass the `extensions` dump mode, aliased as `ext` or `exts`, as the second argument, for example `bagbak com.example.app extensions`. The `binaries` mode aliased as `bin` or `executables` decrypts everything and outputs a zip instead of an IPA.

### What does the --remove-keys flag do in bagbak?

It takes comma-separated Info.plist keys to remove from the dumped bundle. The README's example removes UISupportedDevices, which is the device restriction that otherwise stops a dump from installing elsewhere.

## Sources

- [ChiChou/bagbak on GitHub](https://github.com/ChiChou/bagbak)
- [Issues](https://github.com/ChiChou/bagbak/issues)
- [License: MIT](https://github.com/ChiChou/bagbak/blob/main/LICENSE)
- [README](https://github.com/ChiChou/bagbak/blob/main/README.md)
- [Releases](https://github.com/ChiChou/bagbak/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/chichou-bagbak
