You've already forked PlayIntegrityFork
mirror of
https://github.com/osm0sis/PlayIntegrityFork.git
synced 2025-09-06 06:37:06 +00:00
Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5cef27ffa9 | ||
|
|
6dffba43ab | ||
|
|
8558751cc7 | ||
|
|
0a216e0cd9 | ||
|
|
6506283874 | ||
|
|
8f06a06659 | ||
|
|
1b99917151 | ||
|
|
b92e80fbc6 | ||
|
|
ed8501d857 | ||
|
|
9c6f065bb6 | ||
|
|
ffd8d77d6f | ||
|
|
3c9c13e3ff | ||
|
|
bee383bb99 | ||
|
|
b4bdc5bafc | ||
|
|
58664b2294 | ||
|
|
cc74eebd33 | ||
|
|
b08dba14ea | ||
|
|
9cea06e64d | ||
|
|
4a14d97c24 | ||
|
|
dd44d2c1a8 |
4
.github/workflows/android.yml
vendored
4
.github/workflows/android.yml
vendored
@@ -16,13 +16,13 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out
|
- name: Check out
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Set up JDK
|
- name: Set up JDK
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 21
|
java-version: 21
|
||||||
|
|||||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,6 +1,9 @@
|
|||||||
[submodule "Dobby"]
|
[submodule "Dobby"]
|
||||||
path = app/src/main/cpp/Dobby
|
path = app/src/main/cpp/Dobby
|
||||||
url = https://github.com/JingMatrix/Dobby
|
url = https://github.com/JingMatrix/Dobby
|
||||||
|
[submodule "local_cxa_atexit_finalize_impl"]
|
||||||
|
path = app/src/main/cpp/local_cxa_atexit_finalize_impl
|
||||||
|
url = https://github.com/5ec1cff/local_cxa_atexit_finalize_impl
|
||||||
[submodule "json"]
|
[submodule "json"]
|
||||||
path = app/src/main/cpp/json
|
path = app/src/main/cpp/json
|
||||||
url = https://github.com/nlohmann/json
|
url = https://github.com/nlohmann/json
|
||||||
|
|||||||
16
README.md
16
README.md
@@ -6,7 +6,7 @@
|
|||||||
[](https://github.com/osm0sis/PlayIntegrityFork/releases/latest)
|
[](https://github.com/osm0sis/PlayIntegrityFork/releases/latest)
|
||||||
[](https://github.com/osm0sis/PlayIntegrityFork/releases)
|
[](https://github.com/osm0sis/PlayIntegrityFork/releases)
|
||||||
|
|
||||||
A Zygisk module which fixes "MEETS_DEVICE_INTEGRITY" for the Android <13 "deviceRecognitionVerdict" of the Play Integrity API. On Android 13+ ROMs this still helps to pass checks in Google Wallet and Google Messages RCS support.
|
A Zygisk module which fixes "MEETS_DEVICE_INTEGRITY" for the Android <13 "deviceRecognitionVerdict" of the Play Integrity API. On Android 13+ ROMs it still helps to pass checks in Google Wallet and Google Messages RCS support.
|
||||||
|
|
||||||
To use this module you must have one of the following (latest versions):
|
To use this module you must have one of the following (latest versions):
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ You can customize the included default [example.app_replace.list](https://raw.gi
|
|||||||
|
|
||||||
### About 'autopif2.sh' and 'killpi.sh' script files
|
### About 'autopif2.sh' and 'killpi.sh' script files
|
||||||
|
|
||||||
There's intentionally no pif.json in the module because the goal remains to be futureproof, and including something that may be banned/expired within days of release would be contrary to that goal. If you don't care to have your own private fingerprint to use or don't have time to look for one currently (since very few remain) then simply run the generation script from a root manager app that supports the module Action button, or by running autopif.sh from a file explorer app or with `sh autopif2.sh --strong --preview` in a root shell. For arm/x86 devices wget2 is required but may be installed via [addon module](https://xdaforums.com/t/tools-zips-scripts-osm0sis-odds-and-ends-multiple-devices-platforms.2239421/post-89991315).
|
There's intentionally no pif.json in the module because the goal remains to be futureproof, and including something that may be banned/expired within days of release would be contrary to that goal. If you don't care to have your own private fingerprint to use or don't have time to look for one currently (since very few remain) then simply run the generation script from a root manager app that supports the module Action button, or by running autopif.sh with the `-s -p` or `--strong --preview` arguments in a file explorer app or with `sh autopif2.sh --strong --preview` in a root shell. For arm/x86 devices wget2 is required but may be installed via [addon module](https://xdaforums.com/t/tools-zips-scripts-osm0sis-odds-and-ends-multiple-devices-platforms.2239421/post-89991315).
|
||||||
|
|
||||||
The autopif2 script generates a random device fingerprint from the latest Pixel Beta, ideally only to test an initial setup, since they expire roughly every 6 weeks from the Pixel Beta release date (dates included in the generated fingerprint), and the public mass-used ones from other modules or custom ROMs may also get banned, or may be banned for RCS use while otherwise passing Play Integrity in that time. In addition, unfortunately Pixel Beta fingerprints have changed and no longer pass DEVICE integrity, so can now only be used for STRONG integrity [setups](#about-spoofing-advanced-settings). Notable advanced command line arguments are: `-m` or `--match` matches the Pixel Beta fingerprint to the device when run on a current Pixel device; `-p` or `--preview` forces not to ignore Android Platform Preview builds (Developer Previews and Betas); and `-d #` or `--depth #` chooses the depth to crawl down the QPR Betas list when there are multiple active Betas, e.g. when QPR2 is concurrent with QPR1 the default value of 1 would get the first listed (QPR2) and `-d 2` would force it to get the second listed (QPR1).
|
The autopif2 script generates a random device fingerprint from the latest Pixel Beta, ideally only to test an initial setup, since they expire roughly every 6 weeks from the Pixel Beta release date (dates included in the generated fingerprint), and the public mass-used ones from other modules or custom ROMs may also get banned, or may be banned for RCS use while otherwise passing Play Integrity in that time. In addition, unfortunately Pixel Beta fingerprints have changed and no longer pass DEVICE integrity, so can now only be used for STRONG integrity [setups](#about-spoofing-advanced-settings). Notable advanced command line arguments are: `-m` or `--match` matches the Pixel Beta fingerprint to the device when run on a current Pixel device; `-p` or `--preview` forces not to ignore Android Platform Preview builds (Developer Previews and Betas); and `-d #` or `--depth #` chooses the depth to crawl down the QPR Betas list when there are multiple active Betas, e.g. when QPR2 is concurrent with QPR1 the default value of 1 would get the first listed (QPR2) and `-d 2` would force it to get the second listed (QPR1).
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ The killpi script forces the Google Play Services DroidGuard (com.google.android
|
|||||||
|
|
||||||
Make sure Google Play Services (com.google.android.gms) is NOT on the Magisk DenyList if Enforce DenyList is enabled since this interferes with the module; the module does prevent this using scripts but it only happens once during each reboot.
|
Make sure Google Play Services (com.google.android.gms) is NOT on the Magisk DenyList if Enforce DenyList is enabled since this interferes with the module; the module does prevent this using scripts but it only happens once during each reboot.
|
||||||
|
|
||||||
Note: To test <A13 PI verdicts on an A13+ ROM the spoofVendingSdk option in the custom.pif.json Advanced Settings must be temporarily enabled. Play Store must be fully set up before (and data not cleared during) enabling spoofVendingSdk or it and PI checks will only crash/hang, see the spoofing Advanced Settings section below.
|
Note: To test <A13 PI verdicts on an A13+ ROM the spoofVendingSdk option in the custom.pif.json Advanced Settings must be temporarily enabled. See the spoofing Advanced Settings section below.
|
||||||
|
|
||||||
### Failing BASIC integrity
|
### Failing BASIC integrity
|
||||||
|
|
||||||
@@ -127,7 +127,7 @@ Note: RCS is most easily checked using Gemini in Messages and usually clearing M
|
|||||||
### Failing Google Wallet Tap To Pay Setup Security Requirements
|
### Failing Google Wallet Tap To Pay Setup Security Requirements
|
||||||
|
|
||||||
- Reflash the module in your root manager app
|
- Reflash the module in your root manager app
|
||||||
- Ensure you are passing <A13 PI DEVICE or higher integrity
|
- Ensure you are passing <A13 PI DEVICE or higher integrity. Wallet requires this verdict even on A13+ ROMs as it is checked/enforced in the background.
|
||||||
- Clear Google Wallet (com.google.android.apps.walletnfcrel) and/or Google Pay (com.google.android.apps.nbu.paisa.user) cache, if you have them installed
|
- Clear Google Wallet (com.google.android.apps.walletnfcrel) and/or Google Pay (com.google.android.apps.nbu.paisa.user) cache, if you have them installed
|
||||||
- Clear Google Play Services (com.google.android.gms) cache and data, or, optionally skip clearing data and wait some time (24-72h) for it to resolve on its own
|
- Clear Google Play Services (com.google.android.gms) cache and data, or, optionally skip clearing data and wait some time (24-72h) for it to resolve on its own
|
||||||
- Reboot
|
- Reboot
|
||||||
@@ -153,15 +153,15 @@ The advanced spoofing options add granular control over what exactly gets spoofe
|
|||||||
<details>
|
<details>
|
||||||
<summary><strong>Details</strong></summary>
|
<summary><strong>Details</strong></summary>
|
||||||
|
|
||||||
- Adding the Advanced Settings entries are present by default from autopif2 or migrate (during installation), but may be added to any fingerprint by running migrate.sh with the `-f -a` or `--force --advanced` arguments in a file explorer app or with `sh migrate.sh --force --advanced` in a root shell. They may also be configured directly for Tricky Store to achieve <A13 PI STRONG or A13+ PI DEVICE/STRONG integrity (see below) by running autopif2.sh with the `-s -p` or `--strong --preview` arguments in a file explorer app or with `sh autopif2.sh --strong --preview` in a root shell. Other than for the "verboseLogs" entry (see above), they are all 0 (disabled) or 1 (enabled).
|
- The Advanced Settings entries are present by default from autopif2 or migrate (during installation), but may be added to any fingerprint by running migrate.sh with the `-f -a` or `--force --advanced` arguments in a file explorer app or with `sh migrate.sh --force --advanced` in a root shell. They may also be configured directly for Tricky Store to achieve <A13 PI STRONG or A13+ PI DEVICE/STRONG integrity (see below) by running autopif2.sh with the `-s -p` or `--strong --preview` arguments in a file explorer app or with `sh autopif2.sh --strong --preview` in a root shell. Other than for the "verboseLogs" entry (see above), they are all 0 (disabled) or 1 (enabled).
|
||||||
|
|
||||||
- The "spoofBuild" entry (default 1) controls spoofing the Build Fields from the fingerprint; the "spoofProps" entry (default 1) controls spoofing the System Properties from the fingerprint; the "spoofProvider" entry (default 1) controls spoofing the Keystore Provider; the "spoofSignature" entry (default 0) controls spoofing the ROM Signature, and the "spoofVendingSdk" entry (default 0) controls spoofing ROM SDK_INT/sdkVersion 32 to the Play Store (com.android.vending) to force Play Integrity to use the <A13 PI verdicts.
|
- The "spoofBuild" entry (default 1) controls spoofing the Build Fields from the fingerprint; the "spoofProps" entry (default 1) controls spoofing the System Properties from the fingerprint; the "spoofProvider" entry (default 1) controls spoofing the Keystore Provider; the "spoofSignature" entry (default 0) controls spoofing the ROM Signature, and the "spoofVendingSdk" entry (default 0) controls spoofing ROM SDK_INT/sdkVersion 32 to the Play Store (com.android.vending) to force Play Integrity to use the <A13 PI verdicts.
|
||||||
|
|
||||||
- Leaving spoofVendingSdk enabled is NOT recommended, it [will break](https://github.com/osm0sis/PlayIntegrityFork/pull/30) the behavior of the Play Store to some extent (back gesture/navbar button for all, account sign-in and downloads for higher original ROM SDK_INT) and could have other unintended effects like incorrect app variants being served, crashes, etc. One possible use case is with the [spoofVendingSdk QSTile](https://xdaforums.com/t/tricky-store-bootloader-keybox-spoofing.4683446/post-90118016) Tasker App to quickly toggle it on only as needed, then toggle it off again afterward.
|
- Leaving spoofVendingSdk enabled is NOT recommended, it [will break](https://github.com/osm0sis/PlayIntegrityFork/pull/30) the behavior of the Play Store to some extent (back gesture/navbar button for all, account sign-in and downloads for higher original ROM SDK_INT) and could have other unintended effects like incorrect app variants being served, crashes, etc. Play Store must be fully set up before (and data not cleared during) enabling spoofVendingSdk or it and PI checks will only crash/hang. One possible use case is with the [spoofVendingSdk QSTile](https://xdaforums.com/t/tricky-store-bootloader-keybox-spoofing.4683446/post-90118016) Tasker App to quickly toggle it on only as needed, then toggle it off again afterward.
|
||||||
|
|
||||||
- For spoofing locked bootloader and attempting to pass <A13 PI STRONG integrity, or A13+ PI DEVICE or STRONG integrity I only recommend using the latest official [Tricky Store](https://github.com/5ec1cff/TrickyStore) build.
|
- For spoofing locked bootloader and attempting to pass <A13 PI STRONG integrity, or A13+ PI DEVICE or STRONG integrity, I only recommend using the latest official [Tricky Store](https://github.com/5ec1cff/TrickyStore) or [Tricky Store OSS](https://github.com/beakthoven/TrickyStoreOSS) release.
|
||||||
|
|
||||||
- Note: Using Tricky Store to achieve <A13 PI STRONG integrtiy, or A13+ PI DEVICE or STRONG integrity (with an unrevoked hardware keybox.xml) requires the Advanced Settings "spoofProvider" disabled and the "\*.security_patch" entry commented out (unless spoofing a matching OS Patch Level with system= or all= in Tricky Store's security_patch.txt; autopif2 will do this automatically if security_patch.txt exists in the Tricky Store directory), but to achieve <A13 PI DEVICE integrity (with Tricky Store default AOSP software keybox.xml) requires at least "spoofProps" enabled, and some fingerprints may also require "spoofProvider" enabled, "\*.security_patch" entry uncommented and/or "\*api_level" entry set >25 (usually 26-32). More known working private fingerprints can achieve <A13 PI DEVICE/STRONG integrity on more devices using these Advanced Settings in conjunction with Tricky Store than was possible with Tricky Store alone since they require fingerprint props spoofing.
|
- Note: Using Tricky Store to achieve <A13 PI STRONG integrity (with an unrevoked hardware keybox.xml), requires the Advanced Settings "spoofProvider" disabled and sometimes the "\*.security_patch" entry commented out (often unless spoofing a matching OS Patch Level with system= or all= or Simple date in Tricky Store's security_patch.txt; autopif2 will do this automatically if security_patch.txt exists in the Tricky Store directory), and/or "\*api_level" entry set >25 (usually 26-32). To achieve <A13 PI DEVICE integrity (with Tricky Store default AOSP software keybox.xml) requires at least "spoofProps" enabled, and some fingerprints may also require "spoofProvider" enabled and/or "\*api_level" entry lowered to <26 (usually 21-25). More known working private fingerprints can achieve <A13 PI DEVICE/STRONG integrity on more devices using these Advanced Settings in conjunction with Tricky Store than was possible with Tricky Store alone since they require fingerprint props spoofing.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ find_package(cxx REQUIRED CONFIG)
|
|||||||
|
|
||||||
link_libraries(cxx::cxx)
|
link_libraries(cxx::cxx)
|
||||||
|
|
||||||
add_library(${CMAKE_PROJECT_NAME} SHARED ${CMAKE_SOURCE_DIR}/main.cpp)
|
add_library(${CMAKE_PROJECT_NAME} SHARED main.cpp local_cxa_atexit_finalize_impl/atexit.cpp)
|
||||||
|
|
||||||
add_subdirectory(Dobby)
|
add_subdirectory(Dobby)
|
||||||
|
|
||||||
|
|||||||
1
app/src/main/cpp/local_cxa_atexit_finalize_impl
Submodule
1
app/src/main/cpp/local_cxa_atexit_finalize_impl
Submodule
Submodule app/src/main/cpp/local_cxa_atexit_finalize_impl added at ab0dd0a64d
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
#define JSON_FILE_PATH "/data/adb/modules/playintegrityfix/pif.json"
|
#define JSON_FILE_PATH "/data/adb/modules/playintegrityfix/pif.json"
|
||||||
#define CUSTOM_JSON_FILE_PATH "/data/adb/modules/playintegrityfix/custom.pif.json"
|
#define CUSTOM_JSON_FILE_PATH "/data/adb/modules/playintegrityfix/custom.pif.json"
|
||||||
|
|
||||||
#define VENDING_PACKAGE "com.android.vending"
|
#define VENDING_PACKAGE "com.android.vending"
|
||||||
#define DROIDGUARD_PACKAGE "com.google.android.gms.unstable"
|
#define DROIDGUARD_PACKAGE "com.google.android.gms.unstable"
|
||||||
|
|
||||||
@@ -20,6 +21,7 @@ static int spoofBuild = 1;
|
|||||||
static int spoofProps = 1;
|
static int spoofProps = 1;
|
||||||
static int spoofProvider = 1;
|
static int spoofProvider = 1;
|
||||||
static int spoofSignature = 0;
|
static int spoofSignature = 0;
|
||||||
|
static int spoofVendingFinger = 0;
|
||||||
static int spoofVendingSdk = 0;
|
static int spoofVendingSdk = 0;
|
||||||
|
|
||||||
static std::map<std::string, std::string> jsonProps;
|
static std::map<std::string, std::string> jsonProps;
|
||||||
@@ -165,11 +167,11 @@ public:
|
|||||||
|
|
||||||
readJson();
|
readJson();
|
||||||
|
|
||||||
if (pkgName == VENDING_PACKAGE) spoofProps = spoofBuild = spoofProvider = spoofSignature = 0;
|
if (pkgName == VENDING_PACKAGE) spoofBuild = spoofProps = spoofProvider = spoofSignature = 0;
|
||||||
else spoofVendingSdk = 0;
|
else spoofVendingFinger = spoofVendingSdk = 0;
|
||||||
|
|
||||||
if (spoofProps > 0) doHook();
|
if (spoofProps > 0) doHook();
|
||||||
if (spoofBuild + spoofProvider + spoofSignature + spoofVendingSdk > 0) inject();
|
if (spoofBuild + spoofProvider + spoofSignature + spoofVendingFinger + spoofVendingSdk > 0) inject();
|
||||||
|
|
||||||
dexVector.clear();
|
dexVector.clear();
|
||||||
json.clear();
|
json.clear();
|
||||||
@@ -185,6 +187,7 @@ private:
|
|||||||
std::vector<char> dexVector;
|
std::vector<char> dexVector;
|
||||||
nlohmann::json json;
|
nlohmann::json json;
|
||||||
std::string pkgName;
|
std::string pkgName;
|
||||||
|
std::string vendingFingerprintValue;
|
||||||
|
|
||||||
void readJson() {
|
void readJson() {
|
||||||
LOGD("JSON contains %d keys!", static_cast<int>(json.size()));
|
LOGD("JSON contains %d keys!", static_cast<int>(json.size()));
|
||||||
@@ -200,7 +203,7 @@ private:
|
|||||||
json.erase("verboseLogs");
|
json.erase("verboseLogs");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Advanced spoofing settings
|
// Vending advanced spoofing settings
|
||||||
if (json.contains("spoofVendingSdk")) {
|
if (json.contains("spoofVendingSdk")) {
|
||||||
if (!json["spoofVendingSdk"].is_null() && json["spoofVendingSdk"].is_string() && json["spoofVendingSdk"] != "") {
|
if (!json["spoofVendingSdk"].is_null() && json["spoofVendingSdk"].is_string() && json["spoofVendingSdk"] != "") {
|
||||||
spoofVendingSdk = stoi(json["spoofVendingSdk"].get<std::string>());
|
spoofVendingSdk = stoi(json["spoofVendingSdk"].get<std::string>());
|
||||||
@@ -210,10 +213,29 @@ private:
|
|||||||
}
|
}
|
||||||
json.erase("spoofVendingSdk");
|
json.erase("spoofVendingSdk");
|
||||||
}
|
}
|
||||||
|
if (json.contains("spoofVendingFinger")) {
|
||||||
|
if (!json["spoofVendingFinger"].is_null() && json["spoofVendingFinger"].is_string() && json["spoofVendingFinger"] != "") {
|
||||||
|
if (json["spoofVendingFinger"].get<std::string>().find_first_not_of("01") != std::string::npos) {
|
||||||
|
spoofVendingFinger = 1;
|
||||||
|
vendingFingerprintValue = json["spoofVendingFinger"].get<std::string>();
|
||||||
|
} else if (json.contains("FINGERPRINT") && !json["FINGERPRINT"].is_null() && json["FINGERPRINT"].is_string() && json["FINGERPRINT"] != "") {
|
||||||
|
spoofVendingFinger = stoi(json["spoofVendingFinger"].get<std::string>());
|
||||||
|
vendingFingerprintValue = json["FINGERPRINT"].get<std::string>();
|
||||||
|
} else {
|
||||||
|
LOGD("Error parsing spoofVendingFinger or FINGERPRINT field!");
|
||||||
|
}
|
||||||
|
if (verboseLogs > 0) LOGD("Spoofing Fingerprint in Play Store %s!", (spoofVendingFinger > 0) ? "enabled" : "disabled");
|
||||||
|
} else {
|
||||||
|
LOGD("Error parsing spoofVendingFinger!");
|
||||||
|
}
|
||||||
|
json.erase("spoofVendingFinger");
|
||||||
|
}
|
||||||
if (pkgName == VENDING_PACKAGE) {
|
if (pkgName == VENDING_PACKAGE) {
|
||||||
json.clear();
|
json.clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DroidGuard advanced spoofing settings
|
||||||
if (json.contains("spoofBuild")) {
|
if (json.contains("spoofBuild")) {
|
||||||
if (!json["spoofBuild"].is_null() && json["spoofBuild"].is_string() && json["spoofBuild"] != "") {
|
if (!json["spoofBuild"].is_null() && json["spoofBuild"].is_string() && json["spoofBuild"] != "") {
|
||||||
spoofBuild = stoi(json["spoofBuild"].get<std::string>());
|
spoofBuild = stoi(json["spoofBuild"].get<std::string>());
|
||||||
@@ -299,8 +321,10 @@ private:
|
|||||||
|
|
||||||
if (pkgName == VENDING_PACKAGE) {
|
if (pkgName == VENDING_PACKAGE) {
|
||||||
LOGD("JNI %s: Calling EntryPointVending.init", niceName);
|
LOGD("JNI %s: Calling EntryPointVending.init", niceName);
|
||||||
auto entryInit = env->GetStaticMethodID(entryClass, "init", "(II)V");
|
auto entryInit = env->GetStaticMethodID(entryClass, "init", "(IIILjava/lang/String;)V");
|
||||||
env->CallStaticVoidMethod(entryClass, entryInit, verboseLogs, spoofVendingSdk);
|
auto javaStr = env->NewStringUTF(vendingFingerprintValue.c_str());
|
||||||
|
env->CallStaticVoidMethod(entryClass, entryInit, verboseLogs, spoofVendingFinger, spoofVendingSdk, javaStr);
|
||||||
|
env->DeleteLocalRef(javaStr);
|
||||||
} else {
|
} else {
|
||||||
LOGD("JNI %s: Sending JSON", niceName);
|
LOGD("JNI %s: Sending JSON", niceName);
|
||||||
auto receiveJson = env->GetStaticMethodID(entryClass, "receiveJson", "(Ljava/lang/String;)V");
|
auto receiveJson = env->GetStaticMethodID(entryClass, "receiveJson", "(Ljava/lang/String;)V");
|
||||||
@@ -310,7 +334,15 @@ private:
|
|||||||
LOGD("JNI %s: Calling EntryPoint.init", niceName);
|
LOGD("JNI %s: Calling EntryPoint.init", niceName);
|
||||||
auto entryInit = env->GetStaticMethodID(entryClass, "init", "(IIII)V");
|
auto entryInit = env->GetStaticMethodID(entryClass, "init", "(IIII)V");
|
||||||
env->CallStaticVoidMethod(entryClass, entryInit, verboseLogs, spoofBuild, spoofProvider, spoofSignature);
|
env->CallStaticVoidMethod(entryClass, entryInit, verboseLogs, spoofBuild, spoofProvider, spoofSignature);
|
||||||
|
env->DeleteLocalRef(javaStr);
|
||||||
}
|
}
|
||||||
|
env->DeleteLocalRef(clClass);
|
||||||
|
env->DeleteLocalRef(systemClassLoader);
|
||||||
|
env->DeleteLocalRef(dexClClass);
|
||||||
|
env->DeleteLocalRef(buffer);
|
||||||
|
env->DeleteLocalRef(dexCl);
|
||||||
|
env->DeleteLocalRef(entryClassName);
|
||||||
|
env->DeleteLocalRef(entryClassObj);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,30 @@ public final class EntryPointVending {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("DefaultLocale")
|
@SuppressLint("DefaultLocale")
|
||||||
public static void init(int verboseLogs, int spoofVendingSdk) {
|
public static void init(int verboseLogs, int spoofVendingFinger, int spoofVendingSdk, String vendingFingerprintValue) {
|
||||||
if (spoofVendingSdk < 1) return;
|
// Only spoof FINGERPRINT to Play Store if not forcing Android <13 Play Integrity verdict
|
||||||
|
if (spoofVendingSdk < 1) {
|
||||||
|
if (spoofVendingFinger < 1) return;
|
||||||
|
String oldValue;
|
||||||
|
try {
|
||||||
|
Field field = Build.class.getDeclaredField("FINGERPRINT");
|
||||||
|
field.setAccessible(true);
|
||||||
|
oldValue = String.valueOf(field.get(null));
|
||||||
|
if (oldValue.equals(vendingFingerprintValue)) {
|
||||||
|
if (verboseLogs > 2) LOG(String.format("[FINGERPRINT]: %s (unchanged)", oldValue));
|
||||||
|
field.setAccessible(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
field.set(null, vendingFingerprintValue);
|
||||||
|
field.setAccessible(false);
|
||||||
|
LOG(String.format("[FINGERPRINT]: %s -> %s", oldValue, vendingFingerprintValue));
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
LOG("FINGERPRINT field not found: " + e);
|
||||||
|
} catch (SecurityException | IllegalAccessException | IllegalArgumentException |
|
||||||
|
NullPointerException | ExceptionInInitializerError e) {
|
||||||
|
LOG("FINGERPRINT field not accessible: " + e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
int requestSdk = spoofVendingSdk == 1 ? 32 : spoofVendingSdk;
|
int requestSdk = spoofVendingSdk == 1 ? 32 : spoofVendingSdk;
|
||||||
int targetSdk = Math.min(Build.VERSION.SDK_INT, requestSdk);
|
int targetSdk = Math.min(Build.VERSION.SDK_INT, requestSdk);
|
||||||
int oldValue;
|
int oldValue;
|
||||||
@@ -34,7 +56,7 @@ public final class EntryPointVending {
|
|||||||
} catch (SecurityException | IllegalAccessException | IllegalArgumentException |
|
} catch (SecurityException | IllegalAccessException | IllegalArgumentException |
|
||||||
NullPointerException | ExceptionInInitializerError e) {
|
NullPointerException | ExceptionInInitializerError e) {
|
||||||
LOG("SDK_INT field not accessible: " + e);
|
LOG("SDK_INT field not accessible: " + e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("com.android.application") version "8.11.1" apply false
|
id("com.android.application") version "8.13.0" apply false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
# any settings specified in this file.
|
# any settings specified in this file.
|
||||||
# For more details on how to configure your build environment visit
|
# For more details on how to configure your build environment visit
|
||||||
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
||||||
|
# Enable the configuration cache persistently
|
||||||
|
org.gradle.configuration-cache=true
|
||||||
# Specifies the JVM arguments used for the daemon process.
|
# Specifies the JVM arguments used for the daemon process.
|
||||||
# The setting is particularly useful for tweaking memory settings.
|
# The setting is particularly useful for tweaking memory settings.
|
||||||
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
|
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
|
||||||
|
|||||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
2
gradlew
vendored
2
gradlew
vendored
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
#
|
#
|
||||||
# Copyright © 2015-2021 the original authors.
|
# Copyright © 2015 the original authors.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ MODPATH="${0%/*}"
|
|||||||
set +o standalone
|
set +o standalone
|
||||||
unset ASH_STANDALONE
|
unset ASH_STANDALONE
|
||||||
|
|
||||||
sh $MODPATH/autopif2.sh -s -m -p || exit 1
|
sh $MODPATH/autopif2.sh -s -m || exit 1
|
||||||
|
|
||||||
echo -e "\nDone!"
|
echo -e "\nDone!"
|
||||||
|
|
||||||
|
|||||||
@@ -7,14 +7,15 @@ case "$HOME" in
|
|||||||
*termux*) echo "autopif2: need su root environment"; exit 1;;
|
*termux*) echo "autopif2: need su root environment"; exit 1;;
|
||||||
esac;
|
esac;
|
||||||
|
|
||||||
|
FORCE_TOP=1;
|
||||||
FORCE_DEPTH=1;
|
FORCE_DEPTH=1;
|
||||||
until [ -z "$1" ]; do
|
until [ -z "$1" ]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
-h|--help|help) echo "sh autopif2.sh [-a|-s] [-m] [-p] [-d #]"; exit 0;;
|
-h|--help|help) echo "sh autopif2.sh [-a|-s] [-m] [-t #] [-d #]"; exit 0;;
|
||||||
-a|--advanced|advanced) ARGS="-a"; shift;;
|
-a|--advanced|advanced) ARGS="-a"; shift;;
|
||||||
-s|--strong|strong) ARGS="-a"; PATCH_COMMENT=1; spoofProvider=0; shift;;
|
-s|--strong|strong) ARGS="-a"; PATCH_COMMENT=1; spoofProvider=0; shift;;
|
||||||
-m|--match|match) FORCE_MATCH=1; shift;;
|
-m|--match|match) FORCE_MATCH=1; shift;;
|
||||||
-p|--preview|preview) FORCE_PREVIEW=1; shift;;
|
-t|--top|top) echo "$2" | grep -q '^[1-9]$' || exit 1; FORCE_TOP=$2; shift 2;;
|
||||||
-d|--depth|depth) echo "$2" | grep -q '^[1-9]$' || exit 1; FORCE_DEPTH=$2; shift 2;;
|
-d|--depth|depth) echo "$2" | grep -q '^[1-9]$' || exit 1; FORCE_DEPTH=$2; shift 2;;
|
||||||
*) break;;
|
*) break;;
|
||||||
esac;
|
esac;
|
||||||
@@ -80,15 +81,9 @@ cd "$DIR";
|
|||||||
|
|
||||||
item "Crawling Android Developers for latest Pixel Beta ...";
|
item "Crawling Android Developers for latest Pixel Beta ...";
|
||||||
wget -q -O PIXEL_VERSIONS_HTML --no-check-certificate https://developer.android.com/about/versions 2>&1 || exit 1;
|
wget -q -O PIXEL_VERSIONS_HTML --no-check-certificate https://developer.android.com/about/versions 2>&1 || exit 1;
|
||||||
wget -q -O PIXEL_LATEST_HTML --no-check-certificate $(grep -o 'https://developer.android.com/about/versions/.*[0-9]"' PIXEL_VERSIONS_HTML | sort -ru | cut -d\" -f1 | head -n1) 2>&1 || exit 1;
|
wget -q -O PIXEL_LATEST_HTML --no-check-certificate $(grep -o 'https://developer.android.com/about/versions/.*[0-9]"' PIXEL_VERSIONS_HTML | sort -ru | cut -d\" -f1 | head -n$FORCE_TOP | tail -n1) 2>&1 || exit 1;
|
||||||
if grep -qE 'Developer Preview|tooltip>.*preview program' PIXEL_LATEST_HTML && [ ! "$FORCE_PREVIEW" ]; then
|
wget -q -O PIXEL_OTA_HTML --no-check-certificate https://developer.android.com$(grep -o 'href=".*download-ota.*"' PIXEL_LATEST_HTML | grep 'qpr' | cut -d\" -f2 | head -n$FORCE_DEPTH | tail -n1) 2>&1 || exit 1;
|
||||||
wget -q -O PIXEL_BETA_HTML --no-check-certificate $(grep -o 'https://developer.android.com/about/versions/.*[0-9]"' PIXEL_VERSIONS_HTML | sort -ru | cut -d\" -f1 | head -n2 | tail -n1) 2>&1 || exit 1;
|
echo "$(grep -m1 -oE 'tooltip>Android .*[0-9]' PIXEL_OTA_HTML | cut -d\> -f2) $(grep -oE 'tooltip>QPR.* Beta' PIXEL_OTA_HTML | cut -d\> -f2 | head -n$FORCE_DEPTH | tail -n1)";
|
||||||
else
|
|
||||||
TITLE="Preview ";
|
|
||||||
mv -f PIXEL_LATEST_HTML PIXEL_BETA_HTML;
|
|
||||||
fi;
|
|
||||||
wget -q -O PIXEL_OTA_HTML --no-check-certificate https://developer.android.com$(grep -o 'href=".*download-ota.*"' PIXEL_BETA_HTML | cut -d\" -f2 | head -n$FORCE_DEPTH | tail -n1) 2>&1 || exit 1;
|
|
||||||
echo "$(grep -m1 -oE 'tooltip>Android .*[0-9]' PIXEL_OTA_HTML | cut -d\> -f2) $TITLE$(grep -oE 'tooltip>QPR.* Beta' PIXEL_OTA_HTML | cut -d\> -f2 | head -n$FORCE_DEPTH | tail -n1)";
|
|
||||||
|
|
||||||
BETA_REL_DATE="$(date -D '%B %e, %Y' -d "$(grep -m1 -A1 'Release date' PIXEL_OTA_HTML | tail -n1 | sed 's;.*<td>\(.*\)</td>.*;\1;')" '+%Y-%m-%d')";
|
BETA_REL_DATE="$(date -D '%B %e, %Y' -d "$(grep -m1 -A1 'Release date' PIXEL_OTA_HTML | tail -n1 | sed 's;.*<td>\(.*\)</td>.*;\1;')" '+%Y-%m-%d')";
|
||||||
BETA_EXP_DATE="$(date -D '%s' -d "$(($(date -D '%Y-%m-%d' -d "$BETA_REL_DATE" '+%s') + 60 * 60 * 24 * 7 * 6))" '+%Y-%m-%d')";
|
BETA_EXP_DATE="$(date -D '%s' -d "$(($(date -D '%Y-%m-%d' -d "$BETA_REL_DATE" '+%s') + 60 * 60 * 24 * 7 * 6))" '+%Y-%m-%d')";
|
||||||
@@ -167,7 +162,7 @@ if [ -f "$MIGRATE" ]; then
|
|||||||
if [ -n "$ARGS" ]; then
|
if [ -n "$ARGS" ]; then
|
||||||
grep_json() { [ -f "$2" ] && grep -m1 "$1" $2 | cut -d\" -f4; }
|
grep_json() { [ -f "$2" ] && grep -m1 "$1" $2 | cut -d\" -f4; }
|
||||||
verboseLogs=$(grep_json "VERBOSE_LOGS" $OLDJSON);
|
verboseLogs=$(grep_json "VERBOSE_LOGS" $OLDJSON);
|
||||||
ADVSETTINGS="spoofBuild spoofProps spoofProvider spoofSignature spoofVendingSdk verboseLogs";
|
ADVSETTINGS="spoofBuild spoofProps spoofProvider spoofSignature spoofVendingFinger spoofVendingSdk verboseLogs";
|
||||||
for SETTING in $ADVSETTINGS; do
|
for SETTING in $ADVSETTINGS; do
|
||||||
eval [ -z \"\$$SETTING\" ] \&\& $SETTING=$(grep_json "$SETTING" $OLDJSON);
|
eval [ -z \"\$$SETTING\" ] \&\& $SETTING=$(grep_json "$SETTING" $OLDJSON);
|
||||||
eval TMPVAL=\$$SETTING;
|
eval TMPVAL=\$$SETTING;
|
||||||
|
|||||||
@@ -39,12 +39,14 @@ if [ -d "$MODPATH/zygisk" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Migrate custom.pif.json to latest defaults if needed
|
# Migrate custom.pif.json to latest defaults if needed
|
||||||
if [ -f "$MODPATH/custom.pif.json" ] && ! grep -q "api_level" $MODPATH/custom.pif.json || ! grep -q "verboseLogs" $MODPATH/custom.pif.json || ! grep -q "spoofVendingSdk" $MODPATH/custom.pif.json; then
|
if [ -f "$MODPATH/custom.pif.json" ]; then
|
||||||
|
if ! grep -q "api_level" $MODPATH/custom.pif.json || ! grep -q "verboseLogs" $MODPATH/custom.pif.json || ! grep -q "spoofVendingFinger" $MODPATH/custom.pif.json; then
|
||||||
ui_print "- Running migration script on custom.pif.json:"
|
ui_print "- Running migration script on custom.pif.json:"
|
||||||
ui_print " "
|
ui_print " "
|
||||||
chmod 755 $MODPATH/migrate.sh
|
chmod 755 $MODPATH/migrate.sh
|
||||||
sh $MODPATH/migrate.sh --install --force --advanced $MODPATH/custom.pif.json
|
sh $MODPATH/migrate.sh --install --force --advanced $MODPATH/custom.pif.json
|
||||||
ui_print " "
|
ui_print " "
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Clean up any leftover files from previous deprecated methods
|
# Clean up any leftover files from previous deprecated methods
|
||||||
|
|||||||
@@ -11,9 +11,11 @@
|
|||||||
/system/app/EliteDevelopmentModule
|
/system/app/EliteDevelopmentModule
|
||||||
/system/app/XInjectModule
|
/system/app/XInjectModule
|
||||||
|
|
||||||
# helluvaOS, hentaiOS
|
# helluvaOS
|
||||||
/system_ext/app/helluvaProductDevice*
|
/system_ext/app/helluvaProductDevice*
|
||||||
/system_ext/app/helluvaProductSecretStub
|
/system_ext/app/helluvaProductSecretStub
|
||||||
|
|
||||||
|
# hentaiOS
|
||||||
/system_ext/app/hentaiLewdbSVTDummy
|
/system_ext/app/hentaiLewdbSVTDummy
|
||||||
|
|
||||||
# Evolution X
|
# Evolution X
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
"spoofProps": "1",
|
"spoofProps": "1",
|
||||||
"spoofProvider": "1",
|
"spoofProvider": "1",
|
||||||
"spoofSignature": "0",
|
"spoofSignature": "0",
|
||||||
|
"spoofVendingFinger": "0",
|
||||||
"spoofVendingSdk": "0",
|
"spoofVendingSdk": "0",
|
||||||
"verboseLogs": "0"
|
"verboseLogs": "0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -114,12 +114,13 @@ if [ -z "$DEVICE_INITIAL_SDK_INT" -o "$DEVICE_INITIAL_SDK_INT" = "null" ]; then
|
|||||||
DEVICE_INITIAL_SDK_INT=25;
|
DEVICE_INITIAL_SDK_INT=25;
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
ADVSETTINGS="spoofBuild spoofProps spoofProvider spoofSignature spoofVendingSdk verboseLogs";
|
ADVSETTINGS="spoofBuild spoofProps spoofProvider spoofSignature spoofVendingFinger spoofVendingSdk verboseLogs";
|
||||||
|
|
||||||
spoofBuild=1;
|
spoofBuild=1;
|
||||||
spoofProps=1;
|
spoofProps=1;
|
||||||
spoofProvider=1;
|
spoofProvider=1;
|
||||||
spoofSignature=0;
|
spoofSignature=0;
|
||||||
|
spoofVendingFinger=0;
|
||||||
spoofVendingSdk=0;
|
spoofVendingSdk=0;
|
||||||
verboseLogs=0;
|
verboseLogs=0;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
id=playintegrityfix
|
id=playintegrityfix
|
||||||
name=Play Integrity Fork
|
name=Play Integrity Fork
|
||||||
version=v14
|
version=v14
|
||||||
versionCode=140000
|
versionCode=140001
|
||||||
author=osm0sis & chiteroman @ xda-developers
|
author=osm0sis & chiteroman @ xda-developers
|
||||||
description=Fix <A13 Play Integrity DEVICE verdict
|
description=Fix <A13 Play Integrity DEVICE verdict
|
||||||
updateJson=https://raw.githubusercontent.com/osm0sis/PlayIntegrityFork/main/update.json
|
updateJson=https://raw.githubusercontent.com/osm0sis/PlayIntegrityFork/main/update.json
|
||||||
|
|||||||
Reference in New Issue
Block a user