-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpatch-playstore
executable file
·165 lines (135 loc) · 9.42 KB
/
patch-playstore
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#!/bin/bash
#################################################################################################################
#
# initial version created by: Christopher Roy Bratusek @Nanolx www.nanolx.org
# LICENSE: WTFPL (http://www.wtfpl.net/txt/copying/)
#
# adapted, fixed, enhanced by steadfasterX <steadfasterX |AT| gmail #DOT# com>
#
#################################################################################################################
keystore="${HOME}/.NanolxKey.jks"
strings_insert=" <string name=\"fake_signature\">308204433082032ba003020102020900c2e08746644a308d300d06092a864886f70d01010405003074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f6964301e170d3038303832313233313333345a170d3336303130373233313333345a3074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f696430820120300d06092a864886f70d01010105000382010d00308201080282010100ab562e00d83ba208ae0a966f124e29da11f2ab56d08f58e2cca91303e9b754d372f640a71b1dcb130967624e4656a7776a92193db2e5bfb724a91e77188b0e6a47a43b33d9609b77183145ccdf7b2e586674c9e1565b1f4c6a5955bff251a63dabf9c55c27222252e875e4f8154a645f897168c0b1bfc612eabf785769bb34aa7984dc7e2ea2764cae8307d8c17154d7ee5f64a51a44a602c249054157dc02cd5f5c0e55fbef8519fbe327f0b1511692c5a06f19d18385f5c4dbc2d6b93f68cc2979c70e18ab93866b3bd5db8999552a0e3b4c99df58fb918bedc182ba35e003c1b4b10dd244a8ee24fffd333872ab5221985edab0fc0d0b145b6aa192858e79020103a381d93081d6301d0603551d0e04160414c77d8cc2211756259a7fd382df6be398e4d786a53081a60603551d2304819e30819b8014c77d8cc2211756259a7fd382df6be398e4d786a5a178a4763074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f6964820900c2e08746644a308d300c0603551d13040530030101ff300d06092a864886f70d010104050003820101006dd252ceef85302c360aaace939bcff2cca904bb5d7a1661f8ae46b2994204d0ff4a68c7ed1a531ec4595a623ce60763b167297a7ae35712c407f208f0cb109429124d7b106219c084ca3eb3f9ad5fb871ef92269a8be28bf16d44c8d9a08e6cb2f005bb3fe2cb96447e868e731076ad45b33f6009ea19c161e62641aa99271dfd5228c5c587875ddb7f452758d661f6cc0cccb7352e424cc4365c523532f7325137593c4ae341f4db41edda0d0b1071a7c440f0fe9ea01cb627ca674369d084bd2fd911ff06cdbf2cfa10dc0f893ae35762919048c7efc64c7144178342f70581c9de573af55b390dd7fdb9418631895d5f759f30112687ff621410c069308a</string>"
error () {
echo -e "\nERROR: ${@}\n"
exit 1
}
# ensure custom apktool is used from ${HOME}/bin
PATH="${HOME}/bin:${PATH}"
# default max SDK if not specified
[ -z "$ANDROIDSDK" ] && export ANDROIDSDK=33
# note: using the 34 framework causes issues atm
# debug on/off
unset DEBUGOPT
if [ "$DEBUG" != "yes" ];then
DEBUG=no
export DEBUGOPT="-q"
fi
setup () {
command -v apktool >/dev/null || error "apktool not found"
command -v apksigner >/dev/null || error "apksigner not found"
command -v aapt >/dev/null || error "aapt not found"
command -v zipalign >/dev/null || error "zipalign not found"
# prepare and use android framework to avoid issues with non-translatable resources
[ ! -d framework ] && mkdir framework
[ ! -f framework/1-${ANDROIDSDK}.apk ] && wget -q "https://github.com/Sable/android-platforms/raw/master/android-${ANDROIDSDK}/android.jar" -O framework/1-${ANDROIDSDK}.apk
gplay_version=$(aapt dump badging "${gplay}" | gawk -F \' '/^package: name/{print $4}')
gplay_version_p=$(aapt dump badging "${gplay}" | gawk -F \' '/^package: name/{print $6}' | sed -e 's/\ .*//')
gplay_name=$(aapt dump badging "${gplay}" | gawk -F \' '/^package: name/{print $2}')
[[ "${gplay_name}" != com.android.vending ]] && error "Given file is not a Play Store apk"
[ -z "${gplay_version}" ] && error "Could not determine Play Store version code"
[[ ! "${gplay_version_p}" != ^[0-9][0-9].[0-9].[0-9][0-9]$ ]] && error "Version seems not like a Play Store version"
gplay_orig="play_${gplay_version_p}.orig"
gplay_work="play_${gplay_version_p}"
gplay_dist="${gplay_work}/dist/$(basename "${gplay}")"
gplay_out="Phonesky_${gplay_version_p}_patched.apk"
echo "Detected Play Store:
APK: $(basename "${gplay}")
VER: ${gplay_version_p} [${gplay_version}]
DEBUG: $DEBUG
SDK: $ANDROIDSDK
"
}
unpack_gplay () {
echo "[1] Unpacking APK"
rm -rf "${gplay_work}" "${gplay_orig}"
apktool $DEBUGOPT d ${APKTOOL_FLAGS} -p framework -t ${ANDROIDSDK} "${gplay}" -o "${gplay_work}" || error "apktool failed to unpack ${gplay}"
grep -q FAKE_PACKAGE_SIGNATURE "${gplay_work}/AndroidManifest.xml" && error "APK already patched!"
#find "${gplay_work}" -type f -name '*.xml' | xargs sed '/APKTOOL_DUMMY/d' -i
cp -r "${gplay_work}" "${gplay_orig}"
}
repack_gplay () {
echo "[3] Repacking APK"
diff -Nupr "${gplay_orig}" "${gplay_work}" > "Phonesky-${gplay_version_p}.diff"
apktool $DEBUGOPT b ${APKTOOL_FLAGS} -p framework -t ${ANDROIDSDK} "${gplay_work}" || error "apktool failed to repack ${gplay}"
mv "${gplay_dist}" "${gplay_out}"
[ -f "${keystore}" ] && apksigner sign --ks "${keystore}" "${gplay_out}"
[ "$DEBUG" != "yes" ] && rm -rf "${gplay_work}" "${gplay_orig}"
# Since Android 10 we need to zipalign (https://developer.android.com/tools/zipalign)
[ "$ANDROIDSDK" -ge 29 ] && zipalign -f -p 4 "${gplay_out}" "${gplay_out}_zipaligned"
}
patch_gplay () {
echo "[2] Patching APK"
# add FAKE_PACKAGE_SIGNATURE
manifest_perm_pos=$(gawk '/uses-permission/{print FNR ; exit}' "${gplay_work}/AndroidManifest.xml")
manifest_perm_insert="<uses-permission android:name=\"android.permission.FAKE_PACKAGE_SIGNATURE\"/>"
sed "${manifest_perm_pos}i${manifest_perm_insert}" -i "${gplay_work}/AndroidManifest.xml"
# add metadata to application
manifest_application_pos=$(gawk '/<application/{print FNR ; exit}' "${gplay_work}/AndroidManifest.xml")
manifest_application_insert="<meta-data android:name=\"fake-signature\" android:value=\"@string/fake_signature\"/>"
sed "${manifest_application_pos}a${manifest_application_insert}" -i "${gplay_work}/AndroidManifest.xml"
# deactivate bootreceiver
bootreceiver=$(grep -o 'com.google.android.finsky.receivers.BootCompletedReceiver' "${gplay_work}/AndroidManifest.xml" || grep -o 'com.google.android.finsky.boothandler.BootCompletedReceiver' "${gplay_work}/AndroidManifest.xml")
if [ $? -eq 0 ];then
manifest_bootreceiver_pos=$(gawk '/'$bootreceiver'/{print FNR ; exit}' "${gplay_work}/AndroidManifest.xml")
manifest_bootreceiver_start=$((manifest_bootreceiver_pos + 1))
manifest_bootreceiver_end=$((manifest_bootreceiver_start + 2))
sed "${manifest_bootreceiver_start},${manifest_bootreceiver_end}d" -i "${gplay_work}/AndroidManifest.xml"
sed "${manifest_bootreceiver_pos}a<intent-filter/>" -i "${gplay_work}/AndroidManifest.xml"
else
echo "WARNING: could not find bootreceiver definition, skipping.."
fi
# add public string fake_signature
sed "/<\/resources>/i ${strings_insert}" -i "${gplay_work}/res/values/strings.xml"
# add public string id fake_signature
public_pos=$(gawk '/type="string"/{a=FNR} END{print a}' "${gplay_work}/res/values/public.xml")
public_pos_insert=$((public_pos + 1))
public_id=$(gawk -F\" -v line=${public_pos} 'NR==line {print $6}' "${gplay_work}/res/values/public.xml")
public_id_insert=$(printf "%X\n" $((public_id + 1)))
public_insert=" <public type=\"string\" name=\"fake_signature\" />"
sed "${public_pos_insert}i${public_insert}" -i "${gplay_work}/res/values/public.xml"
# patch known "no public resource" errors:
sed -i 's#@android:color/background_floating_device_default_dark#@*android:color/background_floating_device_default_dark#g' ${gplay_work}/res/color/*.xml
sed -i 's#@android:color/GM2_grey_800#@*android:color/GM2_grey_800#g' ${gplay_work}/res/color/*.xml
sed -i 's/@android:color/@*android:color/g' ${gplay_work}/res/values/styles.xml
sed -i 's/@android:color/@*android:color/g' ${gplay_work}/res/values-v*/colors.xml
# patch stub errors (all wrong app:/finsky: dummies):
for stub in $(find ${gplay_work} -type f -name '*.xml' -exec grep -Eq '(<com\.google\.android\.finsky\.uicomponentsmvc\..*Stub.*)(app:APKTOOL_DUMMYVAL_0x\w+=".*"|finsky:APKTOOL_DUMMYVAL_0x\w+=".*")' {} \; -print);do
S=1
while [ $S -eq 1 ]; do
[ -f changed ] && rm changed
sed -i -E 's/(<com\.google\.android\.finsky\.uicomponentsmvc\..*Stub\s+.*)(app:APKTOOL_DUMMYVAL_0x\w+=".*"|finsky:APKTOOL_DUMMYVAL_0x\w+=".*").(.*)/\1\3/g w changed' $stub
if [ -s changed ];then
[ "$DEBUG" == "yes" ] && echo "cleaned a problematic app/finsky stub in $stub"
S=1
else
[ "$DEBUG" == "yes" ] && echo finished processing $stub
S=0
fi
done
done
}
if [ "$1" == "printapk" ];then
gplay="${2}"
setup
echo "file:$gplay_out"
echo "playversion:${gplay_version_p}:${gplay_version}"
else
for file in "${@}"; do
gplay="${file}"
[ ! -f "${file}" ] && error "No Play Store apk given"
setup
unpack_gplay
patch_gplay || error "patching failed"
repack_gplay
done
fi