apksigcopier - copy/extract/patch apk signatures & compare apks
apksigcopier is a tool for copying APK signatures from a signed APK
to an unsigned one (in order to verify reproducible builds). It can
also be used to compare two APKs with different signatures. Its
command-line tool offers four operations:
- copy signatures directly from a signed to an unsigned APK
- extract signatures from a signed APK to a directory
- patch previously extracted signatures onto an unsigned APK
- compare two APKs with different signatures
Extract
$ mkdir meta
$ apksigcopier extract signed.apk meta
$ ls -1 meta
8BEA2A77.RSA
8BEA2A77.SF
APKSigningBlock
APKSigningBlockOffset
MANIFEST.MF
Patch
$ apksigcopier patch meta unsigned.apk out.apk
Copy (Extract & Patch)
$ apksigcopier copy signed.apk unsigned.apk out.apk
Compare
This command requires apksigner.
$ apksigcopier compare foo-from-fdroid.apk foo-built-locally.apk
$ apksigcopier compare --unsigned foo.apk foo-unsigned.apk
Help
$ apksigcopier --help
$ apksigcopier copy --help # extract --help, patch --help, etc.
$ man apksigcopier # requires the man page to be installed
Environment Variables
The following environment variables can be set to 1, yes, or
true to override the default behaviour:
- set
APKSIGCOPIER_EXCLUDE_ALL_META=1to exclude all metadata files - set
APKSIGCOPIER_COPY_EXTRA_BYTES=1to copy extra bytes after data (e.g. a v2 sig)
Python API
>>> from apksigcopier import do_extract, do_patch, do_copy, do_compare
>>> do_extract(signed_apk, output_dir, v1_only=NO)
>>> do_patch(metadata_dir, unsigned_apk, output_apk, v1_only=NO)
>>> do_copy(signed_apk, unsigned_apk, output_apk, v1_only=NO)
>>> do_compare(first_apk, second_apk, unsigned=False)
You can use False, None, and True instead of NO, AUTO, and
YES respectively.
The following global variables (which default to False), can be set
to override the default behaviour:
- set
exclude_all_meta=Trueto exclude all metadata files - set
copy_extra_bytes=Trueto copy extra bytes after data (e.g. a v2 sig)
FAQ
What kind of signatures does apksigcopier support?
It currently supports v1 + v2 + v3 (which is a variant of v2).
It should also support v4, since these are stored in a separate file (and require a complementary v2/v3 signature).
When using the extract command, the v2/v3 signature is saved as
APKSigningBlock + APKSigningBlockOffset.
Tab Completion
For Bash, add this to ~/.bashrc:
eval "$(_APKSIGCOPIER_COMPLETE=source_bash apksigcopier)"
For Zsh, add this to ~/.zshrc:
eval "$(_APKSIGCOPIER_COMPLETE=source_zsh apksigcopier)"
For Fish, add this to ~/.config/fish/completions/apksigcopier.fish:
eval (env _APKSIGCOPIER_COMPLETE=source_fish apksigcopier)
Requirements
- Python >= 3.5 + click.
- The
comparecommand also requiresapksigner.
Debian/Ubuntu
$ apt install python3-click
$ apt install apksigner # only needed for the compare command
Installing
Debian
An official Debian package should be available soon. You can also
manually build one using the debian/sid branch, or download a
pre-built .deb via GitHub releases.
Using pip
$ pip install apksigcopier
NB: depending on your system you may need to use e.g. pip3 --user
instead of just pip.
From git
NB: this installs the latest development version, not the latest release.
$ git clone https://github.com/obfusk/apksigcopier.git
$ cd apksigcopier
$ pip install -e .
NB: you may need to add e.g. ~/.local/bin to your $PATH in order
to run apksigcopier.
To update to the latest development version:
$ cd apksigcopier
$ git pull --rebase
License
Metadata
Release files for apksigcopier 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| apksigcopier-1.0.0.tar.gz | 22.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| apksigcopier-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 45.3 kB
Release files / apksigcopier-1.0.0.tar.gz
| Download URL | apksigcopier-1.0.0.tar.gz |
|---|---|
| Size | 22.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0883034177f324f175daed95eced3c62160814497e9cff16d13066908c045059
|
|
BLAKE2b-256 checksum How to use checksums |
a94732f8385a28ae50e891f5e595e8557eab55f643a3660676ba51438212295f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.3.0 pkginfo/1.4.2 requests/2.25.1 setuptools/52.0.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.9.2
|
Release files / apksigcopier-1.0.0-py3-none-any.whl
| Download URL | apksigcopier-1.0.0-py3-none-any.whl |
|---|---|
| Size | 22.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
55adcaf0e81c1245cd7e6f0a576518fde5095931f660664252005939b54bc680
|
|
BLAKE2b-256 checksum How to use checksums |
41fad828b3843b5df5d85d1d7bb661d3528f8a9695cbfba135feca8a12fdecb2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.3.0 pkginfo/1.4.2 requests/2.25.1 setuptools/52.0.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.9.2
|