Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
218fadb6a4 | ||
|
|
89e3711977 | ||
|
|
73c746fe2b |
@@ -1,3 +1,13 @@
|
|||||||
|
# What's the difference from this fork ?
|
||||||
|
|
||||||
|
I added some small code lines to enable this script for beeing used with "MULTIPLE ANDROID USERS IN WAYDROID"
|
||||||
|
|
||||||
|
--> It won't work with only a single user created (maybe fixing that in the future..)
|
||||||
|
--> You need to create at least "two users" in Waydroid to be able to get the IDs for Android verifications
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Waydroid Extras Script
|
# Waydroid Extras Script
|
||||||
|
|
||||||
Script to add GApps and other stuff to Waydroid!
|
Script to add GApps and other stuff to Waydroid!
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ from stuff.nodataperm import Nodataperm
|
|||||||
from stuff.smartdock import Smartdock
|
from stuff.smartdock import Smartdock
|
||||||
from stuff.widevine import Widevine
|
from stuff.widevine import Widevine
|
||||||
from stuff.fdroidpriv import FDroidPriv
|
from stuff.fdroidpriv import FDroidPriv
|
||||||
from stuff.device_spoof import DeviceSpoof, PROFILES
|
|
||||||
import tools.helper as helper
|
import tools.helper as helper
|
||||||
from tools import container
|
from tools import container
|
||||||
from tools import images
|
from tools import images
|
||||||
@@ -90,8 +89,6 @@ def install_app(args):
|
|||||||
install_list.append(Mitm(args.ca_cert_file))
|
install_list.append(Mitm(args.ca_cert_file))
|
||||||
if "fdroidpriv" in app:
|
if "fdroidpriv" in app:
|
||||||
install_list.append(FDroidPriv(args.android_version))
|
install_list.append(FDroidPriv(args.android_version))
|
||||||
if "device_spoof" in app:
|
|
||||||
DeviceSpoof(getattr(args, "spoof_profile", "pixel6")).install()
|
|
||||||
|
|
||||||
if not container.use_overlayfs():
|
if not container.use_overlayfs():
|
||||||
copy_dir = "/tmp/waydroid"
|
copy_dir = "/tmp/waydroid"
|
||||||
@@ -143,8 +140,6 @@ def remove_app(args):
|
|||||||
remove_list.append(Mitm())
|
remove_list.append(Mitm())
|
||||||
if "fdroidpriv" in app:
|
if "fdroidpriv" in app:
|
||||||
remove_list.append(FDroidPriv(args.android_version))
|
remove_list.append(FDroidPriv(args.android_version))
|
||||||
if "device_spoof" in app:
|
|
||||||
DeviceSpoof().uninstall()
|
|
||||||
if "nodataperm" in app:
|
if "nodataperm" in app:
|
||||||
remove_list.append(Nodataperm(args.android_version))
|
remove_list.append(Nodataperm(args.android_version))
|
||||||
if "hidestatusbar" in app:
|
if "hidestatusbar" in app:
|
||||||
@@ -234,7 +229,7 @@ def interact():
|
|||||||
if not action:
|
if not action:
|
||||||
exit()
|
exit()
|
||||||
|
|
||||||
install_choices = ["gapps", "microg", "libndk", "libhoudini", "magisk", "smartdock", "fdroidpriv", "widevine", "device_spoof"]
|
install_choices = ["gapps", "microg", "libndk", "libhoudini", "magisk", "smartdock", "fdroidpriv", "widevine",]
|
||||||
hack_choices = []
|
hack_choices = []
|
||||||
if android_version=="11":
|
if android_version=="11":
|
||||||
hack_choices.extend(["nodataperm", "hidestatusbar"])
|
hack_choices.extend(["nodataperm", "hidestatusbar"])
|
||||||
@@ -256,13 +251,6 @@ def interact():
|
|||||||
default="Standard",
|
default="Standard",
|
||||||
).execute()
|
).execute()
|
||||||
args.microg_variant = microg_variant
|
args.microg_variant = microg_variant
|
||||||
if "device_spoof" in apps:
|
|
||||||
spoof_profile = inquirer.select(
|
|
||||||
message="Select device profile to spoof",
|
|
||||||
choices=list(PROFILES.keys()),
|
|
||||||
default="pixel6",
|
|
||||||
).execute()
|
|
||||||
args.spoof_profile = spoof_profile
|
|
||||||
args.app = apps
|
args.app = apps
|
||||||
install_app(args)
|
install_app(args)
|
||||||
elif action == "Remove":
|
elif action == "Remove":
|
||||||
@@ -308,7 +296,7 @@ def main():
|
|||||||
certified.set_defaults(func=get_certified)
|
certified.set_defaults(func=get_certified)
|
||||||
|
|
||||||
install_choices = ["gapps", "microg", "libndk", "libhoudini",
|
install_choices = ["gapps", "microg", "libndk", "libhoudini",
|
||||||
"magisk", "mitm", "smartdock", "widevine", "device_spoof"]
|
"magisk", "mitm", "smartdock", "widevine"]
|
||||||
hack_choices = ["nodataperm", "hidestatusbar"]
|
hack_choices = ["nodataperm", "hidestatusbar"]
|
||||||
micrg_variants = ["Standard", "NoGoolag", "UNLP", "Minimal", "MinimalIAP"]
|
micrg_variants = ["Standard", "NoGoolag", "UNLP", "Minimal", "MinimalIAP"]
|
||||||
remove_choices = install_choices
|
remove_choices = install_choices
|
||||||
@@ -339,11 +327,6 @@ widevine: Add support for widevine DRM L3
|
|||||||
dest='ca_cert_file',
|
dest='ca_cert_file',
|
||||||
help='[for mitm only] The CA certificate file (*.pem) to install',
|
help='[for mitm only] The CA certificate file (*.pem) to install',
|
||||||
default=None)
|
default=None)
|
||||||
install_parser.add_argument('-p', '--spoof-profile',
|
|
||||||
dest='spoof_profile',
|
|
||||||
help='[for device_spoof only] Device profile to spoof',
|
|
||||||
choices=list(PROFILES.keys()),
|
|
||||||
default="pixel6")
|
|
||||||
install_parser.set_defaults(func=install_app)
|
install_parser.set_defaults(func=install_app)
|
||||||
|
|
||||||
# remove and its aliases
|
# remove and its aliases
|
||||||
|
|||||||
+42
-12
@@ -1,21 +1,51 @@
|
|||||||
from tools import container
|
from tools import container
|
||||||
from tools.helper import shell
|
from tools.helper import shell
|
||||||
from tools.logger import Logger
|
from tools.logger import Logger
|
||||||
|
import re
|
||||||
|
|
||||||
class AndroidId:
|
class AndroidId:
|
||||||
def get_id(self):
|
def get_id(self):
|
||||||
if container.is_running():
|
if not container.is_running():
|
||||||
try:
|
|
||||||
queryout = shell(
|
|
||||||
arg="sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \"select * from main where name = 'android_id';\"",
|
|
||||||
env="ANDROID_RUNTIME_ROOT=/apex/com.android.runtime ANDROID_DATA=/data ANDROID_TZDATA_ROOT=/apex/com.android.tzdata ANDROID_I18N_ROOT=/apex/com.android.i18n"
|
|
||||||
)
|
|
||||||
except:
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
Logger.error("Please make sure Waydroid is running and Gapps has been installed!")
|
Logger.error("Please make sure Waydroid is running and Gapps has been installed!")
|
||||||
return
|
return
|
||||||
print(queryout.replace("android_id|", "").strip())
|
|
||||||
|
try:
|
||||||
|
# Get list of user IDs and their names using 'pm list users'
|
||||||
|
users_raw = shell(
|
||||||
|
arg="pm list users",
|
||||||
|
env="ANDROID_RUNTIME_ROOT=/apex/com.android.runtime ANDROID_DATA=/data ANDROID_TZDATA_ROOT=/apex/com.android.tzdata ANDROID_I18N_ROOT=/apex/com.android.i18n"
|
||||||
|
)
|
||||||
|
user_map = {}
|
||||||
|
for line in users_raw.strip().splitlines():
|
||||||
|
match = re.search(r'UserInfo\{(\d+):([^:}]+)', line)
|
||||||
|
if match:
|
||||||
|
user_id, username = match.groups()
|
||||||
|
user_map[user_id] = username
|
||||||
|
except Exception as e:
|
||||||
|
Logger.error(f"Failed to parse user list: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
print("------------------------------------------------------------------------")
|
||||||
|
print(f"{'Username':<20} | {'User ID':^10} | {'GSF Android ID'}")
|
||||||
|
print("------------------------------------------------------------------------")
|
||||||
|
|
||||||
|
for user_id, username in user_map.items():
|
||||||
|
try:
|
||||||
|
db_path = f"/data/user/{user_id}/com.google.android.gsf/databases/gservices.db"
|
||||||
|
query = f"sqlite3 {db_path} \"select value from main where name = 'android_id';\""
|
||||||
|
gsf_id = shell(
|
||||||
|
arg=query,
|
||||||
|
env="ANDROID_RUNTIME_ROOT=/apex/com.android.runtime ANDROID_DATA=/data ANDROID_TZDATA_ROOT=/apex/com.android.tzdata ANDROID_I18N_ROOT=/apex/com.android.i18n"
|
||||||
|
).strip()
|
||||||
|
|
||||||
|
if gsf_id:
|
||||||
|
print(f"{username:<20} | {user_id:^10} | {gsf_id}")
|
||||||
|
else:
|
||||||
|
print(f"{username:<20} | {user_id:^10} | (not found)")
|
||||||
|
except:
|
||||||
|
print(f"{username:<20} | {user_id:^10} | (query error)")
|
||||||
|
|
||||||
|
print("------------------------------------------------------------------------")
|
||||||
print(" ^----- Open https://google.com/android/uncertified/?pli=1")
|
print(" ^----- Open https://google.com/android/uncertified/?pli=1")
|
||||||
print(" Login with your google id then submit the form with id shown above")
|
print(" Login with your Google ID, then submit the form with the ID(s) shown above.")
|
||||||
|
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
import configparser
|
|
||||||
from tools.logger import Logger
|
|
||||||
|
|
||||||
|
|
||||||
PROFILES = {
|
|
||||||
"pixel6": {
|
|
||||||
"ro.product.brand": "google",
|
|
||||||
"ro.product.manufacturer": "Google",
|
|
||||||
"ro.product.model": "Pixel 6",
|
|
||||||
"ro.product.name": "oriole",
|
|
||||||
"ro.product.device": "oriole",
|
|
||||||
"ro.product.board": "oriole",
|
|
||||||
"ro.build.product": "oriole",
|
|
||||||
"ro.build.fingerprint": "google/oriole/oriole:13/TQ3A.230901.001/10750268:user/release-keys",
|
|
||||||
"ro.build.description": "oriole-user 13 TQ3A.230901.001 10750268 release-keys",
|
|
||||||
"ro.build.version.release": "13",
|
|
||||||
"ro.build.version.sdk": "33",
|
|
||||||
"ro.build.type": "user",
|
|
||||||
"ro.build.tags": "release-keys",
|
|
||||||
},
|
|
||||||
"samsung_s21": {
|
|
||||||
"ro.product.brand": "samsung",
|
|
||||||
"ro.product.manufacturer": "samsung",
|
|
||||||
"ro.product.model": "SM-G991B",
|
|
||||||
"ro.product.name": "o1sxeea",
|
|
||||||
"ro.product.device": "o1s",
|
|
||||||
"ro.product.board": "lahaina",
|
|
||||||
"ro.build.product": "o1s",
|
|
||||||
"ro.build.fingerprint": "samsung/o1sxeea/o1s:13/TP1A.220624.014/G991BXXU5EWCA:user/release-keys",
|
|
||||||
"ro.build.description": "o1sxeea-user 13 TP1A.220624.014 G991BXXU5EWCA release-keys",
|
|
||||||
"ro.build.version.release": "13",
|
|
||||||
"ro.build.version.sdk": "33",
|
|
||||||
"ro.build.type": "user",
|
|
||||||
"ro.build.tags": "release-keys",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
PROP_KEYS = list(next(iter(PROFILES.values())).keys())
|
|
||||||
|
|
||||||
|
|
||||||
class DeviceSpoof:
|
|
||||||
id = "device_spoof"
|
|
||||||
|
|
||||||
def __init__(self, profile_name="pixel6") -> None:
|
|
||||||
if profile_name not in PROFILES:
|
|
||||||
raise ValueError(f"Unknown profile '{profile_name}'. Choose from: {list(PROFILES.keys())}")
|
|
||||||
self.profile_name = profile_name
|
|
||||||
self.apply_props = PROFILES[profile_name]
|
|
||||||
|
|
||||||
def _read_cfg(self):
|
|
||||||
cfg = configparser.ConfigParser()
|
|
||||||
cfg.read("/var/lib/waydroid/waydroid.cfg")
|
|
||||||
if not cfg.has_section("properties"):
|
|
||||||
cfg.add_section("properties")
|
|
||||||
return cfg
|
|
||||||
|
|
||||||
def install(self):
|
|
||||||
cfg = self._read_cfg()
|
|
||||||
for key, value in self.apply_props.items():
|
|
||||||
cfg.set("properties", key, value)
|
|
||||||
with open("/var/lib/waydroid/waydroid.cfg", "w") as f:
|
|
||||||
cfg.write(f)
|
|
||||||
Logger.info(f"Device spoofed as '{self.profile_name}'. Restart Waydroid to apply.")
|
|
||||||
|
|
||||||
def uninstall(self):
|
|
||||||
cfg = self._read_cfg()
|
|
||||||
for key in PROP_KEYS:
|
|
||||||
cfg.remove_option("properties", key)
|
|
||||||
with open("/var/lib/waydroid/waydroid.cfg", "w") as f:
|
|
||||||
cfg.write(f)
|
|
||||||
Logger.info("Device spoof properties removed. Restart Waydroid to apply.")
|
|
||||||
Reference in New Issue
Block a user