Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
278 changes: 278 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,81 @@ Output: test_json
00.129 I: [DECOMPILE] Decompiling to json ...
30.093 I: [DECOMPILE] Done
```
<details> <summary><code>more info</code></summary>

```ShellSession
Decodes android resources binary to readable json/xml/raw.
Usage:
d [Options, flags]
Options:
-framework Path of framework file (can be multiple).
-framework-version Preferred framework version number
-i Input path.
-load-dex Number of dex files to load at a time.
If the apk dex files count greater than this value,
then the decoder loads one dex at a time.
*Applies only when -dex-lib set to internal.
*Default = 3
*See<Notes> below.
-o Output path. Optional, if not provided then a new file
will be generated on same directory as input
-res-dir Sets resource files root dir name. e.g. for obfuscation
to move files from 'res/*' to 'r/*' or vice versa.
-sig Signatures directory path.
-t Decode types:
[xml, json, raw, sig]
-dex-lib Dex library to use:
1) internal : Use internal library, supports dex
versions up to 042.
2) jf : Use library by JesusFreke/smali, supports dex
versions 035 and below.
*Default = jf
**WARN: The default value will be replaced by
"internal" on coming versions.
*See <Notes> below.
[internal, jf]
Flags:
-dex Copy raw dex files / skip smali.
-dex-markers Dumps dex markers (applies only when smali mode).
-f Force delete output path.
-h | -help | --help Displays this help and exit.
-keep-res-path Keeps original res/* file paths:
*Applies only when decoding to xml
*All res/* files will be placed on dir <res-files>
*The relative paths will be linked to values/*xml
-no-dex-debug Drops all debug info from smali/dex.
-split-json Splits resources.arsc into multiple parts as per type
entries (use this for large files)
-vrd Validate resources dir name
(eg. if a drawable resource file path is 'res/abc.png'
then it will be moved to 'res/drawable/abc.png)'
Examples:
1) [Basic]
java -jar APKEditor.jar d -i path/input.apk
2) [Specify output]
java -jar APKEditor.jar d -i path/input.apk -o path/output.apk
3) [Specify decode type]
java -jar APKEditor.jar d -t xml -i path/input.apk
4) [Specify framework file(s)]
java -jar APKEditor.jar d -i path/input.apk -framework framework-res.apk
-framework platforms/android-32/android.jar
5) [Decode apk signature block]
java -jar APKEditor.jar d -t sig -i path/input.apk -sig path/signatures_dir
Notes:
1) [internal] Dex builder:
* Fully supports dex files up to 042.
* Highest dex file compression.
* Builds with similar dex-section order as r8/dx.
* Convenient dex markers editing, see file smali/classes/dex-file.json
* Additional helpful smali comments: e.g class/method hierarchy.
* Supports whitespaces on class simple name as introduced on dex 041+
2) [-load-dex] To print correct class/method hierarchy, it is necessary to
load all dex files at once. This may result high memory consumption and
could fail with "OutOfMemoryError" thus you are required to limit the
number of dex files to load at a time. You can overcome this problem with
-Xmx memory arg e.g java -Xmx8g -jar APKEditor.jar ...
```
</details>
</details>

#### 2- Build
Expand All @@ -62,6 +136,63 @@ Output: test_edited.apk
27.101 I: [BUILD] Saved to: test_edited.apk
30.217 I: [BUILD] Done
```
<details> <summary><code>more info</code></summary>

```ShellSession
Builds android binary from json/xml/raw.
Options:
-framework Path of framework file (can be multiple).
-framework-version Preferred framework version number
-i Input path.
-o Output path. Optional, if not provided then a new file
will be generated on same directory as input
-res-dir Sets resource files root dir name. e.g. for obfuscation
to move files from 'res/*' to 'r/*' or vice versa.
-sig Signatures directory path.
-t Build types, By default build types determined by quick
scanning of input directory files. Values are:
[xml, json, raw, sig]
-extractNativeLibs Sets extractNativeLibs attribute on manifest and
applies compression of library files (*.so).
*Default = manifest
1) manifest: read and apply from manifest.
2) none: remove attribute from manifest and store
libraries compressed.
3) true: set manifest attribute 'true' and store
libraries compressed.
4) false: set manifest attribute 'false' and store
libraries un-compressed with 4096 alignment.
[manifest, none, false, true]
-dex-lib Dex library to use:
1) internal : Use internal library, supports dex
versions up to 042.
2) jf : Use library by JesusFreke/smali, supports dex
versions 035 and below.
*Default = jf
**WARN: The default value will be replaced by
"internal" on coming versions.
*See <Notes> below.
[internal, jf]
Flags:
-f Force delete output path.
-h | -help | --help Displays this help and exit.
-no-cache Ignore built cached .dex files and re-build smali files.
-vrd Validate resources dir name
(eg. if a drawable resource file path is 'res/abc.png'
then it will be moved to 'res/drawable/abc.png)'
Examples:
1) [Basic]
java -jar APKEditor.jar b -i path/input_directory
2) [Specify output]
java -jar APKEditor.jar b -i path/input_directory -o path/output.apk
3) [Restore signatures]
java -jar APKEditor.jar b -t sig -i path/input.apk -sig
path/signatures_dir
4) [Specify framework]
java -jar APKEditor.jar b -i path/input_directory -framework
framework-res.apk -framework platforms/android-32/android.jar
```
</details>
</details>

#### 3- Merge
Expand Down Expand Up @@ -99,6 +230,42 @@ $ java -jar APKEditor.jar m -i apk_files
```
![apkmerger](/.github/apkmerger.png)

<details> <summary><code>more info</code></summary>

```ShellSession
Merges split apk files from directory or compressed apk files like XAPK,
APKM, APKS ...
Options:
-i Input path.
-o Output path. Optional, if not provided then a new file
will be generated on same directory as input
-res-dir Sets resource files root dir name. e.g. for obfuscation
to move files from 'res/*' to 'r/*' or vice versa.
-extractNativeLibs Sets extractNativeLibs attribute on manifest and
applies compression of library files (*.so).
*Default = manifest
1) manifest: read and apply from manifest.
2) none: remove attribute from manifest and store
libraries compressed.
3) true: set manifest attribute 'true' and store
libraries compressed.
4) false: set manifest attribute 'false' and store
libraries un-compressed with 4096 alignment.
[manifest, none, false, true]
Flags:
-clean-meta Cleans META-INF directory along with signature block.
-f Force delete output path.
-h | -help | --help Displays this help and exit.
-validate-modules Validates for same versionNumber of base.apk with split
apk files.
-vrd Validate resources dir name
(eg. if a drawable resource file path is 'res/abc.png'
then it will be moved to 'res/drawable/abc.png)'
Examples:
1) [Basic]
java -jar APKEditor.jar m -i path/input -o path/output.apk
```
</details>
</details>

#### 4- Refactor
Expand All @@ -120,7 +287,27 @@ $ java -jar APKEditor.jar x -i input.apk
03.504 I: [REFACTOR] Done

```
<details> <summary><code>more info</code></summary>

```ShellSession
Refactors obfuscated resource names
Options:
-i Input path.
-o Output path. Optional, if not provided then a new file
will be generated on same directory as input
-public-xml Path of resource ids xml file (public.xml)
Loads names and applies to resources from 'public.xml'
file
Flags:
-clean-meta Cleans META-INF directory along with signature block.
-f Force delete output path.
-fix-types Corrects resource type names based on usages and values
-h | -help | --help Displays this help and exit.
Examples:
1) [Basic]
java -jar APKEditor.jar x -i path/input.apk -o path/output.apk
```
</details>
</details>

#### 5- Protect
Expand All @@ -142,7 +329,34 @@ Protects apk resources against almost all known decompile/modify tools.
02.451 I: [PROTECT] Done

```
<details> <summary><code>more info</code></summary>

```ShellSession
Protects/Obfuscates apk resource files. Using unique obfuscation techniques.
Options:
-i Input path.
-keep-type Keep specific resource type names (e.g drawable), By
default keeps only <font> resource type.
*Can be multiple
-o Output path. Optional, if not provided then a new file
will be generated on same directory as input
Flags:
-confuse-zip Confuse zip structure. When this turned on:
* Apps might crash if accessing apk files directly e.g
Class.getResourceAsStream().
* Some apk scanners might flag it as "Malformed zip"
-dic-dir-names Path to a text file containing a list of directory
names separated by new line.
-dic-file-names Path to a text file containing a list of file names
separated by new line.
-f Force delete output path.
-h | -help | --help Displays this help and exit.
-skip-manifest Do not protect manifest.
Examples:
1) [Basic]
java -jar APKEditor.jar p -i path/input.apk -o path/output.apk
```
</details>
</details>

#### 6- Info (⭐NEW⭐)
Expand All @@ -164,7 +378,71 @@ Package name=com.mypackage id=0x7f
() #006400

```
<details> <summary><code>more info</code></summary>

```ShellSession
Prints information of apk.
Options:
-filter-type Prints only the specified resource type names
*This applies only when flag '-resources' used.
*Can be multiple.
-framework Path of framework file (can be multiple).
-framework-version Preferred framework version number
-i Input path.
-o Output path. Optional, if not provided then a new file
will be generated on same directory as input
-res Prints resource entries specified by either of:
1) Hex or decimal resource id.
2) Full resource name e.g @string/app_name.
*Can be multiple.
-xmlstrings Print the strings of the given compiled xml assets.
*Can be multiple
-xmltree Prints the compiled xmls in the given assets.
*Can be multiple
-t Print types/formats:
[text, json, xml]
Flags:
-activities Prints main activity class name. If verbose mode,
prints all declared activities including
<activity-alias>.
-app-class Application class name.
-app-icon App icon path/value. If verbose mode, prints all
configurations.
-app-name App name. If verbose mode, prints all configurations.
-app-round-icon App round icon path/value. If verbose mode, prints all
configurations.
-configurations Print the configurations in the APK.
-dex Prints dex information.
-f Force delete output path.
-h | -help | --help Displays this help and exit.
-languages Print the languages in the APK.
-list-files List files inside apk.
-list-xml-files List compiled xml files inside apk.
-locales Print the locales in the APK.
-min-sdk-version Minimum SDK version.
-package Package name(application id) from manifest and if
verbose mode, prints resource table packages.
-permissions Permissions.
-resources Prints all resources
-signatures Prints signature information.
-signatures-base64 Prints signature information with base64 certificates.
-strings Print the contents of the resource table string pool in
the APK.
-target-sdk-version Target SDK version.
-v Verbose mode.
-version-code App version code.
-version-name App version name.
Examples:
1) [Basic]
java -jar APKEditor.jar info -i file.apk
2) [Specify output and type]
java -jar APKEditor.jar info -i path/input.apk -t json -v -o
info_file.json
3) [Print only specific type]
java -jar APKEditor.jar info -i path/input.apk -resources -filter-type
drawable
```
</details>
</details>


Expand Down