This work is the combined effort of dozens of modders globally.
In this video, I show you how to bypass Google Play license protection (CHECK_LICENSE) in any Android app using Termux and without removing or breaking original libraries (.so files).
Download now removepairip-Nov-29-2025.zip (9.55 MB)
sbupload.com
Note:
PairIP has two (2) methods of checking for tampering, the primary and secondary.
The second one only triggers if the primary is unable to connect to Google, which typically means offline/firewall/airplane mode.
If you are familiar with RegEx, locating and removing that second code is simple and quick.
Mods will then work offline too.
They will also work online still, only without Google tracking silently.
Note 2:
In addition to the PairIP removal tools, in the video two additional tools, MT Manager and Ads RegEx+ are used to mod the demo app. Those two tools are not required to bypass PairIP.
They are helpful in signing the bypassed apk, removing the secondary security, and much more.
Finally managed to get Dazzly v8 to work using this method.
A note of warning, for some reason yet unknown to me, none of the mods I've done using this method work on my main modding device. I can bypass protection well enough, but the mod locks up loading the injected libpairipx.so
If I send the mod over to another device and test it, it works fine.
With over 14 million different devices running Android OS's from 1-16, it's truly a miracle anything works from device to device. Throw in some modded code and you never know. It can be very frustrating for modders when a game/app mod works perfectly for them but nobody else, or it works for...
A simple, cross-platform tool for bypassing Google's PairIP protection in Flutter applications. The super generic description of Flutter is that it compiles an apk as a Split apks.
@Sbenny
I want to thank you for dropping this beast into my lap.
It has been an exercise in patience.
This game was thought to have PairIP protection and easily bypassed using this new tool. As it turns out, it has an uber variant of PairIP called, Google加固, which is a Chinese modified PairIP having even more protection.
The python script failed to work on this game, and the addition of dozens of kill codes for root and emulation detection didn't help.
Add to that, Jiagu 360 security with anti-hook protection is included.
As I work better with BASH, I began making an improved script.
The test game is in apkm format.
NOTE: Generally PairIP is found in split apk's and has almost become a demand by Google to release on PlayStore.
Because I'm already using 26GB of storage in Termux, I did the work on the Android side where I have 2TB.
Using an Explorer, go to the Download folder. This is the default bridged folder in Termux.
Make a sub folder called removepairip
Copy the files to that new folder.
Now you can go to Termux.
If you haven't done so already, termux-setup-storage
cd /sdcard/Download/removepairip
====================
This portion isn't needed and requires that you have ApkID installed.
I use it to verify security measures used.
To verify, use RKPairIP Remover as it can better tell different types of PairIP.
Note that Micro$oft has removed all of RKPairIP repositories from GitHub.
You can still get it from this forum.
Typically you would now use, python ./patch1.py
It has the advantage of being faster.
On this game, that patch failed.
The newer BASH script takes much longer but has several advantages.
Better decompile and recompile.
ARSC detection.
Self-signing.
( If you chose to do this from within Termux, you will need to chmod +x patch.sh )
( If you have an apkm file, rename it to apks.
This is not a guaranteed approach as apkm are special split apk's released mainly by Netflix 7+ version and every Disney+ version on Apkmirror. APKM's often have multiple protections. )
( If you have an xapk, you will need to unzip it, locate the main apk having the package name, rename it to base.apk, re-zip the files, rename the .zip to .apks
You don't need to zipalign or sign the archive.
Move the apks to the removepairip folder. )
### Bash Version requirements:
- Bash shell (available by default on Linux/macOS, requires installation on Windows)
- Java Runtime Environment (JRE) 8 or higher
- Common UNIX tools: `unzip`, `zip`, `basename`, `dirname`, `realpath`
- `APKEditor-1.4.5.jar` (included in release)
- `uber-apk-signer.jar` (included in release)
After successful patching, you'll find a file named `[original-name]-patched.apk` in the same directory. This is your patched APK with PairIP protection removed.
bash ./patch2.sh filename.apks
Code:
=====================================================================================================================================
PairIP Protection Remover
Bash Edition v1.2
=====================================================================================================================================
By Snailsoft and Void.
▶ Checking dependencies
[✓] Java detected
[✓] All required bash commands are available
[✓] All required JAR files found
[i] Processing file: story.apks
Picked up _JAVA_OPTIONS: -Xmx2g
00.001 I: [MERGE] Using: APKEditor version 1.4.5, ARSCLib version 1.3.8
-extractNativeLibs = true
-i = story.apks
-o = merged_app.apk
_______________________________________
00.163 I: [MERGE] Extracting to: tmp_56595b30
05.911 I: [MERGE] Searching apk files ...
06.294 I: [MERGE] Found apk files: 35
11.259 I: [MERGE] Found modules: 35
12.003 I: [MERGE] Merging: base
12.008 I: [MERGE] Added [base] classes.dex -> classes.dex
12.009 I: [MERGE] Added [base] classes2.dex -> classes2.dex
12.010 I: [MERGE] Added [base] classes3.dex -> classes3.dex
12.011 I: [MERGE] Added [base] classes4.dex -> classes4.dex
12.012 I: [MERGE] Added [base] classes5.dex -> classes5.dex
14.705 I: [MERGE] Merging: split_config.sv
14.890 I: [MERGE] Merging: split_config.ko
15.018 I: [MERGE] Merging: split_config.in
15.158 I: [MERGE] Merging: split_config.arm64_v8a
15.166 I: [MERGE] Merging: split_config.ms
15.313 I: [MERGE] Merging: split_config.vi
15.467 I: [MERGE] Merging: split_config.th
15.624 I: [MERGE] Merging: split_config.ar
15.780 I: [MERGE] Merging: split_config.ja
15.953 I: [MERGE] Merging: split_config.xxhdpi
16.126 I: [MERGE] Merging: split_config.xxxhdpi
16.222 I: [MERGE] Merging: split_config.it
16.329 I: [MERGE] Merging: split_config.en
16.474 I: [MERGE] Merging: split_config.et
16.594 I: [MERGE] Merging: split_config.mdpi
16.703 I: [MERGE] Merging: split_config.es
16.835 I: [MERGE] Merging: split_config.zh
17.051 I: [MERGE] Merging: split_config.fi
17.168 I: [MERGE] Merging: split_config.ru
17.282 I: [MERGE] Merging: split_config.pt
17.420 I: [MERGE] Merging: split_config.de
17.546 I: [MERGE] Merging: split_config.hi
17.665 I: [MERGE] Merging: split_config.pl
17.787 I: [MERGE] Merging: split_InstallTimePack
17.816 I: [MERGE] Added as fused module <InstallTimePack>
17.816 I: [MERGE] Merging: split_config.nl
17.946 I: [MERGE] Merging: split_config.tr
18.074 I: [MERGE] Merging: split_config.ldpi
18.375 I: [MERGE] Merging: split_config.tvdpi
18.503 I: [MERGE] Merging: split_config.xhdpi
18.628 I: [MERGE] Merging: split_config.uk
18.765 I: [MERGE] Merging: split_config.fr
18.917 I: [MERGE] Merging: split_config.hdpi
19.015 I: [MERGE] Merging: split_config.armeabi_v7a
19.093 I: [MERGE] Merging: split_config.hu
19.375 I: [MERGE] Sanitizing manifest ...
19.393 I: [MERGE] Removed-attribute : @0x0101064e
19.396 I: [MERGE] Removed-attribute : @0x0101064f
19.404 I: [MERGE] Removed-element : <meta-data> name="com.android.vending.splits.required"
19.406 I: [MERGE] Removed-element : <meta-data> name="com.android.stamp.source"
19.408 I: [MERGE] Removed-element : <meta-data> name="com.android.stamp.type"
19.429 I: [MERGE] Removed-table-entry : res/xml/splits0.xml
19.434 I: [MERGE] Removed-element : <meta-data> name="com.android.vending.splits"
19.435 I: [MERGE] Removed-element : <meta-data> name="com.android.vending.derived.apk.id"
19.727 I: [MERGE] Applying: extractNativeLibs=true
19.727 I: [MERGE] Writing apk ...
19.943 I: [MERGE] Buffering compress changed files ...
26.228 I: [MERGE] Writing files: 1454
31.357 I: [MERGE] Writing signature block ...
32.976 I: [MERGE] Saved to: merged_app.apk
Picked up _JAVA_OPTIONS: -Xmx2g
00.000 I: [DECOMPILE] Using: APKEditor version 1.4.5, ARSCLib version 1.3.8
-t = xml
-load-dex = 3
-dex-lib = internal
-comment-level = detail
-i = merged_app.apk
-o = merged_app_decompile_xml
_____________________________________________
00.147 I: [DECOMPILE] Loading ...
01.025 I: [DECOMPILE] Decompiling to xml ...
02.278 I: [DECOMPILE] Initializing android framework ...
02.280 I: [DECOMPILE] Loading android framework for version: 36
02.875 I: [DECOMPILE] Initialized framework: android-36 (16)
02.979 I: [DECOMPILE] [SANITIZE]: Sanitizing paths ...
03.023 I: [DECOMPILE] Validating resource names ...
03.182 I: [DECOMPILE] All resource names are valid
03.184 I: [DECOMPILE] Decode: archive-info.json
03.300 I: [DECOMPILE] Decode: uncompressed-files.json
03.526 I: [DECOMPILE] Decoding: AndroidManifest.xml
04.050 I: [DECOMPILE] public.xml: com.firsttouchgames.story -> package_1
04.255 I: [DECOMPILE] Res files: resources
01:15.063 I: [DECOMPILE] Ignore non bin xml: res/raw/firebase_common_keep.xml
01:15.065 I: [DECOMPILE] Ignore non bin xml: res/raw/firebase_crashlytics_keep.xml
01:27.360 I: [DECOMPILE] Baksmali: classes.dex
11:29 I: [DECOMPILE] Baksmali: classes2.dex
12:01 I: [DECOMPILE] Baksmali: classes3.dex
21:57 I: [DECOMPILE] Baksmali: classes4.dex
30:21 I: [DECOMPILE] Baksmali: classes5.dex
32:36 I: [DECOMPILE] Extracting root files ...
32:59 I: [DECOMPILE] Dumping signatures ...
33:00 I: [DECOMPILE] Saved to: merged_app_decompile_xml
./patch.sh: line 476: [: -gt: unary operator expected
tail: invalid number of lines: ‘+11:.end’
Picked up _JAVA_OPTIONS: -Xmx2g
(APK exceeds 100MB and more RAM is required for JAVA)
00.000 I: [BUILD] Using: APKEditor version 1.4.5, ARSCLib version 1.3.8
-t = xml
-dex-lib = internal
-i = merged_app_decompile_xml
-o = out.apk
_______________________________________
00.187 I: [BUILD] Scanning XML directory ...
00.555 I: [BUILD] Scanning: merged_app_decompile_xml
02.039 I: [BUILD] Initializing android framework ...
02.041 I: [BUILD] Loading android framework for version: 36
03.095 I: [BUILD] Initialized framework: android-36 (16)
03.097 I: [BUILD] Set main package id from manifest: @mipmap/ic_launcher
03.125 I: [BUILD] Main package id initialized: id = 0x7f, from: @mipmap/ic_launcher
03.126 I: [BUILD] Encoding attrs ...
04.083 I: [BUILD] Encoding values ...
09.284 I: [BUILD] Scan: package_1/res
10.078 I: [BUILD] Scanned 1183 files: package_1/res
10.579 I: [BUILD] Add manifest: AndroidManifest.xml
10.581 I: [BUILD] Building dex ...
13.342 I: [BUILD] (1/5) Smali<INTERNAL>: classes.dex
03:20.307 I: [BUILD] (2/5) Cached: classes2.dex
03:22.773 I: [BUILD] (3/5) Cached: classes3.dex
03:27.761 I: [BUILD] (4/5) Cached: classes4.dex
03:29.421 I: [BUILD] (5/5) Cached: classes5.dex
03:29.429 I: [BUILD] Scanning root directory ...
03:29.662 I: [BUILD] Restoring original file paths ...
03:29.759 I: [BUILD] Loading signatures ...
03:29.828 I: [BUILD] Sorting files ...
03:29.905 I: [BUILD] Refreshing resource table ...
03:30.075 I: [BUILD] TableBlock: packages = 1, size = 599464 bytes
03:30.077 I: [BUILD] Applying: extractNativeLibs=true
03:30.078 I: [BUILD] Writing apk...
03:30.223 I: [BUILD] Buffering compress changed files ...
04:23.606 I: [BUILD] Writing files: 1458
04:39.838 I: [BUILD] Writing signature block ...
04:39.907 I: [BUILD] Saved to: out.apk
Picked up _JAVA_OPTIONS: -Xmx2g
▶ Finalizing...
[✓] Removed 4 leftover files/directories
realpath: ''$'\n\033''[1;36m▶ Step 1/10: Extracting base.apk'$'\033''[0m'$'\n\033''[0;36mPatching process'$'\033''[0m: 10%|████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| 1/10'$'\r\n\033''[1;36m▶ Step 2/10: Creating libFirebaseCppApp.so'$'\033''[0m'$'\n\033''[0;32m[✓]'$'\033''[0m Created libFirebaseCppApp.so from base.apk'$'\n\033''[0;36mPatching process'$'\033''[0m: 20%|████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| 2/10'$'\r\n\033''[1;36m▶ Step 3/10: Cleaning previous files'$'\033''[0m'$'\n\033''[0;32m[✓]'$'\033''[0m Removed 0 old files/directories'$'\n\033''[0;36mPatching process'$'\033''[0m: 30%|████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░| 3/10'$'\r\n\033''[1;36m▶ Step 4/10: Merging APKS to APK'$'\033''[0m'$'\n\033''[0;32m[✓]'$'\033''[0m Successfully merged to APK (Size: 176 MB)'$'\n\033''[0;36mPatching process'$'\033''[0m: 40%|████████████████░░░░░░░░░░░░░░░░░░░░░░░░| 4/10'$'\r\n\033''[1;36m▶ Step 5/10: Preparing decompilation'$'\033''[0m'$'\n\033''[0;36mPatching process'$'\033''[0m: 50%|████████████████████░░░░░░░░░░░░░░░░░░░░| 5/10'$'\r\n\033''[1;36m▶ Step 6/10: Decompiling merged APK'$'\033''[0m'$'\n\033''[0;34m[i]'$'\033''[0m This may take several minutes depending on APK size...'$'\n\033''[0;32m[✓]'$'\033''[0m Decompilation completed in 1982 seconds'$'\n\033''[0;36mPatching process'$'\033''[0m: 60%|████████████████████████░░░░░░░░░░░░░░░░| 6/10'$'\r\n\033''[1;36m▶ Step 7/10: Modifying AndroidManifest.xml'$'\033''[0m'$'\n\033''[1;33m[!]'$'\033''[0m No license check entries found in manifest'$'\n\033''[0;36mPatching process'$'\033''[0m: 70%|████████████████████████████░░░░░░░░░░░░| 7/10'$'\r\n\033''[1;36m▶ Step 8/10: Patching decompiled files'$'\033''[0m'$'\n\n\033''[1;36m▶ Applying patches to decompiled files'$'\033''[0m'$'\n\033''[0;36m ➤ Patching protection code...'$'\033''[0m'$'\n\033''[0;32m[✓]'$'\033''[0m Patched VMRunner.smali'$'\n\033''[1;33m[!]'$'\033''[0m VMRunner.smali not found or not patched'$'\n\033''[0;32m[✓]'$'\033''[0m Patched SignatureCheck.smali'$'\n\033''[1;33m[!]'$'\033''[0m SignatureCheck.smali not found or not patched'$'\n\033''[0;36m ➤ Copying native libraries...'$'\033''[0m'$'\n\033''[0;32m[✓]'$'\033''[0m Copied libpairipcorex.so to arm64-v8a architecture'$'\n\033''[0;32m[✓]'$'\033''[0m Copied libFirebaseCppApp.so to arm64-v8a architecture'$'\n\033''[0;32m[✓]'$'\033''[0m Copied libpairipcorex.so to armeabi-v7a architecture'$'\n\033''[0;32m[✓]'$'\033''[0m Copied libFirebaseCppApp.so to armeabi-v7a architecture'$'\n\033''[1;33m[!]'$'\033''[0m No library directories found containing libpairipcore.so'$'\n\033''[0;36m ➤ Patching file paths configuration...'$'\033''[0m'$'\n\033''[1;33m[!]'$'\033''[0m No matching <external-path> entries found'$'\n\033''[0;36mPatching process'$'\033''[0m: 80%|████████████████████████████████░░░░░░░░| 8/10'$'\r\n\033''[1;36m▶ Step 9/10: Building modified APK'$'\033''[0m'$'\n\033''[0;34m[i]'$'\033''[0m Building APK from modified files...'$'\n\033''[0;32m[✓]'$'\033''[0m Build completed in 282 seconds (Size: 159 MB)'$'\n\033''[0;36mPatching process'$'\033''[0m: 90%|████████████████████████████████████░░░░| 9/10'$'\r\n\033''[1;36m▶ Step 10/10: Signing the APK'$'\033''[0m'$'\n''source:'$'\n\t''/storage/emulated/0/Download/removepairip'$'\n''zipalign location: PATH '$'\n\t''/data/data/com.termux/files/usr/bin/zipalign'$'\n''keystore:'$'\n\t''[0] 161a0018 /data/data/com.termux/files/usr/tmp/temp_12626573556050001554_debug.keystore (DEBUG_EMBEDDED)'$'\n\n''01. out.apk'$'\n\n\t''SIGN'$'\n\t''file: /storage/emulated/0/Download/removepairip/out.apk (211.35 MiB)'$'\n\t''checksum: 4ecbe39851eb2c194c8cc3bcd29f6ed9fc4d32cb1c2f0bb69378bd74af517f76 (sha256)'$'\n\t''- zipalign success'$'\n\t''- sign success'$'\n\n\t''VERIFY'$'\n\t''file: /storage/emulated/0/Download/removepairip/out.apk (211.35 MiB)'$'\n\t''checksum: cf6e83a91730da0a25249f1603959e1b60676d76afdf3f955756aadfc2958860 (sha256)'$'\n\t''- zipalign verified'$'\n\t''- signature verified [v1, v2, v3] '$'\n\t\t''99 warnings'$'\n\t\t''Subject: CN=Android Debug, OU=Android, O=US, L=US, ST=US, C=US'$'\n\t\t''SHA256: 1e08a903aef9c3a721510b64ec764d01d3d094eb954161b62544ea8f187b5953 / SHA256withRSA'$'\n\t\t''Expires: Thu Mar 10 20:10:05 GMT 2044'$'\n\n''[Sat Nov 29 00:27:46 GMT 2025][v1.2.1]'$'\n''Successfully processed 1 APKs and 0 errors in 30.44 seconds.'$'\n\033''[1;33m[!]'$'\033''[0m Signing failed. Using unsigned APK as: story-patched.apk'$'\n\033''[0;36mPatching process'$'\033''[0m: 100%|████████████████████████████████████████| 10/10'$'\r\n\033''[0;36m ➤ Cleaning up temporary files...'$'\033''[0m'$'\n\033''[0;32m[✓]'$'\033''[0m Removed 0 temporary files/directories'$'\n''story-patched.apk': No such file or directory
du: invalid zero-length file name
╔══════════════════════════════════════════════╗
║ PROCESS COMPLETE ║
╚══════════════════════════════════════════════╝
✓ Final APK:
▶ Step 1/10: Extracting base.apk
Patching process: 10%|████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| 1/10
▶ Step 2/10: Creating libFirebaseCppApp.so
[✓] Created libFirebaseCppApp.so from base.apk
Patching process: 20%|████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| 2/10
▶ Step 3/10: Cleaning previous files
[✓] Removed 0 old files/directories
Patching process: 30%|████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░| 3/10
▶ Step 4/10: Merging APKS to APK
[✓] Successfully merged to APK (Size: 176 MB)
Patching process: 40%|████████████████░░░░░░░░░░░░░░░░░░░░░░░░| 4/10
▶ Step 5/10: Preparing decompilation
Patching process: 50%|████████████████████░░░░░░░░░░░░░░░░░░░░| 5/10
▶ Step 6/10: Decompiling merged APK
[i] This may take several minutes depending on APK size...
[✓] Decompilation completed in 1982 seconds
Patching process: 60%|████████████████████████░░░░░░░░░░░░░░░░| 6/10
▶ Step 7/10: Modifying AndroidManifest.xml
[!] No license check entries found in manifest
(This is often an indication that PairIP has addition safeguards.)
Patching process: 70%|████████████████████████████░░░░░░░░░░░░| 7/10
▶ Step 8/10: Patching decompiled files
▶ Applying patches to decompiled files
➤ Patching protection code...
[✓] Patched VMRunner.smali
[!] VMRunner.smali not found or not patched
[✓] Patched SignatureCheck.smali
[!] SignatureCheck.smali not found or not patched
➤ Copying native libraries...
[✓] Copied libpairipcorex.so to arm64-v8a architecture
[✓] Copied libFirebaseCppApp.so to arm64-v8a architecture
[✓] Copied libpairipcorex.so to armeabi-v7a architecture
[✓] Copied libFirebaseCppApp.so to armeabi-v7a architecture
[!] No library directories found containing libpairipcore.so
➤ Patching file paths configuration...
[!] No matching <external-path> entries found
Patching process: 80%|████████████████████████████████░░░░░░░░| 8/10
▶ Step 9/10: Building modified APK
[i] Building APK from modified files...
[✓] Build completed in 282 seconds (Size: 159 MB)
Patching process: 90%|████████████████████████████████████░░░░| 9/10
▶ Step 10/10: Signing the APK
source:
/storage/emulated/0/Download/removepairip
zipalign location: PATH
/data/data/com.termux/files/usr/bin/zipalign
keystore:
[0] 161a0018 /data/data/com.termux/files/usr/tmp/temp_12626573556050001554_debug.keystore (DEBUG_EMBEDDED)
01. out.apk
SIGN
file: /storage/emulated/0/Download/removepairip/out.apk (211.35 MiB)
checksum: 4ecbe39851eb2c194c8cc3bcd29f6ed9fc4d32cb1c2f0bb69378bd74af517f76 (sha256)
- zipalign success
- sign success
VERIFY
file: /storage/emulated/0/Download/removepairip/out.apk (211.35 MiB)
checksum: cf6e83a91730da0a25249f1603959e1b60676d76afdf3f955756aadfc2958860 (sha256)
- zipalign verified
- signature verified [v1, v2, v3]
99 warnings
Subject: CN=Android Debug, OU=Android, O=US, L=US, ST=US, C=US
SHA256: 1e08a903aef9c3a721510b64ec764d01d3d094eb954161b62544ea8f187b5953 / SHA256withRSA
Expires: Thu Mar 10 20:10:05 GMT 2044
[Sat Nov 29 00:27:46 GMT 2025][v1.2.1]
Successfully processed 1 APKs and 0 errors in 30.44 seconds.
[!] Signing failed. Using unsigned APK as: story-patched.apk
Patching process: 100%|████████████████████████████████████████| 10/10
➤ Cleaning up temporary files...
[✓] Removed 0 temporary files/directories
story-patched.apk
✓ Size: MB
✓ Location:
✓ Total processing time: 2374 seconds
🌎u0_a314@localhost ✅ ⌚Fri 28 7:52PM 🚥JOBS 0 📁/sdcard/Download/removepairip
% 👉
At this point you will typically have an APK that can now be modded further, whether it's removing ad's or adding coins.
If however the game starts up and instantly crashes or gives a black screen, then it is likely that more protection exists, as with this game.
Remember, this tool doesn't remove the protection, it bypasses it.
Tool's like RKPairIP remove the protection, however, like this tool, it cannot deal with additional protections. Too, removing security code is tricky and can break the app.
There is no simple solution at this time.
One suggestion is to try and find an apks version of the apkm and repeat the process.
I was able to locate an xapk v8 only version, rename the files and try again.
Unfortunately, it too had the same protections.
I dusted off an older python script that requires a lot more manual work.
I have named it patch3.py and it should be the last attempt.
It works better on PairIP versions prior to 2025.
That too failed.
For the moment, this particular game is not reversible.
Although this proved a failure in reverse engineering of this particular game, it has provided code improvements and an answer for when this process fails to work.
I have updated the first post with the new tool set.
I will continue to work on a method to bypass/remove this protection.
A simple, cross-platform tool for bypassing Google's PairIP protection in Flutter applications. The super generic description of Flutter is that it compiles an apk as a Split apks.
@Sbenny
I want to thank you for dropping this beast into my lap.
It has been an exercise in patience.
This game was thought to have PairIP protection and easily bypassed using this new tool. As it turns out, it has an uber variant of PairIP called, Google加固, which is a Chinese modified PairIP having even more protection.
The python script failed to work on this game, and the addition of dozens of kill codes for root and emulation detection didn't help.
Add to that, Jiagu 360 security with anti-hook protection is included.
As I work better with BASH, I began making an improved script.
The test game is in apkm format.
NOTE: Generally PairIP is found in split apk's and has almost become a demand by Google to release on PlayStore.
Because I'm already using 26GB of storage in Termux, I did the work on the Android side where I have 2TB.
Using an Explorer, go to the Download folder. This is the default bridged folder in Termux.
Make a sub folder called removepairip
Copy the files to that new folder. View attachment 105707
Now you can go to Termux.
If you haven't done so already, termux-setup-storage
cd /sdcard/Download/removepairip
====================
This portion isn't needed and requires that you have ApkID installed.
I use it to verify security measures used.
To verify, use RKPairIP Remover as it can better tell different types of PairIP.
Note that Micro$oft has removed all of RKPairIP repositories from GitHub.
You can still get it from this forum.
Typically you would now use, python ./patch1.py
It has the advantage of being faster.
On this game, that patch failed.
The newer BASH script takes much longer but has several advantages.
Better decompile and recompile.
ARSC detection.
Self-signing.
( If you chose to do this from within Termux, you will need to chmod +x patch.sh )
( If you have an apkm file, rename it to apks.
This is not a guaranteed approach as apkm are special split apk's released mainly by Netflix 7+ version and every Disney+ version on Apkmirror. APKM's often have multiple protections. )
( If you have an xapk, you will need to unzip it, locate the main apk having the package name, rename it to base.apk, re-zip the files, rename the .zip to .apks
You don't need to zipalign or sign the archive.
Move the apks to the removepairip folder. )
### Bash Version requirements:
- Bash shell (available by default on Linux/macOS, requires installation on Windows)
- Java Runtime Environment (JRE) 8 or higher
- Common UNIX tools: `unzip`, `zip`, `basename`, `dirname`, `realpath`
- `APKEditor-1.4.5.jar` (included in release)
- `uber-apk-signer.jar` (included in release)
After successful patching, you'll find a file named `[original-name]-patched.apk` in the same directory. This is your patched APK with PairIP protection removed.
bash ./patch2.sh filename.apks
Code:
=====================================================================================================================================
PairIP Protection Remover
Bash Edition v1.2
=====================================================================================================================================
By Snailsoft and Void.
▶ Checking dependencies
[✓] Java detected
[✓] All required bash commands are available
[✓] All required JAR files found
[i] Processing file: story.apks
Picked up _JAVA_OPTIONS: -Xmx2g
00.001 I: [MERGE] Using: APKEditor version 1.4.5, ARSCLib version 1.3.8
-extractNativeLibs = true
-i = story.apks
-o = merged_app.apk
_______________________________________
00.163 I: [MERGE] Extracting to: tmp_56595b30
05.911 I: [MERGE] Searching apk files ...
06.294 I: [MERGE] Found apk files: 35
11.259 I: [MERGE] Found modules: 35
12.003 I: [MERGE] Merging: base
12.008 I: [MERGE] Added [base] classes.dex -> classes.dex
12.009 I: [MERGE] Added [base] classes2.dex -> classes2.dex
12.010 I: [MERGE] Added [base] classes3.dex -> classes3.dex
12.011 I: [MERGE] Added [base] classes4.dex -> classes4.dex
12.012 I: [MERGE] Added [base] classes5.dex -> classes5.dex
14.705 I: [MERGE] Merging: split_config.sv
14.890 I: [MERGE] Merging: split_config.ko
15.018 I: [MERGE] Merging: split_config.in
15.158 I: [MERGE] Merging: split_config.arm64_v8a
15.166 I: [MERGE] Merging: split_config.ms
15.313 I: [MERGE] Merging: split_config.vi
15.467 I: [MERGE] Merging: split_config.th
15.624 I: [MERGE] Merging: split_config.ar
15.780 I: [MERGE] Merging: split_config.ja
15.953 I: [MERGE] Merging: split_config.xxhdpi
16.126 I: [MERGE] Merging: split_config.xxxhdpi
16.222 I: [MERGE] Merging: split_config.it
16.329 I: [MERGE] Merging: split_config.en
16.474 I: [MERGE] Merging: split_config.et
16.594 I: [MERGE] Merging: split_config.mdpi
16.703 I: [MERGE] Merging: split_config.es
16.835 I: [MERGE] Merging: split_config.zh
17.051 I: [MERGE] Merging: split_config.fi
17.168 I: [MERGE] Merging: split_config.ru
17.282 I: [MERGE] Merging: split_config.pt
17.420 I: [MERGE] Merging: split_config.de
17.546 I: [MERGE] Merging: split_config.hi
17.665 I: [MERGE] Merging: split_config.pl
17.787 I: [MERGE] Merging: split_InstallTimePack
17.816 I: [MERGE] Added as fused module <InstallTimePack>
17.816 I: [MERGE] Merging: split_config.nl
17.946 I: [MERGE] Merging: split_config.tr
18.074 I: [MERGE] Merging: split_config.ldpi
18.375 I: [MERGE] Merging: split_config.tvdpi
18.503 I: [MERGE] Merging: split_config.xhdpi
18.628 I: [MERGE] Merging: split_config.uk
18.765 I: [MERGE] Merging: split_config.fr
18.917 I: [MERGE] Merging: split_config.hdpi
19.015 I: [MERGE] Merging: split_config.armeabi_v7a
19.093 I: [MERGE] Merging: split_config.hu
19.375 I: [MERGE] Sanitizing manifest ...
19.393 I: [MERGE] Removed-attribute : @0x0101064e
19.396 I: [MERGE] Removed-attribute : @0x0101064f
19.404 I: [MERGE] Removed-element : <meta-data> name="com.android.vending.splits.required"
19.406 I: [MERGE] Removed-element : <meta-data> name="com.android.stamp.source"
19.408 I: [MERGE] Removed-element : <meta-data> name="com.android.stamp.type"
19.429 I: [MERGE] Removed-table-entry : res/xml/splits0.xml
19.434 I: [MERGE] Removed-element : <meta-data> name="com.android.vending.splits"
19.435 I: [MERGE] Removed-element : <meta-data> name="com.android.vending.derived.apk.id"
19.727 I: [MERGE] Applying: extractNativeLibs=true
19.727 I: [MERGE] Writing apk ...
19.943 I: [MERGE] Buffering compress changed files ...
26.228 I: [MERGE] Writing files: 1454
31.357 I: [MERGE] Writing signature block ...
32.976 I: [MERGE] Saved to: merged_app.apk
Picked up _JAVA_OPTIONS: -Xmx2g
00.000 I: [DECOMPILE] Using: APKEditor version 1.4.5, ARSCLib version 1.3.8
-t = xml
-load-dex = 3
-dex-lib = internal
-comment-level = detail
-i = merged_app.apk
-o = merged_app_decompile_xml
_____________________________________________
00.147 I: [DECOMPILE] Loading ...
01.025 I: [DECOMPILE] Decompiling to xml ...
02.278 I: [DECOMPILE] Initializing android framework ...
02.280 I: [DECOMPILE] Loading android framework for version: 36
02.875 I: [DECOMPILE] Initialized framework: android-36 (16)
02.979 I: [DECOMPILE] [SANITIZE]: Sanitizing paths ...
03.023 I: [DECOMPILE] Validating resource names ...
03.182 I: [DECOMPILE] All resource names are valid
03.184 I: [DECOMPILE] Decode: archive-info.json
03.300 I: [DECOMPILE] Decode: uncompressed-files.json
03.526 I: [DECOMPILE] Decoding: AndroidManifest.xml
04.050 I: [DECOMPILE] public.xml: com.firsttouchgames.story -> package_1
04.255 I: [DECOMPILE] Res files: resources
01:15.063 I: [DECOMPILE] Ignore non bin xml: res/raw/firebase_common_keep.xml
01:15.065 I: [DECOMPILE] Ignore non bin xml: res/raw/firebase_crashlytics_keep.xml
01:27.360 I: [DECOMPILE] Baksmali: classes.dex
11:29 I: [DECOMPILE] Baksmali: classes2.dex
12:01 I: [DECOMPILE] Baksmali: classes3.dex
21:57 I: [DECOMPILE] Baksmali: classes4.dex
30:21 I: [DECOMPILE] Baksmali: classes5.dex
32:36 I: [DECOMPILE] Extracting root files ...
32:59 I: [DECOMPILE] Dumping signatures ...
33:00 I: [DECOMPILE] Saved to: merged_app_decompile_xml
./patch.sh: line 476: [: -gt: unary operator expected
tail: invalid number of lines: ‘+11:.end’
Picked up _JAVA_OPTIONS: -Xmx2g
(APK exceeds 100MB and more RAM is required for JAVA)
00.000 I: [BUILD] Using: APKEditor version 1.4.5, ARSCLib version 1.3.8
-t = xml
-dex-lib = internal
-i = merged_app_decompile_xml
-o = out.apk
_______________________________________
00.187 I: [BUILD] Scanning XML directory ...
00.555 I: [BUILD] Scanning: merged_app_decompile_xml
02.039 I: [BUILD] Initializing android framework ...
02.041 I: [BUILD] Loading android framework for version: 36
03.095 I: [BUILD] Initialized framework: android-36 (16)
03.097 I: [BUILD] Set main package id from manifest: @mipmap/ic_launcher
03.125 I: [BUILD] Main package id initialized: id = 0x7f, from: @mipmap/ic_launcher
03.126 I: [BUILD] Encoding attrs ...
04.083 I: [BUILD] Encoding values ...
09.284 I: [BUILD] Scan: package_1/res
10.078 I: [BUILD] Scanned 1183 files: package_1/res
10.579 I: [BUILD] Add manifest: AndroidManifest.xml
10.581 I: [BUILD] Building dex ...
13.342 I: [BUILD] (1/5) Smali<INTERNAL>: classes.dex
03:20.307 I: [BUILD] (2/5) Cached: classes2.dex
03:22.773 I: [BUILD] (3/5) Cached: classes3.dex
03:27.761 I: [BUILD] (4/5) Cached: classes4.dex
03:29.421 I: [BUILD] (5/5) Cached: classes5.dex
03:29.429 I: [BUILD] Scanning root directory ...
03:29.662 I: [BUILD] Restoring original file paths ...
03:29.759 I: [BUILD] Loading signatures ...
03:29.828 I: [BUILD] Sorting files ...
03:29.905 I: [BUILD] Refreshing resource table ...
03:30.075 I: [BUILD] TableBlock: packages = 1, size = 599464 bytes
03:30.077 I: [BUILD] Applying: extractNativeLibs=true
03:30.078 I: [BUILD] Writing apk...
03:30.223 I: [BUILD] Buffering compress changed files ...
04:23.606 I: [BUILD] Writing files: 1458
04:39.838 I: [BUILD] Writing signature block ...
04:39.907 I: [BUILD] Saved to: out.apk
Picked up _JAVA_OPTIONS: -Xmx2g
▶ Finalizing...
[✓] Removed 4 leftover files/directories
realpath: ''$'\n\033''[1;36m▶ Step 1/10: Extracting base.apk'$'\033''[0m'$'\n\033''[0;36mPatching process'$'\033''[0m: 10%|████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| 1/10'$'\r\n\033''[1;36m▶ Step 2/10: Creating libFirebaseCppApp.so'$'\033''[0m'$'\n\033''[0;32m[✓]'$'\033''[0m Created libFirebaseCppApp.so from base.apk'$'\n\033''[0;36mPatching process'$'\033''[0m: 20%|████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| 2/10'$'\r\n\033''[1;36m▶ Step 3/10: Cleaning previous files'$'\033''[0m'$'\n\033''[0;32m[✓]'$'\033''[0m Removed 0 old files/directories'$'\n\033''[0;36mPatching process'$'\033''[0m: 30%|████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░| 3/10'$'\r\n\033''[1;36m▶ Step 4/10: Merging APKS to APK'$'\033''[0m'$'\n\033''[0;32m[✓]'$'\033''[0m Successfully merged to APK (Size: 176 MB)'$'\n\033''[0;36mPatching process'$'\033''[0m: 40%|████████████████░░░░░░░░░░░░░░░░░░░░░░░░| 4/10'$'\r\n\033''[1;36m▶ Step 5/10: Preparing decompilation'$'\033''[0m'$'\n\033''[0;36mPatching process'$'\033''[0m: 50%|████████████████████░░░░░░░░░░░░░░░░░░░░| 5/10'$'\r\n\033''[1;36m▶ Step 6/10: Decompiling merged APK'$'\033''[0m'$'\n\033''[0;34m[i]'$'\033''[0m This may take several minutes depending on APK size...'$'\n\033''[0;32m[✓]'$'\033''[0m Decompilation completed in 1982 seconds'$'\n\033''[0;36mPatching process'$'\033''[0m: 60%|████████████████████████░░░░░░░░░░░░░░░░| 6/10'$'\r\n\033''[1;36m▶ Step 7/10: Modifying AndroidManifest.xml'$'\033''[0m'$'\n\033''[1;33m[!]'$'\033''[0m No license check entries found in manifest'$'\n\033''[0;36mPatching process'$'\033''[0m: 70%|████████████████████████████░░░░░░░░░░░░| 7/10'$'\r\n\033''[1;36m▶ Step 8/10: Patching decompiled files'$'\033''[0m'$'\n\n\033''[1;36m▶ Applying patches to decompiled files'$'\033''[0m'$'\n\033''[0;36m ➤ Patching protection code...'$'\033''[0m'$'\n\033''[0;32m[✓]'$'\033''[0m Patched VMRunner.smali'$'\n\033''[1;33m[!]'$'\033''[0m VMRunner.smali not found or not patched'$'\n\033''[0;32m[✓]'$'\033''[0m Patched SignatureCheck.smali'$'\n\033''[1;33m[!]'$'\033''[0m SignatureCheck.smali not found or not patched'$'\n\033''[0;36m ➤ Copying native libraries...'$'\033''[0m'$'\n\033''[0;32m[✓]'$'\033''[0m Copied libpairipcorex.so to arm64-v8a architecture'$'\n\033''[0;32m[✓]'$'\033''[0m Copied libFirebaseCppApp.so to arm64-v8a architecture'$'\n\033''[0;32m[✓]'$'\033''[0m Copied libpairipcorex.so to armeabi-v7a architecture'$'\n\033''[0;32m[✓]'$'\033''[0m Copied libFirebaseCppApp.so to armeabi-v7a architecture'$'\n\033''[1;33m[!]'$'\033''[0m No library directories found containing libpairipcore.so'$'\n\033''[0;36m ➤ Patching file paths configuration...'$'\033''[0m'$'\n\033''[1;33m[!]'$'\033''[0m No matching <external-path> entries found'$'\n\033''[0;36mPatching process'$'\033''[0m: 80%|████████████████████████████████░░░░░░░░| 8/10'$'\r\n\033''[1;36m▶ Step 9/10: Building modified APK'$'\033''[0m'$'\n\033''[0;34m[i]'$'\033''[0m Building APK from modified files...'$'\n\033''[0;32m[✓]'$'\033''[0m Build completed in 282 seconds (Size: 159 MB)'$'\n\033''[0;36mPatching process'$'\033''[0m: 90%|████████████████████████████████████░░░░| 9/10'$'\r\n\033''[1;36m▶ Step 10/10: Signing the APK'$'\033''[0m'$'\n''source:'$'\n\t''/storage/emulated/0/Download/removepairip'$'\n''zipalign location: PATH '$'\n\t''/data/data/com.termux/files/usr/bin/zipalign'$'\n''keystore:'$'\n\t''[0] 161a0018 /data/data/com.termux/files/usr/tmp/temp_12626573556050001554_debug.keystore (DEBUG_EMBEDDED)'$'\n\n''01. out.apk'$'\n\n\t''SIGN'$'\n\t''file: /storage/emulated/0/Download/removepairip/out.apk (211.35 MiB)'$'\n\t''checksum: 4ecbe39851eb2c194c8cc3bcd29f6ed9fc4d32cb1c2f0bb69378bd74af517f76 (sha256)'$'\n\t''- zipalign success'$'\n\t''- sign success'$'\n\n\t''VERIFY'$'\n\t''file: /storage/emulated/0/Download/removepairip/out.apk (211.35 MiB)'$'\n\t''checksum: cf6e83a91730da0a25249f1603959e1b60676d76afdf3f955756aadfc2958860 (sha256)'$'\n\t''- zipalign verified'$'\n\t''- signature verified [v1, v2, v3] '$'\n\t\t''99 warnings'$'\n\t\t''Subject: CN=Android Debug, OU=Android, O=US, L=US, ST=US, C=US'$'\n\t\t''SHA256: 1e08a903aef9c3a721510b64ec764d01d3d094eb954161b62544ea8f187b5953 / SHA256withRSA'$'\n\t\t''Expires: Thu Mar 10 20:10:05 GMT 2044'$'\n\n''[Sat Nov 29 00:27:46 GMT 2025][v1.2.1]'$'\n''Successfully processed 1 APKs and 0 errors in 30.44 seconds.'$'\n\033''[1;33m[!]'$'\033''[0m Signing failed. Using unsigned APK as: story-patched.apk'$'\n\033''[0;36mPatching process'$'\033''[0m: 100%|████████████████████████████████████████| 10/10'$'\r\n\033''[0;36m ➤ Cleaning up temporary files...'$'\033''[0m'$'\n\033''[0;32m[✓]'$'\033''[0m Removed 0 temporary files/directories'$'\n''story-patched.apk': No such file or directory
du: invalid zero-length file name
╔══════════════════════════════════════════════╗
║ PROCESS COMPLETE ║
╚══════════════════════════════════════════════╝
✓ Final APK:
▶ Step 1/10: Extracting base.apk
Patching process: 10%|████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| 1/10
▶ Step 2/10: Creating libFirebaseCppApp.so
[✓] Created libFirebaseCppApp.so from base.apk
Patching process: 20%|████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| 2/10
▶ Step 3/10: Cleaning previous files
[✓] Removed 0 old files/directories
Patching process: 30%|████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░| 3/10
▶ Step 4/10: Merging APKS to APK
[✓] Successfully merged to APK (Size: 176 MB)
Patching process: 40%|████████████████░░░░░░░░░░░░░░░░░░░░░░░░| 4/10
▶ Step 5/10: Preparing decompilation
Patching process: 50%|████████████████████░░░░░░░░░░░░░░░░░░░░| 5/10
▶ Step 6/10: Decompiling merged APK
[i] This may take several minutes depending on APK size...
[✓] Decompilation completed in 1982 seconds
Patching process: 60%|████████████████████████░░░░░░░░░░░░░░░░| 6/10
▶ Step 7/10: Modifying AndroidManifest.xml
[!] No license check entries found in manifest
(This is often an indication that PairIP has addition safeguards.)
Patching process: 70%|████████████████████████████░░░░░░░░░░░░| 7/10
▶ Step 8/10: Patching decompiled files
▶ Applying patches to decompiled files
➤ Patching protection code...
[✓] Patched VMRunner.smali
[!] VMRunner.smali not found or not patched
[✓] Patched SignatureCheck.smali
[!] SignatureCheck.smali not found or not patched
➤ Copying native libraries...
[✓] Copied libpairipcorex.so to arm64-v8a architecture
[✓] Copied libFirebaseCppApp.so to arm64-v8a architecture
[✓] Copied libpairipcorex.so to armeabi-v7a architecture
[✓] Copied libFirebaseCppApp.so to armeabi-v7a architecture
[!] No library directories found containing libpairipcore.so
➤ Patching file paths configuration...
[!] No matching <external-path> entries found
Patching process: 80%|████████████████████████████████░░░░░░░░| 8/10
▶ Step 9/10: Building modified APK
[i] Building APK from modified files...
[✓] Build completed in 282 seconds (Size: 159 MB)
Patching process: 90%|████████████████████████████████████░░░░| 9/10
▶ Step 10/10: Signing the APK
source:
/storage/emulated/0/Download/removepairip
zipalign location: PATH
/data/data/com.termux/files/usr/bin/zipalign
keystore:
[0] 161a0018 /data/data/com.termux/files/usr/tmp/temp_12626573556050001554_debug.keystore (DEBUG_EMBEDDED)
01. out.apk
SIGN
file: /storage/emulated/0/Download/removepairip/out.apk (211.35 MiB)
checksum: 4ecbe39851eb2c194c8cc3bcd29f6ed9fc4d32cb1c2f0bb69378bd74af517f76 (sha256)
- zipalign success
- sign success
VERIFY
file: /storage/emulated/0/Download/removepairip/out.apk (211.35 MiB)
checksum: cf6e83a91730da0a25249f1603959e1b60676d76afdf3f955756aadfc2958860 (sha256)
- zipalign verified
- signature verified [v1, v2, v3]
99 warnings
Subject: CN=Android Debug, OU=Android, O=US, L=US, ST=US, C=US
SHA256: 1e08a903aef9c3a721510b64ec764d01d3d094eb954161b62544ea8f187b5953 / SHA256withRSA
Expires: Thu Mar 10 20:10:05 GMT 2044
[Sat Nov 29 00:27:46 GMT 2025][v1.2.1]
Successfully processed 1 APKs and 0 errors in 30.44 seconds.
[!] Signing failed. Using unsigned APK as: story-patched.apk
Patching process: 100%|████████████████████████████████████████| 10/10
➤ Cleaning up temporary files...
[✓] Removed 0 temporary files/directories
story-patched.apk
✓ Size: MB
✓ Location:
✓ Total processing time: 2374 seconds
🌎u0_a314@localhost ✅ ⌚Fri 28 7:52PM 🚥JOBS 0 📁/sdcard/Download/removepairip
% 👉
At this point you will typically have an APK that can now be modded further, whether it's removing ad's or adding coins.
If however the game starts up and instantly crashes or gives a black screen, then it is likely that more protection exists, as with this game.
Remember, this tool doesn't remove the protection, it bypasses it.
Tool's like RKPairIP remove the protection, however, like this tool, it cannot deal with additional protections. Too, removing security code is tricky and can break the app.
There is no simple solution at this time.
One suggestion is to try and find an apks version of the apkm and repeat the process.
I was able to locate an xapk v8 only version, rename the files and try again.
Unfortunately, it too had the same protections.
I dusted off an older python script that requires a lot more manual work.
I have named it patch3.py and it should be the last attempt.
It works better on PairIP versions prior to 2025.
That too failed.
For the moment, this particular game is not reversible.
Although this proved a failure in reverse engineering of this particular game, it has provided code improvements and an answer for when this process fails to work.
I have updated the first post with the new tool set.
I will continue to work on a method to bypass/remove this protection.
An external sdcard is not required.
In matters of Termux, sdcard is about the system path Android uses for sharing folders and files.
/sdcard/Download is the virtual path for /storage/emulated/0/Download
I've been able to verify that the app has gone from being protected by PairIP 2025 v1 to PairIP 2025 v2 with Chinese modded protections, Google加固.
When RK can't remove PairIP and non of the 3 tools covered in this thread can bypass PairIP, then it is likely a modified version with extra protection. I am still researching this, however, my tablet recently died and I am awaiting a new one.
While I can do some research on PC, I can't test or get real world results without an Android device.
Some research into variations of PairIP 2025 v2 ID'ed as Google加固 that can not yet be fully removed/bypassed.
AndroidProtect
Android VMP hardening supports aar, aab, and apk hardening. One-click bypass for clone apps, one-click removal of device ID recognition from aab files, and erasure of developer information. Resolves various installation virus alerts for apk apps.
AndroidProtect is a powerful Android hardening tool offering the following features:
Multi-format hardening support: Supports hardening for aar, aab, apk, and other formats to meet diverse needs.
One-click masking package filtering: Automatically filters sensitive information in masking packages to protect your intellectual property.
One-click device ID erasure: Instantly removes device ID recognition from aab files to prevent installation package feature tracking.
Developer Information Erasure: Removes developer details from APK/AAB files, obscures file characteristics, and safeguards your privacy.
Resolves APK/App Installation Virus Alerts: Addresses and prevents false virus detections during APK/app installations on major app stores, boosting listing success rates and ensuring user confidence.
Code Scanning Prevention: Post-hardening code obfuscation thwarts detection by conventional tools or Google Play scans.
Advantages of AndroidProtect
AndroidProtect employs multiple hardening techniques to effectively shield your application from reverse engineering, cracking, and secondary development attacks.
Robust Hardening Technologies: AndroidProtect utilizes multiple hardening techniques, including code obfuscation, resource encryption, and APK signature protection, to effectively shield your application from reverse engineering, cracking, and secondary development attacks.
User-Friendly: AndroidProtect is simple to operate, requiring just a few steps to complete hardening. Even developers without hardening experience can easily get started.
High Cost-Effectiveness: AndroidProtect offers affordable pricing, providing you with cost-effective hardening services.
On-Premises Deployment: AndroidProtect supports on-premises deployment, allowing you to complete all tasks locally on your own machine without requiring an internet connection.
AndroidProtect is suitable for the following scenarios:
Protecting Commercial Apps: AndroidProtect effectively safeguards commercial applications against reverse engineering, cracking, and secondary development attacks, protecting your intellectual property and business interests.
Protecting Gaming Apps: AndroidProtect effectively protects gaming applications from cracking, preventing theft of in-game items, coins, and other assets.
Protecting Social Apps: AndroidProtect safeguards social applications against attacks, preventing user data leaks.
Protecting Intellectual Property: AndroidProtect prevents malicious actors from obtaining your technical solutions and encryption methods.
Added a privacy protection mode.
Added active defense against various types of cheats.
Added command-line parameters to specify signature versions.
Added compatibility with Unreal Engine 5 (UE5).
Added detection of memory cheats for emulator games on PC.
Added detection of new types of acceleration.
Added device fingerprinting functionality.
Added functionality for verifying signature information in Android App Bundles (AAB).
Added interception of zygisk-il2cppdumper behavior.
Added private server combat functionality.
Added support for encrypting Assetbundle directories.
Added support for firebase and backtrace crash collection.
Added support for xlua encryption.
Allowed the use of relative paths for signature configuration.
Enhanced anti-virtual machine and anti-virtual framework features.
Enhanced defense against tools such as zygisk-il2cppdumper and frida.
Enhanced resistance against various variants of il2cpp dumpers.
Enhanced resource encryption with multiple algorithms and supported the specification of different algorithms.
Enhanced security countermeasures.
Enhanced the active anti-cheat defense mechanism.
Improved protection speed.
Improved security strength.
Improved support for cocos script encryption.
Improved support for the x86 instruction set.
Included detection of new types of virtual machines and frameworks.
Increased compatibility with new versions of emulators from multiple brands.
Increased detection of simulated click behaviors.
Increased protection strength.
Increased security strength.
Increased the strength of anti-cracking measures.
Optimized detection of virtual machines and emulators.
Optimized the efficiency of signature and zipalign processes.
Optimized the online single-signature verification mode.
Strengthened memory modification prevention.
Supported custom encryption for cocos scripts.
Supported customized security options.
Supported game package protection using relative paths.
Supported game packages over 2GB in size.
Supported multi-server mode.
Supported overlay installation for high versions of Unity.
Supported protection of game packages exceeding 4GB in size.
Supported protection of UE (Unreal Engine) AAB packages.
Supported relative paths for signature configuration.
Supported signature passwords that include spaces.
Updated the defense against debugging and analysis tools such as frida.
Updated the detection of cloud phones.