Skip to content

Instantly share code, notes, and snippets.

@EZonTheEyes
Last active September 22, 2023 22:58
Show Gist options
  • Save EZonTheEyes/2350379b148f5db239837be4863ec26f to your computer and use it in GitHub Desktop.
Save EZonTheEyes/2350379b148f5db239837be4863ec26f to your computer and use it in GitHub Desktop.
Truncated Aetherpatch-full.sh ; Redistributed by EZOnTheEyes
#!/bin/bash
PATCHED_APP_NAME="NetherSX2"
# ----Pre-checks----
IS_TERMUX="0"
acquire_apk() {
OUT_APK="$1"
if [ -z "$OUT_APK" ]; then
OUT_APK="15210-v1.5-4248.apk"
fi
if true; then
echo "Downloading APK..."
if ! wget "https://www.aethersx2.com/archive/android/alpha/15210-v1.5-4248.apk" -O "$OUT_APK"; then
return 1;
fi
else
echo "Extracting APK..."
AETHERSX2_LINE=$(awk '/^__AETHERSX2_BEGINS__/ { print NR + 1; exit 0; }' $0)
if ! tail -n "+${AETHERSX2_LINE}" "$0" > "$OUT_APK"; then
return 1;
fi
fi
return 0
}
check_tools() {
required_tools=(
"xmlstarlet"
"apktool"
"apksigner"
"keytool"
"zipalign"
"wget"
"gm"
)
for cmd in "${required_tools[@]}"; do
$cmd >/dev/null 2>/dev/null
if [ "$?" -eq 127 ]; then
echo "Required tool or alias $cmd not found"
return 1
fi
done
return 0
}
echo "Patcher start!"
if termux-setup-storage --help >/dev/null 2>/dev/null && apt -v >/dev/null 2>/dev/null; then
echo "Checking tools (Termux)..."
if ! check_tools; then
if apt update && apt upgrade -o Dpkg::Options::="--force-confold" -y; then
apt install -y xmlstarlet graphicsmagick which wget
if ! which apktool || ! which apksigner || ! which keytool || ! which zipalign; then
if ! curl -s https://raw.githubusercontent.com/rendiix/termux-apktool/main/install.sh | bash ; then
echo "Failed to install apktool"
exit 101
fi
fi
else
echo "This looks like termux, but apt upgrade failed."
exit 100
fi
fi
IS_TERMUX="1"
fi
echo "Checking tools (Final)..."
if ! check_tools; then
echo "Exiting due to missing required tool"
exit 1
fi
APK_FILE=""
# --Termux-specific--
if [ -z "$1" ]; then
TERMUX_SHARED="$HOME/storage/shared"
if [ "$IS_TERMUX" -eq "1" ]; then
if [ ! -d "$TERMUX_SHARED" ] || ! ls "$TERMUX_SHARED" >/dev/null 2>/dev/null; then
echo "Requesting storage setup..."
termux-setup-storage
for i in $(seq 20); do
if [ -d "$TERMUX_SHARED" ] && ls "$TERMUX_SHARED" >/dev/null 2>/dev/null; then
break
fi
sleep 1
done
if [ ! -d "$TERMUX_SHARED" ] || ! ls "$TERMUX_SHARED" >/dev/null 2>/dev/null; then
echo "Shared storage not found!"
exit 102
fi
fi
mkdir -p "$TERMUX_SHARED/$PATCHED_APP_NAME"
if ! acquire_apk "$TERMUX_SHARED/$PATCHED_APP_NAME/15210-v1.5-4248.apk"; then
echo "Failed to download aethersx2!"
exit 103
fi
APK_FILE="$TERMUX_SHARED/$PATCHED_APP_NAME/15210-v1.5-4248.apk"
else
if ! acquire_apk; then
echo "Failed to download aethersx2!"
exit 103
fi
APK_FILE="15210-v1.5-4248.apk"
fi
elif [ ! -f "$1" ]; then
echo "Required APK file '$1' not passed or not found!"
exit 2
else
APK_FILE="$1"
fi
# --End Termux-specific--
# ----End Pre-checks----
TMPDIR=`mktemp -d`
WORKDIR="$TMPDIR/work"
APK_NAME=$(basename -- "$APK_FILE")
APK_DIR=$(dirname -- "$APK_FILE")
# ----Decompile----
CLASSES_HASH="8a0c195898418c3310768873f4a10b14be325f5faa60dc1d4e9af24a3026ddce"
CLASSES_PATH="classes.dex"
NATIVE_LIB_HASH="10f659b0d30adea8162b6dd8daeeeb480fafb1e25df5752aa1dd227c0b7a3da0"
NATIVE_LIB_PATH="lib/arm64-v8a/libemucore.so"
if ! apktool d -s -o "$WORKDIR" "$APK_FILE"; then
echo "apktool failed"
exit 3
fi
echo -e "$CLASSES_HASH $WORKDIR/$CLASSES_PATH\n$NATIVE_LIB_HASH $WORKDIR/$NATIVE_LIB_PATH" | sha256sum --check --status
if [ "$?" -ne 0 ]; then
echo "Found unsupported APK (only 15210-v1.5-4248) is supported!"
exit 4
fi
# ----End Decompile----
# ----Patches----
# --Manifest Cleanup--
MANIFEST_PATH="AndroidManifest.xml"
manifest_remove=(
"manifest/uses-permission[@android:name='android.permission.ACCESS_NETWORK_STATE' or @android:name='com.google.android.gms.permission.AD_ID' or @android:name='android.permission.WAKE_LOCK' or @android:name='android.permission.FOREGROUND_SERVICE']"
"manifest/queries"
"manifest/application/service"
"manifest/application/receiver"
"manifest/application/meta-data[@android:name='com.google.android.gms.ads.APPLICATION_ID' or @android:name='com.google.android.gms.version']"
"manifest/application/provider/meta-data[@android:name='androidx.work.WorkManagerInitializer']"
"manifest/application/activity[@android:name='com.google.android.gms.ads.AdActivity' or @android:name='com.google.android.gms.version' or @android:name='com.google.android.gms.common.api.GoogleApiActivity' or @android:name='com.google.android.gms.ads.OutOfContextTestingActivity']"
"manifest/application/provider[@android:name='com.google.android.gms.ads.MobileAdsInitProvider']"
"manifest/application/activity/@android:preferMinimalPostProcessing"
"manifest/application/@android:extractNativeLibs"
)
for xpath in "${manifest_remove[@]}"; do
xmlstarlet ed -L -d "$xpath" "$WORKDIR/$MANIFEST_PATH"
done
xmlstarlet ed -L -u "manifest/application/@android:label" -v "$PATCHED_APP_NAME" "$WORKDIR/$MANIFEST_PATH"
xmlstarlet ed -L -u "manifest/application/activity[@android:label='AetherSX2']/@android:label" -v "$PATCHED_APP_NAME" "$WORKDIR/$MANIFEST_PATH"
# --End Manifest Cleanup--
# --Main Activity Layout Cleanup--
MAIN_LAYOUT_PATH="res/layout/activity_main.xml"
xmlstarlet ed -L -d "androidx.drawerlayout.widget.DrawerLayout/androidx.coordinatorlayout.widget.CoordinatorLayout/RelativeLayout/FrameLayout/@android:layout_above" "$WORKDIR/$MAIN_LAYOUT_PATH"
xmlstarlet ed -L -a "androidx.drawerlayout.widget.DrawerLayout/androidx.coordinatorlayout.widget.CoordinatorLayout/RelativeLayout/FrameLayout" -t attr -n "android:layout_alignParentBottom" -v "true" "$WORKDIR/$MAIN_LAYOUT_PATH"
xmlstarlet ed -L -d "androidx.drawerlayout.widget.DrawerLayout/androidx.coordinatorlayout.widget.CoordinatorLayout/RelativeLayout/com.google.android.gms.ads.AdView" "$WORKDIR/$MAIN_LAYOUT_PATH"
xmlstarlet ed -L -u "androidx.drawerlayout.widget.DrawerLayout/androidx.coordinatorlayout.widget.CoordinatorLayout/com.google.android.material.floatingactionbutton.FloatingActionButton/@android:layout_marginBottom" -v "16.0dip" "$WORKDIR/$MAIN_LAYOUT_PATH"
# --End Main Activity Layout Cleanup--
# --aapt2 Build Fix--
sed -i 's/@android:color/@*android:color/g' "$WORKDIR/res/values-v31/colors.xml"
# --End aapt2 Build Fix--
# --Update Licensing Information--
LICENSE_PATH="assets/3rdparty.html"
sed -i '4i\
<h1>AetherSX2 Violates the LGPLv3</h1>\
<p>This app is not actually LGPL compliant.</p>\
<p>While the original author claims that LGPL-compliant source is available at <a href="https://www.aethersx2.com/lgpl/aethersx2-lgpl.tar.gz">https://www.aethersx2.com/lgpl/aethersx2-lgpl.tar.gz</a>, closer examination shows that this source tarball does not correspond to the current release, and is in reality very outdated.</p>\
<p>Demand the original author do better by sending them an email at <a href="android@aethersx2.com">android@aethersx2.com</a></p>\
<p>Original Third Party license information follows below</p>' "$WORKDIR/$LICENSE_PATH"
# --End Update Licensing Information--
# --Icons--
for i in "$WORKDIR"/res/mipmap*/{ic_launcher.png,ic_launcher_foreground.png,ic_launcher_round.png,logo.png}; do
gm convert "$i" -colorspace HSL -modulate 80,120,170 -colorspace sRGB "$i"
done
# --End Icons--
# --Patch Native Library--
# Patch signature checks
echo -n -e "\x66\x00\x00\x14" | dd bs=1 conv=notrunc seek=$((0x838560)) of="$WORKDIR/$NATIVE_LIB_PATH"
echo -n -e "\x62\x00\x00\x14" | dd bs=1 conv=notrunc seek=$((0x83B324)) of="$WORKDIR/$NATIVE_LIB_PATH"
# Patch BIOS type check
echo -n -e "\x35\x00\x80\x52" | dd bs=1 conv=notrunc seek=$((0x829248)) of="$WORKDIR/$NATIVE_LIB_PATH"
# --End Patch Native Library--
# --Patch DEX--
# Disable ads
echo -n -e "\x0e\x00" | dd bs=1 conv=notrunc seek=$((0x222264)) of="$WORKDIR/$CLASSES_PATH"
echo -n -e "\x0e\x00" | dd bs=1 conv=notrunc seek=$((0x3C5B70)) of="$WORKDIR/$CLASSES_PATH"
# Restore Launcher support
echo -n -e "\x12\x11" | dd bs=1 conv=notrunc seek=$((0x3BDAA4)) of="$WORKDIR/$CLASSES_PATH"
dd bs=1 conv=notrunc if="$WORKDIR/$CLASSES_PATH" skip=$((0x3C5A24)) seek=$((0x3BDAA6)) of="$WORKDIR/$CLASSES_PATH" count=14
echo -n -e "\x04" | dd bs=1 conv=notrunc seek=$((0x3BDAAA)) of="$WORKDIR/$CLASSES_PATH"
echo -n -e "\x05" | dd bs=1 conv=notrunc seek=$((0x3BDAAD)) of="$WORKDIR/$CLASSES_PATH"
echo -n -e "\x15" | dd bs=1 conv=notrunc seek=$((0x3BDAB2)) of="$WORKDIR/$CLASSES_PATH"
echo -n -e "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" | dd bs=1 conv=notrunc seek=$((0x3BDAB4)) of="$WORKDIR/$CLASSES_PATH"
# Fix checksum
echo -n -e "\xdd\xa2\x21\x3a" | dd bs=1 conv=notrunc seek=$((0x8)) of="$WORKDIR/$CLASSES_PATH"
# --End Patch Native Library--
# ----End Patches----
# ----Build and Sign----
# Rebuild APK
# Generate keystore
echo y | keytool -genkeypair -dname "cn=GNU LGPLv3, ou=GNU LGPLv3, o=GNU LGPLv3, c=XX" -alias gnulgplv3 -keypass gnulgplv3 -keystore "$TMPDIR/android.keystore" -storepass gnulgplv3 -keyalg RSA -keysize 2048 -validity 10000
apktool b --use-aapt2 -o "$WORKDIR/dist/1.apk" "$WORKDIR"
zipalign -f -v 4 "$WORKDIR/dist/1.apk" "$WORKDIR/dist/2.apk"
echo "gnulgplv3" | apksigner sign --ks "$TMPDIR/android.keystore" "$WORKDIR/dist/2.apk" > /dev/null
cp "$WORKDIR/dist/2.apk" "$APK_DIR/${APK_NAME%.*}-noads.apk"
echo "Done! Output APK should be in " $(readlink -f "$APK_DIR")
rm -r "$TMPDIR"
if [ "$IS_TERMUX" -eq "1" ]; then
# Try to open a file browser to the created folder
termux-open-url "content://com.android.externalstorage.documents/document/primary%3ANetherSX2"
fi
# ----End Build and Sign----
exit 0
# USE TRUNCATED AT END USERS DISCRETION, IT IS SUGGESTED TO CURL FULL FROM OTHER OFFICIAL HOSTS, OR RUN LOCALLY
# THE FOLLOWING OPINIONS AND STATEMENTS EXPRESSED ARE BY THE SCRIPT AUTHOR, NOT THE DSITRIBUTOR.
# AS THE SOLE AUTHOR REMAINS ANONYMOUS, NO REDISTRIBUTOR IS TO BE QUOTABLE FOR THE FOLLOWING DESCRIPTION. (Note: Removed Line 8 of Notes, applicability.)
# AetherSX2 is CC BY-NC-ND 4.0 + LGPLv3
# The CC BY-NC-ND 4.0 explicitly says:
# You are free to:
#
# Share — copy and redistribute the material in any medium or format
#
# The licensor cannot revoke these freedoms as long as you follow the license terms.
#
# AetherSX2 is apparently the author of AetherSX2 at the moment, so there's your attribution
# Tahlreth doesn't exist anymore or whatever, but in case he's the author, hi, you're the author for attribution
# APK is originally from https://www.aethersx2.com, specifically https://www.aethersx2.com/archive/android/alpha/15210-v1.5-4248.apk
#
# I'm not making money off of this. I can assure you.
#
# Now the license is a little interesting here.
# "NoDerivatives — If you remix, transform, or build upon the material, you may not distribute the modified material."
#
# While I cannot share a modified APK myself, this implies that every end user may modify it for themselves, so long as they don't share it.
# Indeed, in the full license text:
#
# Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
#
# A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and
# B. produce and reproduce, but not Share, Adapted Material for NonCommercial purposes only.
#
# ...therefore you, the end user, are perfectly entitled to produce and reproduce adapted material for noncommercial purposes only, so long as you do not share it
#
#
# I believe I'm making a good-faith effort to comply with the license here.
# Unlike some people.
# ;)
# Retrieved: August 6th 2023, 9:30PM est
# Latest Edit: August 12th 2023, 7:10 EST
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment