forked from sim1222-mirror/wrapper
add arm64
This commit is contained in:
parent
ca1f26a950
commit
b19efdd267
61
.github/workflows/build-for-arm64.yml
vendored
Normal file
61
.github/workflows/build-for-arm64.yml
vendored
Normal file
@ -0,0 +1,61 @@
|
||||
name: Build for arm64
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "arm64" ]
|
||||
pull_request:
|
||||
branches: [ "arm64" ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install aria2
|
||||
run: sudo apt install aria2 -y
|
||||
|
||||
- name: Install LLVM
|
||||
run: sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
|
||||
|
||||
- name: Install cross complier
|
||||
run: sudo apt install gcc-aarch64-linux-gnu -y
|
||||
|
||||
- name: Set up Android NDK r23b
|
||||
run: |
|
||||
aria2c -o android-ndk-r23b-linux.zip https://dl.google.com/android/repository/android-ndk-r23b-linux.zip
|
||||
unzip -q -d ~ android-ndk-r23b-linux.zip
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make
|
||||
|
||||
- name: Set outputs
|
||||
id: vars
|
||||
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Wrapper.arm64.${{ steps.vars.outputs.sha_short }}
|
||||
include-hidden-files: true
|
||||
path: |
|
||||
rootfs
|
||||
wrapper
|
||||
|
||||
- name: Create Release Zip File
|
||||
run: zip -r Wrapper.arm64.${{ steps.vars.outputs.sha_short }}.zip rootfs/ wrapper
|
||||
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
files: Wrapper.arm64.${{ steps.vars.outputs.sha_short }}.zip
|
||||
body: ${{ github.event.head_commit.message }}
|
||||
prerelease: true
|
||||
name: Wrapper.arm64.${{ steps.vars.outputs.sha_short }}
|
||||
tag_name: arm64
|
3
.github/workflows/build.yml
vendored
3
.github/workflows/build.yml
vendored
@ -27,6 +27,9 @@ jobs:
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make
|
||||
|
||||
- name: Set outputs
|
||||
|
2
.github/workflows/wrapper-qemu.yml
vendored
2
.github/workflows/wrapper-qemu.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Download wrapper-qemu basic image
|
||||
run: wget https://github.com/zhaarey/wrapper/releases/download/wrapper-qemu/wrapper.qcow2
|
||||
run: wget https://github.com/WorldObservationLog/wrapper/releases/download/wrapper-qemu/wrapper.qcow2
|
||||
|
||||
- name: Mount image
|
||||
run: |
|
||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -89,3 +89,4 @@ rootfs/
|
||||
.vscode/
|
||||
wrapper
|
||||
rootfs/system/bin/linker64
|
||||
build/
|
58
CMakeLists.txt
Normal file
58
CMakeLists.txt
Normal file
@ -0,0 +1,58 @@
|
||||
cmake_minimum_required(VERSION 3.25)
|
||||
|
||||
project(wrapper)
|
||||
include(ExternalProject)
|
||||
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
|
||||
set(ANDROID_NDK_PATH "$ENV{HOME}/android-ndk-r23b")
|
||||
set(TOOLCHAIN "${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64")
|
||||
|
||||
set(CMAKE_C_COMPILER "${TOOLCHAIN}/bin/aarch64-linux-android22-clang")
|
||||
set(CMAKE_CXX_COMPILER "${TOOLCHAIN}/bin/aarch64-linux-android22-clang++")
|
||||
set(C_COMPILER "${TOOLCHAIN}/bin/clang")
|
||||
|
||||
set(CMAKE_C_FLAGS "-Wall -Werror -O3")
|
||||
set(CMAKE_CXX_FLAGS "-Wall -Werror -O3")
|
||||
|
||||
set(CMDLINE_SOURCE cmdline.c)
|
||||
set(HANDLE_SOURCE main.cpp)
|
||||
set(MAIN_SOURCE main.c)
|
||||
set(WRAPPER_SOURCE wrapper.c)
|
||||
|
||||
add_library(cmdline_object OBJECT ${CMDLINE_SOURCE})
|
||||
add_library(handle_object OBJECT ${HANDLE_SOURCE})
|
||||
|
||||
add_executable(main ${MAIN_SOURCE} $<TARGET_OBJECTS:cmdline_object> $<TARGET_OBJECTS:handle_object>)
|
||||
|
||||
set_target_properties(main PROPERTIES
|
||||
COMPILE_DEFINITIONS "MyRelease"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/rootfs/system/bin"
|
||||
)
|
||||
|
||||
find_library(ANDROIDAPPMUSIC_LIB androidappmusic PATHS ${CMAKE_SOURCE_DIR}/rootfs/system/lib64)
|
||||
find_library(STORESERVICESCORE_LIB storeservicescore PATHS ${CMAKE_SOURCE_DIR}/rootfs/system/lib64)
|
||||
find_library(MEDIAPLATFORM_LIB mediaplatform PATHS ${CMAKE_SOURCE_DIR}/rootfs/system/lib64)
|
||||
find_library(CXX_SHARED_LIB c++_shared PATHS ${CMAKE_SOURCE_DIR}/rootfs/system/lib64)
|
||||
|
||||
# Link libraries
|
||||
target_link_libraries(main
|
||||
${CXX_SHARED_LIB}
|
||||
${ANDROIDAPPMUSIC_LIB}
|
||||
${STORESERVICESCORE_LIB}
|
||||
${MEDIAPLATFORM_LIB}
|
||||
)
|
||||
|
||||
link_directories(${CMAKE_SOURCE_DIR}/rootfs/system/lib64)
|
||||
|
||||
ExternalProject_Add(
|
||||
wrapper
|
||||
PREFIX ${CMAKE_BINARY_DIR}
|
||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND aarch64-linux-gnu-gcc -o wrapper ${WRAPPER_SOURCE}
|
||||
BUILD_IN_SOURCE 1
|
||||
INSTALL_COMMAND ""
|
||||
DEPENDS main
|
||||
)
|
55
README.md
55
README.md
@ -1,47 +1,26 @@
|
||||
## Wrapper
|
||||
# wrapper
|
||||
A tool to decrypt Apple Music's music. An active subscription is still needed.
|
||||
|
||||
No need for an Android emulator to decrypt ALAC files. All files from anonymous.
|
||||
Only support Linux x86_64 and arm64.
|
||||
|
||||
### Recommended Environment
|
||||
#### x86_64 only
|
||||
For best results, it's recommended to use **Windows Subsystem for Linux (WSL)**.
|
||||
# Install
|
||||
Get the pre-built version from this project's Actions.
|
||||
|
||||
---
|
||||
Or you can refer to the Actions configuration file for compilation.
|
||||
|
||||
### Version 2
|
||||
# Usage
|
||||
```
|
||||
Usage: wrapper [OPTION]...
|
||||
|
||||
#### Usage:
|
||||
```shell
|
||||
./wrapper [OPTION]...
|
||||
-h, --help Print help and exit
|
||||
-V, --version Print version and exit
|
||||
-H, --host=STRING (default: `127.0.0.1`)
|
||||
-D, --decrypt-port=INT (default: `10020`)
|
||||
-M, --m3u8-port=INT (default: `20020`)
|
||||
-P, --proxy=STRING (default: `''`)
|
||||
-L, --login=STRING ([username]:[password])
|
||||
```
|
||||
#### Installation:
|
||||
```shell
|
||||
sudo -i
|
||||
wget "https://github.com/zhaarey/wrapper/releases/download/linux.V2/wrapper.linux.x86_64.V2.tar.gz"
|
||||
mkdir wrapper
|
||||
tar -xzf wrapper.linux.x86_64.V2.tar.gz -C wrapper
|
||||
cd wrapper
|
||||
./wrapper
|
||||
-H, --host=STRING (default=`127.0.0.1')
|
||||
-D, --decrypt-port=INT (default=`10020')
|
||||
-M, --m3u8-port=INT (default=`20020')
|
||||
-P, --proxy=STRING (default=`')
|
||||
-L, --login=STRING (username:password)
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
### Version 1
|
||||
#### Usage:
|
||||
`./wrapper [port] ([username] [password])`
|
||||
#### Installation:
|
||||
```shell
|
||||
sudo -i
|
||||
wget "https://github.com/zhaarey/wrapper/releases/download/linux/wrapper.linux.x86_64.tar.gz"
|
||||
mkdir wrapper
|
||||
tar -xzf wrapper.linux.x86_64.tar.gz -C wrapper
|
||||
cd wrapper
|
||||
./wrapper
|
||||
```
|
||||
# Special thanks
|
||||
- Anonymous, for providing the original version of this project and the legacy Frida decryption method.
|
||||
- chocomint, for providing support for arm64 arch.
|
544
import.h
544
import.h
@ -1,290 +1,288 @@
|
||||
#pragma once
|
||||
|
||||
struct shared_ptr {
|
||||
void *obj;
|
||||
void *ctrl_blk;
|
||||
};
|
||||
|
||||
union std_string {
|
||||
struct {
|
||||
uint8_t mark;
|
||||
char str[0];
|
||||
};
|
||||
struct {
|
||||
size_t cap;
|
||||
size_t size;
|
||||
const char *data;
|
||||
};
|
||||
};
|
||||
|
||||
struct std_vector {
|
||||
void *begin;
|
||||
void *end;
|
||||
void *end_capacity;
|
||||
};
|
||||
|
||||
static inline union std_string new_std_string(const char *s) {
|
||||
union std_string str = {
|
||||
.cap = 1,
|
||||
.size = strlen(s),
|
||||
.data = s,
|
||||
};
|
||||
return str;
|
||||
}
|
||||
|
||||
static inline struct std_vector new_std_vector(void *begin) {
|
||||
struct std_vector vector = {
|
||||
.begin = begin,
|
||||
.end = begin + 1,
|
||||
};
|
||||
vector.end_capacity = vector.end;
|
||||
return vector;
|
||||
}
|
||||
|
||||
static inline union std_string new_std_string_short_mode(const char *str) {
|
||||
short str_size = strlen(str);
|
||||
union std_string std_str = {
|
||||
.mark = str_size << 1,
|
||||
};
|
||||
strcpy(std_str.str, str);
|
||||
return std_str;
|
||||
}
|
||||
|
||||
static inline const char *std_string_data(union std_string *str) {
|
||||
if ((str->mark & 1) == 0) {
|
||||
return str->str;
|
||||
}
|
||||
return str->data;
|
||||
}
|
||||
|
||||
extern void _ZN20androidstoreservices30SVSubscriptionStatusMgrFactory6createEv(struct shared_ptr *);
|
||||
extern void
|
||||
_ZN20androidstoreservices27SVSubscriptionStatusMgrImpl33checkSubscriptionStatusFromSourceERKNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEEERKNS_23SVSubscriptionStatusMgr26SVSubscriptionStatusSourceE(
|
||||
struct shared_ptr *, void *, struct shared_ptr *, int *);
|
||||
extern void
|
||||
_ZN17storeservicescore14RequestContext24setFairPlayDirectoryPathERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
#include <stdint.h>
|
||||
#include "structs.h"
|
||||
|
||||
extern void _resolv_set_nameservers_for_net(unsigned netid, const char **servers, int numservers, const char *domains);
|
||||
|
||||
extern void
|
||||
_ZN14FootHillConfig6configERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE(union std_string *);
|
||||
// --- dialog / interface ---
|
||||
extern union std_string *_ZNK17storeservicescore14ProtocolDialog5titleEv(void *);
|
||||
extern void *_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore22ProtocolDialogResponseENS_9allocatorIS2_EEEE;
|
||||
extern void _ZN17storeservicescore22ProtocolDialogResponseC1Ev(void *);
|
||||
extern struct std_vector *_ZNK17storeservicescore14ProtocolDialog7buttonsEv(void *);
|
||||
extern union std_string *_ZNK17storeservicescore14ProtocolButton5titleEv(void *);
|
||||
extern union std_string *_ZNK17storeservicescore14ProtocolDialog7messageEv(void *);
|
||||
extern union std_string *_ZNK17storeservicescore18CredentialsRequest5titleEv(void *);
|
||||
extern union std_string *_ZNK17storeservicescore18CredentialsRequest7messageEv(void *);
|
||||
extern void _ZN17storeservicescore19CredentialsResponseC1Ev(void *);
|
||||
extern void _ZN17storeservicescore22ProtocolDialogResponse17setSelectedButtonERKNSt6__ndk110shared_ptrINS_14ProtocolButtonEEE(void *, struct shared_ptr *);
|
||||
extern void _ZN20androidstoreservices28AndroidPresentationInterface28handleProtocolDialogResponseERKlRKNSt6__ndk110shared_ptrIN17storeservicescore22ProtocolDialogResponseEEE(void *, long *, struct shared_ptr *);
|
||||
|
||||
extern void
|
||||
_ZNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEE11make_sharedIJRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEES3_DpOT_(
|
||||
struct shared_ptr *, union std_string *);
|
||||
extern void _ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_(
|
||||
struct shared_ptr *);
|
||||
// --- credentials ---
|
||||
extern uint8_t _ZNK17storeservicescore18CredentialsRequest28requiresHSA2VerificationCodeEv(void *);
|
||||
extern void *_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore19CredentialsResponseENS_9allocatorIS2_EEEE;
|
||||
extern void _ZN17storeservicescore19CredentialsResponse11setUserNameERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN17storeservicescore19CredentialsResponse11setPasswordERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN17storeservicescore19CredentialsResponse15setResponseTypeENS0_12ResponseTypeE(void *, int responseType);
|
||||
extern void _ZN20androidstoreservices28AndroidPresentationInterface25handleCredentialsResponseERKNSt6__ndk110shared_ptrIN17storeservicescore19CredentialsResponseEEE(void *, struct shared_ptr *);
|
||||
|
||||
extern void
|
||||
_ZN20androidstoreservices28AndroidPresentationInterface16setDialogHandlerEPFvlNSt6__ndk110shared_ptrIN17storeservicescore14ProtocolDialogEEENS2_INS_36AndroidProtocolDialogResponseHandlerEEEE(
|
||||
void *, void (*)(long, struct shared_ptr *, struct shared_ptr *));
|
||||
extern void
|
||||
_ZN20androidstoreservices28AndroidPresentationInterface21setCredentialsHandlerEPFvNSt6__ndk110shared_ptrIN17storeservicescore18CredentialsRequestEEENS2_INS_33AndroidCredentialsResponseHandlerEEEE(
|
||||
void *, void (*)(struct shared_ptr *, struct shared_ptr *));
|
||||
|
||||
extern void
|
||||
_ZN17storeservicescore14RequestContext24setPresentationInterfaceERKNSt6__ndk110shared_ptrINS_21PresentationInterfaceEEE(
|
||||
void *, struct shared_ptr *);
|
||||
// --- decryption ---
|
||||
extern void _ZN21SVFootHillSessionCtrl9cleanKeysERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN21SVFootHillSessionCtrl16getPersistentKeyERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_S8_S8_S8_S8_S8_(struct shared_ptr *, void *, union std_string *, union std_string *, union std_string *, union std_string *, union std_string *, union std_string *, union std_string *, union std_string *);
|
||||
void _ZN21SVFootHillSessionCtrl16getPersistentKeyERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_S8_S8_S8_S8_S8_ASM(struct shared_ptr *persistent_key, void *instance, union std_string * adam_id, union std_string *prefetch_adam_id, union std_string *key_uri, union std_string *key_format, union std_string *key_format_ver, union std_string *server_uri, union std_string *protocol_type, union std_string *fps_cert) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"mov x0, %1\n"
|
||||
"mov x1, %2\n"
|
||||
"mov x2, %3\n"
|
||||
"mov x3, %4\n"
|
||||
"mov x4, %5\n"
|
||||
"mov x5, %6\n"
|
||||
"mov x6, %7\n"
|
||||
"mov x7, %8\n"
|
||||
"sub sp, sp, #0x10\n"
|
||||
"mov x9, %9\n"
|
||||
"str x9, [sp]\n"
|
||||
"bl _ZN21SVFootHillSessionCtrl16getPersistentKeyERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_S8_S8_S8_S8_S8_\n"
|
||||
"add sp, sp, #0x10\n"
|
||||
:
|
||||
: "r" (persistent_key), "r" (instance), "r" (adam_id), "r" (prefetch_adam_id), "r" (key_uri), "r" (key_format), "r" (key_format_ver), "r" (server_uri), "r" (protocol_type), "r" (fps_cert)
|
||||
: "x8", "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x9", "memory", "lr"
|
||||
);
|
||||
}
|
||||
extern void _ZN21SVFootHillSessionCtrl14decryptContextERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKN11SVDecryptor15SVDecryptorTypeERKb(struct shared_ptr *, void *, void *);
|
||||
void _ZN21SVFootHillSessionCtrl14decryptContextERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKN11SVDecryptor15SVDecryptorTypeERKbASM(struct shared_ptr *decrypted_context, void *instance, void *context) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"mov x0, %1\n"
|
||||
"mov x1, %2\n"
|
||||
"bl _ZN21SVFootHillSessionCtrl14decryptContextERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKN11SVDecryptor15SVDecryptorTypeERKb\n"
|
||||
:
|
||||
: "r" (decrypted_context), "r" (instance), "r" (context)
|
||||
: "x8", "x0", "x1", "memory", "lr"
|
||||
);
|
||||
}
|
||||
extern void **_ZNK18SVFootHillPContext9kdContextEv(void *);
|
||||
extern long NfcRKVnxuKZy04KWbdFu71Ou(void *, uint32_t, void *, void *, size_t); // Decryption function
|
||||
extern void *_ZN21SVFootHillSessionCtrl8instanceEv();
|
||||
void *getFootHillInstance() {
|
||||
return _ZN21SVFootHillSessionCtrl8instanceEv();
|
||||
}
|
||||
const char *const fairplay_cert = "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";
|
||||
|
||||
extern void
|
||||
_ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_(
|
||||
struct shared_ptr *, struct shared_ptr *);
|
||||
extern void _ZN17storeservicescore16AuthenticateFlow3runEv(void *);
|
||||
extern struct shared_ptr *_ZNK17storeservicescore16AuthenticateFlow8responseEv(void *);
|
||||
extern int _ZNK17storeservicescore20AuthenticateResponse12responseTypeEv(void *);
|
||||
|
||||
// storeservicescore::PlaybackLeaseSession::PlaybackLeaseSession(std::__ndk1::shared_ptr<storeservicescore::RequestContext>
|
||||
// const&)
|
||||
extern void
|
||||
_ZN22SVPlaybackLeaseManagerC2ERKNSt6__ndk18functionIFvRKiEEERKNS1_IFvRKNS0_10shared_ptrIN17storeservicescore19StoreErrorConditionEEEEEE(
|
||||
void *, void *, void *);
|
||||
// --- playback ---
|
||||
extern void _ZN22SVPlaybackLeaseManagerC2ERKNSt6__ndk18functionIFvRKiEEERKNS1_IFvRKNS0_10shared_ptrIN17storeservicescore19StoreErrorConditionEEEEEE(void *, void *, void *);
|
||||
extern void _ZN22SVPlaybackLeaseManager25refreshLeaseAutomaticallyERKb(void *, uint8_t *);
|
||||
extern void _ZN22SVPlaybackLeaseManager12requestLeaseERKb(void *, uint8_t *);
|
||||
|
||||
// storeservicescore::ProtocolDialogResponse::setSelectedButton(std::__ndk1::shared_ptr<storeservicescore::ProtocolButton>
|
||||
// const&)
|
||||
extern void
|
||||
_ZN17storeservicescore22ProtocolDialogResponse17setSelectedButtonERKNSt6__ndk110shared_ptrINS_14ProtocolButtonEEE(
|
||||
void *, struct shared_ptr *);
|
||||
// storeservicescore::ProtocolDialog::title() const
|
||||
extern union std_string *_ZNK17storeservicescore14ProtocolDialog5titleEv(void *);
|
||||
// storeservicescore::ProtocolDialog::message() const
|
||||
extern union std_string *_ZNK17storeservicescore14ProtocolDialog7messageEv(void *);
|
||||
|
||||
extern union std_string *_ZNK17storeservicescore18CredentialsRequest5titleEv(void *);
|
||||
extern union std_string *_ZNK17storeservicescore18CredentialsRequest7messageEv(void *);
|
||||
extern uint8_t _ZNK17storeservicescore18CredentialsRequest28requiresHSA2VerificationCodeEv(void *);
|
||||
|
||||
extern void
|
||||
_ZN20androidstoreservices28AndroidPresentationInterface28handleProtocolDialogResponseERKlRKNSt6__ndk110shared_ptrIN17storeservicescore22ProtocolDialogResponseEEE(
|
||||
void *, long *j, struct shared_ptr *);
|
||||
// androidstoreservices::AndroidPresentationInterface::handleCredentialsResponse(std::__ndk1::shared_ptr<storeservicescore::CredentialsResponse>
|
||||
// const&)
|
||||
extern void
|
||||
_ZN20androidstoreservices28AndroidPresentationInterface25handleCredentialsResponseERKNSt6__ndk110shared_ptrIN17storeservicescore19CredentialsResponseEEE(
|
||||
void *, struct shared_ptr *);
|
||||
|
||||
extern void _ZN17storeservicescore22ProtocolDialogResponseC1Ev(void *);
|
||||
|
||||
// storeservicescore::CredentialsResponse::CredentialsResponse()
|
||||
extern void _ZN17storeservicescore19CredentialsResponseC1Ev(void *);
|
||||
// storeservicescore::CredentialsResponse::setUserName(std::__ndk1::basic_string<char,
|
||||
// std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)
|
||||
extern void
|
||||
_ZN17storeservicescore19CredentialsResponse11setUserNameERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
// storeservicescore::CredentialsResponse::setPassword(std::__ndk1::basic_string<char,
|
||||
// std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)
|
||||
extern void
|
||||
_ZN17storeservicescore19CredentialsResponse11setPasswordERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
// storeservicescore::CredentialsResponse::setResponseType(storeservicescore::CredentialsResponse::ResponseType)
|
||||
extern void _ZN17storeservicescore19CredentialsResponse15setResponseTypeENS0_12ResponseTypeE(void *, int responseType);
|
||||
|
||||
// storeservicescore::AuthenticateFlow::response() const
|
||||
extern struct shared_ptr *_ZNK17storeservicescore16AuthenticateFlow8responseEv(void *);
|
||||
|
||||
extern struct std_vector *_ZNK17storeservicescore14ProtocolDialog7buttonsEv(void *);
|
||||
extern union std_string *_ZNK17storeservicescore14ProtocolButton5titleEv(void *);
|
||||
|
||||
// storeservicescore::DeviceGUID::instance()
|
||||
extern void _ZN17storeservicescore10DeviceGUID8instanceEv(struct shared_ptr *);
|
||||
// storeservicescore::DeviceGUID::configure(std::__ndk1::basic_string<char,
|
||||
// std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&,
|
||||
// std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>,
|
||||
// std::__ndk1::allocator<char> > const&, unsigned int const&, bool const&)
|
||||
extern void
|
||||
_ZN17storeservicescore10DeviceGUID9configureERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKjRKb(
|
||||
void *, void *, union std_string *, union std_string *, unsigned int *, uint8_t *);
|
||||
|
||||
// mediaplatform::DebugLogEnabledForPriority(mediaplatform::LogPriority)
|
||||
extern uint8_t _ZN13mediaplatform26DebugLogEnabledForPriorityENS_11LogPriorityE();
|
||||
|
||||
extern void *_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore22ProtocolDialogResponseENS_9allocatorIS2_EEEE;
|
||||
extern void *_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore19CredentialsResponseENS_9allocatorIS2_EEEE;
|
||||
// vtable for
|
||||
// std::__ndk1::__shared_ptr_emplace<storeservicescore::RequestContextConfig,
|
||||
// std::__ndk1::allocator<storeservicescore::RequestContextConfig> >
|
||||
extern void *_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore20RequestContextConfigENS_9allocatorIS2_EEEE;
|
||||
|
||||
// storeservicescore::RequestContextConfig::RequestContextConfig()
|
||||
extern void _ZN17storeservicescore20RequestContextConfigC2Ev(void *);
|
||||
extern void _ZN17storeservicescore20RequestContextConfig9setCPFlagEb(void *, uint8_t);
|
||||
extern void
|
||||
_ZN17storeservicescore20RequestContextConfig20setBaseDirectoryPathERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
// storeservicescore::RequestContextConfig::setClientIdentifier(std::__ndk1::basic_string<char,
|
||||
// std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)
|
||||
extern void
|
||||
_ZN17storeservicescore20RequestContextConfig19setClientIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
extern void
|
||||
_ZN17storeservicescore20RequestContextConfig20setVersionIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
extern void
|
||||
_ZN17storeservicescore20RequestContextConfig21setPlatformIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
extern void
|
||||
_ZN17storeservicescore20RequestContextConfig17setProductVersionERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
extern void
|
||||
_ZN17storeservicescore20RequestContextConfig14setDeviceModelERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
extern void
|
||||
_ZN17storeservicescore20RequestContextConfig15setBuildVersionERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
extern void
|
||||
_ZN17storeservicescore20RequestContextConfig19setLocaleIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
extern void
|
||||
_ZN17storeservicescore20RequestContextConfig21setLanguageIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
extern void
|
||||
_ZN17storeservicescore20RequestContextConfig24setFairPlayDirectoryPathERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
|
||||
extern void
|
||||
_ZN17storeservicescore14RequestContext4initERKNSt6__ndk110shared_ptrINS_20RequestContextConfigEEE(void *, void *,
|
||||
struct shared_ptr *);
|
||||
|
||||
extern void *_ZN21SVFootHillSessionCtrl8instanceEv();
|
||||
extern void *_ZN21SVFootHillSessionCtrl7destroyEv();
|
||||
extern void _ZN21SVFootHillSessionCtrl9cleanKeysERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
extern void
|
||||
_ZN21SVFootHillSessionCtrl16getPersistentKeyERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_S8_S8_S8_S8_S8_(
|
||||
struct shared_ptr *, void *, union std_string *, union std_string *, union std_string *, union std_string *,
|
||||
union std_string *, union std_string *, union std_string *, union std_string *);
|
||||
extern void
|
||||
_ZN21SVFootHillSessionCtrl14decryptContextERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKN11SVDecryptor15SVDecryptorTypeERKb(
|
||||
struct shared_ptr *ret, void *sessCtrlInstance, union std_string *ckc);
|
||||
extern void _ZNSt6__ndk110shared_ptrI18SVFootHillPContextED2Ev(struct shared_ptr *);
|
||||
extern void **_ZNK18SVFootHillPContext9kdContextEv(void *);
|
||||
extern long NfcRKVnxuKZy04KWbdFu71Ou(void *, uint32_t, void *, void *, size_t);
|
||||
|
||||
extern void _ZN8FootHillC2ERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_(void *,
|
||||
union std_string *,
|
||||
union std_string *);
|
||||
extern void _ZN8FootHill24defaultContextIdentifierEv(void *);
|
||||
|
||||
// RequestContextManager::configure(std::__ndk1::shared_ptr<storeservicescore::RequestContext>
|
||||
// const&)
|
||||
extern void _ZN21RequestContextManager9configureERKNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEEE(
|
||||
struct shared_ptr *);
|
||||
|
||||
extern struct shared_ptr *_ZN22SVPlaybackLeaseManager12requestAssetERKmRKNSt6__ndk16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKb(
|
||||
void *, void *, unsigned long *, struct std_vector *, uint8_t *
|
||||
extern void _ZN22SVPlaybackLeaseManager12requestAssetERKmRKNSt6__ndk16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKb(void *, void *, unsigned long *, struct std_vector *, uint8_t *);
|
||||
void _ZN22SVPlaybackLeaseManager12requestAssetERKmRKNSt6__ndk16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKbASM(struct shared_ptr *result, void *leaseMgr, unsigned long *adam, struct std_vector *hls_param, uint8_t *z0) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"mov x0, %1\n"
|
||||
"mov x1, %2\n"
|
||||
"mov x2, %3\n"
|
||||
"mov x3, %4\n"
|
||||
"bl _ZN22SVPlaybackLeaseManager12requestAssetERKmRKNSt6__ndk16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKb\n"
|
||||
:
|
||||
: "r" (result), "r" (leaseMgr), "r" (adam), "r" (hls_param), "r" (z0)
|
||||
: "x8", "x0", "x1", "x2", "x3", "lr"
|
||||
);
|
||||
}
|
||||
extern int _ZNK23SVPlaybackAssetResponse13hasValidAssetEv(void *);
|
||||
extern struct shared_ptr *_ZNK23SVPlaybackAssetResponse13playbackAssetEv(void *);
|
||||
extern union std_string *_ZNK17storeservicescore13PlaybackAsset9URLStringEv(void *, uint8_t *);
|
||||
extern void _ZNK17storeservicescore13PlaybackAsset9URLStringEv(void *, uint8_t *);
|
||||
void _ZNK17storeservicescore13PlaybackAsset9URLStringEvASM(void *url, void *playback_asset) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"mov x0, %1\n"
|
||||
"bl _ZNK17storeservicescore13PlaybackAsset9URLStringEv\n"
|
||||
:
|
||||
: "r" (url), "r" (playback_asset)
|
||||
: "x8", "x0", "lr"
|
||||
);
|
||||
}
|
||||
|
||||
// --- request context ---
|
||||
extern void _ZNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEE11make_sharedIJRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEES3_DpOT_(struct shared_ptr *, union std_string *);
|
||||
void _ZNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEE11make_sharedIJRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEES3_DpOT_ASM(struct shared_ptr *reqCtx, union std_string *str) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"mov x0, %1\n"
|
||||
"bl _ZNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEE11make_sharedIJRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEES3_DpOT_\n"
|
||||
:
|
||||
: "r" (reqCtx), "r" (str)
|
||||
: "x8", "x0", "lr"
|
||||
);
|
||||
}
|
||||
struct shared_ptr *newRequestContext(const char *str)
|
||||
{
|
||||
struct shared_ptr *reqCtx = (struct shared_ptr *)malloc(sizeof(struct shared_ptr));
|
||||
union std_string strBuf = new_std_string(str);
|
||||
_ZNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEE11make_sharedIJRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEES3_DpOT_ASM(reqCtx, &strBuf);
|
||||
return reqCtx;
|
||||
}
|
||||
|
||||
extern void *_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore20RequestContextConfigENS_9allocatorIS2_EEEE;
|
||||
extern void _ZN17storeservicescore20RequestContextConfigC2Ev(void *);
|
||||
struct shared_ptr *getRequestContextConfig() {
|
||||
uint8_t *ptr = (uint8_t *)malloc(480);
|
||||
*(void **)(ptr) = &_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore20RequestContextConfigENS_9allocatorIS2_EEEE + 2;
|
||||
|
||||
struct shared_ptr *reqCtxConfig = (struct shared_ptr *)malloc(sizeof(struct shared_ptr));
|
||||
reqCtxConfig->obj = ptr + 32;
|
||||
reqCtxConfig->ctrl_blk = ptr;
|
||||
|
||||
_ZN17storeservicescore20RequestContextConfigC2Ev(reqCtxConfig->obj);
|
||||
return reqCtxConfig;
|
||||
}
|
||||
|
||||
extern void _ZN17storeservicescore20RequestContextConfig20setBaseDirectoryPathERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN17storeservicescore20RequestContextConfig19setClientIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN17storeservicescore20RequestContextConfig20setVersionIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN17storeservicescore20RequestContextConfig21setPlatformIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN17storeservicescore20RequestContextConfig17setProductVersionERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN17storeservicescore20RequestContextConfig14setDeviceModelERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN17storeservicescore20RequestContextConfig15setBuildVersionERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN17storeservicescore20RequestContextConfig19setLocaleIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN17storeservicescore20RequestContextConfig21setLanguageIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
void prepareRequestContextConfig(struct shared_ptr *reqCtxConfig)
|
||||
{
|
||||
union std_string baseDirectoryPath = new_std_string("/data/data/com.apple.android.music/files/mpl_db");
|
||||
_ZN17storeservicescore20RequestContextConfig20setBaseDirectoryPathERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &baseDirectoryPath);
|
||||
|
||||
union std_string clientIdentifier = new_std_string("Music");
|
||||
_ZN17storeservicescore20RequestContextConfig19setClientIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &clientIdentifier);
|
||||
|
||||
union std_string versionIdentifier = new_std_string("4.9.2");
|
||||
_ZN17storeservicescore20RequestContextConfig20setVersionIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &versionIdentifier);
|
||||
|
||||
union std_string platformIdentifier = new_std_string("Android");
|
||||
_ZN17storeservicescore20RequestContextConfig21setPlatformIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &platformIdentifier);
|
||||
|
||||
union std_string productVersion = new_std_string("15");
|
||||
_ZN17storeservicescore20RequestContextConfig17setProductVersionERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &productVersion);
|
||||
|
||||
union std_string deviceModel = new_std_string("Pixel 8");
|
||||
_ZN17storeservicescore20RequestContextConfig14setDeviceModelERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &deviceModel);
|
||||
|
||||
union std_string buildVersion = new_std_string("7663313");
|
||||
_ZN17storeservicescore20RequestContextConfig15setBuildVersionERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &buildVersion);
|
||||
|
||||
union std_string locale = new_std_string("en_US");
|
||||
_ZN17storeservicescore20RequestContextConfig19setLocaleIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &locale);
|
||||
_ZN17storeservicescore20RequestContextConfig21setLanguageIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &locale);
|
||||
}
|
||||
|
||||
extern void _ZN21RequestContextManager9configureERKNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEEE(struct shared_ptr *);
|
||||
void configureRequestContext(struct shared_ptr *reqCtx)
|
||||
{
|
||||
_ZN21RequestContextManager9configureERKNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEEE(reqCtx);
|
||||
}
|
||||
|
||||
|
||||
extern void _ZN17storeservicescore14RequestContext4initERKNSt6__ndk110shared_ptrINS_20RequestContextConfigEEE(void *, void *, struct shared_ptr *);
|
||||
void _ZN17storeservicescore14RequestContext4initERKNSt6__ndk110shared_ptrINS_20RequestContextConfigEEEASM(uint8_t *buf, struct shared_ptr *reqCtx, struct shared_ptr *reqCtxConfig) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"mov x0, %1\n"
|
||||
"mov x1, %2\n"
|
||||
"bl _ZN17storeservicescore14RequestContext4initERKNSt6__ndk110shared_ptrINS_20RequestContextConfigEEE\n"
|
||||
:
|
||||
: "r" (buf), "r" (reqCtx), "r" (reqCtxConfig)
|
||||
: "x8", "x0", "x1", "lr"
|
||||
);
|
||||
}
|
||||
void initRequestContext(uint8_t *buf, struct shared_ptr *reqCtx, struct shared_ptr *reqCtxConfig)
|
||||
{
|
||||
_ZN17storeservicescore14RequestContext4initERKNSt6__ndk110shared_ptrINS_20RequestContextConfigEEEASM(buf, reqCtx->obj, reqCtxConfig);
|
||||
}
|
||||
|
||||
|
||||
extern void _ZN17storeservicescore14RequestContext24setFairPlayDirectoryPathERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
|
||||
void setFairPlayDirectoryPath(struct shared_ptr *reqCtx, const char *str)
|
||||
{
|
||||
union std_string strBuf = new_std_string(str);
|
||||
_ZN17storeservicescore14RequestContext24setFairPlayDirectoryPathERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtx->obj, &strBuf);
|
||||
}
|
||||
|
||||
const char *const android_id = "dc28071e981c439e";
|
||||
const char *const fairplayCert = "MIIEzjCCA7agAwIBAgIIAXAVjHFZDjgwDQYJKoZIhvcNAQEFBQAwfzELMAkGA1UEBhMCVVMxEz"
|
||||
"ARBgNVBAoMCkFwcGxlIEluYy4xJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9y"
|
||||
"aXR5MTMwMQYDVQQDDCpBcHBsZSBLZXkgU2VydmljZXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdH"
|
||||
"kwHhcNMTIwNzI1MTgwMjU4WhcNMTQwNzI2MTgwMjU4WjAwMQswCQYDVQQGEwJVUzESMBAGA1UE"
|
||||
"CgwJQXBwbGUgSW5jMQ0wCwYDVQQDDARGUFMxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ"
|
||||
"CqZ9IbMt0J0dTKQN4cUlfeQRY9bcnbnP95HFv9A16Yayh4xQzRLAQqVSmisZtBK2/nawZcDmcs"
|
||||
"+XapBojRb+jDM4Dzk6/Ygdqo8LoA+BE1zipVyalGLj8Y86hTC9QHX8i05oWNCDIlmabjjWvFBo"
|
||||
"EOk+ezOAPg8c0SET38x5u+TwIDAQABo4ICHzCCAhswHQYDVR0OBBYEFPP6sfTWpOQ5Sguf5W3Y"
|
||||
"0oibbEc3MAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUY+RHVMuFcVlGLIOszEQxZGcDLL4wge"
|
||||
"IGA1UdIASB2jCB1zCB1AYJKoZIhvdjZAUBMIHGMIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNl"
|
||||
"IG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZi"
|
||||
"B0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVz"
|
||||
"ZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbW"
|
||||
"VudHMuMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwuYXBwbGUuY29tL2tleXNlcnZpY2Vz"
|
||||
"LmNybDAOBgNVHQ8BAf8EBAMCBSAwFAYLKoZIhvdjZAYNAQUBAf8EAgUAMBsGCyqGSIb3Y2QGDQ"
|
||||
"EGAQH/BAkBAAAAAQAAAAEwKQYLKoZIhvdjZAYNAQMBAf8EFwF+bjsY57ASVFmeehD2bdu6HLGB"
|
||||
"xeC2MEEGCyqGSIb3Y2QGDQEEAQH/BC8BHrKviHJf/Se/ibc7T0/55Bt1GePzaYBVfgF3ZiNuV9"
|
||||
"3z8P3qsawAqAXzzh9o5DANBgkqhkiG9w0BAQUFAAOCAQEAVGyCtuLYcYb/aPijBCtaemxuV0Io"
|
||||
"kXJn3EgmwYHZynaR6HZmeGRUp9p3f8EXu6XPSekKCCQi+a86hXX9RfnGEjRdvtP+jts5MDSKuU"
|
||||
"Ioaqce8cLX2dpUOZXdf3lR0IQM0kXHb5boNGBsmbTLVifqeMsexfZryGw2hE/4WDOJdGQm1gMJ"
|
||||
"ZU4jP1b/HSLNIUhHWAaMeWtcJTPRBucR4urAtvvtOWD88mriZNHG+veYw55b+qA36PSqDPMbku"
|
||||
"9xTY7fsMa6mxIRmwULQgi8nOk1wNhw3ZO0qUKtaCO3gSqWdloecxpxUQSZCSW7tWPkpXXwDZqe"
|
||||
"gUkij9xMFS1pr37RIjCCBVAwggQ4oAMCAQICEEVKuaGraq1Cp4z6TFOeVfUwDQYJKoZIhvcNAQ"
|
||||
"ELBQAwUDEsMCoGA1UEAwwjQXBwbGUgRlAgU2VydmljZSBFbmFibGUgUlNBIENBIC0gRzExEzAR"
|
||||
"BgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMB4XDTIwMDQwNzIwMjY0NFoXDTIyMDQwNz"
|
||||
"IwMjY0NFowWjEhMB8GA1UEAwwYZnBzMjA0OC5pdHVuZXMuYXBwbGUuY29tMRMwEQYDVQQLDApB"
|
||||
"cHBsZSBJbmMuMRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzCCASIwDQYJKoZIhv"
|
||||
"cNAQEBBQADggEPADCCAQoCggEBAJNoUHuTRLafofQgIRgGa2TFIf+bsFDMjs+y3Ep1xCzFLE4Q"
|
||||
"bnwG6OG0duKUl5IoGUsouzZk9iGsXz5k3ESLOWKz2BFrDTvGrzAcuLpH66jJHGsk/l+ZzsDOJa"
|
||||
"oQ22pu0JvzYzW8/yEKvpE6JF/2dsC6V9RDTri3VWFxrl5uh8czzncoEQoRcQsSatHzs4tw/QdH"
|
||||
"FtBIigqxqr4R7XiCaHbsQmqbP9h7oxRs/6W/DDA2BgkuFY1ocX/8dTjmH6szKPfGt3KaYCwy3f"
|
||||
"uRC+FibTyohtvmlXsYhm7AUzorwWIwN/MbiFQ0OHHtDomIy71wDcTNMnY0jZYtGmIlJETAgYcC"
|
||||
"AwEAAaOCAhowggIWMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUrI/yBkpV623/IeMrXzs8fC"
|
||||
"7VkZkwRQYIKwYBBQUHAQEEOTA3MDUGCCsGAQUFBzABhilodHRwOi8vb2NzcC5hcHBsZS5jb20v"
|
||||
"b2NzcDAzLWZwc3J2cnNhZzEwMzCBwwYDVR0gBIG7MIG4MIG1BgkqhkiG92NkBQEwgacwgaQGCC"
|
||||
"sGAQUFBwICMIGXDIGUUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkg"
|
||||
"YXNzdW1lcyBhY2NlcHRhbmNlIG9mIGFueSBhcHBsaWNhYmxlIHRlcm1zIGFuZCBjb25kaXRpb2"
|
||||
"5zIG9mIHVzZSBhbmQvb3IgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjAdBgNV"
|
||||
"HQ4EFgQU2RpCSSHFXeoZQQWxbwJuRZ9RrIEwDgYDVR0PAQH/BAQDAgUgMBQGCyqGSIb3Y2QGDQ"
|
||||
"EFAQH/BAIFADAjBgsqhkiG92NkBg0BBgEB/wQRAQAAAAMAAAABAAAAAgAAAAMwOQYLKoZIhvdj"
|
||||
"ZAYNAQMBAf8EJwG+pUeWbeZBUI0PikyFwSggL5dHaeugSDoQKwcP28csLuh5wplpATAzBgsqhk"
|
||||
"iG92NkBg0BBAEB/wQhAfl9TGjP/UY9TyQzYsn8sX9ZvHChok9QrrUhtAyWR1yCMA0GCSqGSIb3"
|
||||
"DQEBCwUAA4IBAQBNMzZ6llQ0laLXsrmyVieuoW9+pHeAaDJ7cBiQLjM3ZdIO3Gq5dkbWYYYwJw"
|
||||
"ymdxZ74WGZMuVv3ueJKcxG1jAhCRhr0lb6QaPaQQSNW+xnoesb3CLA0RzrcgBp/9WFZNdttJOS"
|
||||
"yC93lQmiE0r5RqPpe/IWUzwoZxri8qnsghVFxCBEcMB+U4PJR8WeAkPrji8po2JLYurvgNRhGk"
|
||||
"DKcAFPuGEpXdF86hPts+07zazsP0fBjBSVgP3jqb8G31w5W+O+wBW0B9uCf3s0vXU4LuJTAyww"
|
||||
"s2ImZ7O/AaY/uXWOyIUMUKPgL1/QJieB7pBoENIJ2CeJS2M3iv00ssmCmTEJ";
|
||||
|
||||
// --- interface ---
|
||||
extern void _ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_(struct shared_ptr *);
|
||||
void _ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_ASM(struct shared_ptr *apInterface) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"bl _ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_\n"
|
||||
:
|
||||
: "r" (apInterface)
|
||||
: "x8", "x0", "lr"
|
||||
);
|
||||
}
|
||||
extern void _ZN20androidstoreservices28AndroidPresentationInterface16setDialogHandlerEPFvlNSt6__ndk110shared_ptrIN17storeservicescore14ProtocolDialogEEENS2_INS_36AndroidProtocolDialogResponseHandlerEEEE(void *, void (*)(long, struct shared_ptr *, struct shared_ptr *));
|
||||
extern void _ZN20androidstoreservices28AndroidPresentationInterface21setCredentialsHandlerEPFvNSt6__ndk110shared_ptrIN17storeservicescore18CredentialsRequestEEENS2_INS_33AndroidCredentialsResponseHandlerEEEE(void *, void (*)(struct shared_ptr *, struct shared_ptr *));
|
||||
void initPresentationInterface(
|
||||
struct shared_ptr *apInterface,
|
||||
void (*dialog_handler)(long, struct shared_ptr *, struct shared_ptr *),
|
||||
void (*credentials_handler)(struct shared_ptr *, struct shared_ptr *)
|
||||
)
|
||||
{
|
||||
_ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_ASM(apInterface);
|
||||
_ZN20androidstoreservices28AndroidPresentationInterface16setDialogHandlerEPFvlNSt6__ndk110shared_ptrIN17storeservicescore14ProtocolDialogEEENS2_INS_36AndroidProtocolDialogResponseHandlerEEEE(apInterface->obj, dialog_handler);
|
||||
_ZN20androidstoreservices28AndroidPresentationInterface21setCredentialsHandlerEPFvNSt6__ndk110shared_ptrIN17storeservicescore18CredentialsRequestEEENS2_INS_33AndroidCredentialsResponseHandlerEEEE(apInterface->obj, credentials_handler);
|
||||
}
|
||||
|
||||
extern void _ZN17storeservicescore14RequestContext24setPresentationInterfaceERKNSt6__ndk110shared_ptrINS_21PresentationInterfaceEEE(void *, struct shared_ptr *);
|
||||
void setPresentationInterface(struct shared_ptr *reqCtx, struct shared_ptr *apInterface)
|
||||
{
|
||||
_ZN17storeservicescore14RequestContext24setPresentationInterfaceERKNSt6__ndk110shared_ptrINS_21PresentationInterfaceEEE(reqCtx->obj, apInterface);
|
||||
}
|
||||
|
||||
|
||||
// --- auth flow ---
|
||||
extern void _ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_(struct shared_ptr *, struct shared_ptr *);
|
||||
void _ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_ASM(struct shared_ptr *flow, struct shared_ptr *reqCtx) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"mov x0, %1\n"
|
||||
"bl _ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_\n"
|
||||
:
|
||||
: "r" (flow), "r" (reqCtx)
|
||||
: "x8", "x0", "lr"
|
||||
);
|
||||
}
|
||||
extern void _ZN17storeservicescore16AuthenticateFlow3runEv(void *);
|
||||
extern struct shared_ptr *_ZNK17storeservicescore16AuthenticateFlow8responseEv(void *);
|
||||
extern int _ZNK17storeservicescore20AuthenticateResponse12responseTypeEv(void *);
|
||||
extern void _ZN14FootHillConfig6configERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE(union std_string *);
|
||||
extern void _ZN17storeservicescore10DeviceGUID8instanceEv(struct shared_ptr *);
|
||||
void _ZN17storeservicescore10DeviceGUID8instanceEvASM(struct shared_ptr *GUID) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"bl _ZN17storeservicescore10DeviceGUID8instanceEv\n"
|
||||
:
|
||||
: "r" (GUID)
|
||||
: "x8", "x0", "lr"
|
||||
);
|
||||
}
|
||||
extern void _ZN17storeservicescore10DeviceGUID9configureERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKjRKb(void *, void *, union std_string *, union std_string *, unsigned int *, uint8_t *);
|
||||
void _ZN17storeservicescore10DeviceGUID9configureERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKjRKbASM(void *ret, void *GUID, union std_string *config1, union std_string *config2, unsigned int *config3, uint8_t *config4) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"mov x0, %1\n"
|
||||
"mov x1, %2\n"
|
||||
"mov x2, %3\n"
|
||||
"mov x3, %4\n"
|
||||
"mov x4, %5\n"
|
||||
"bl _ZN17storeservicescore10DeviceGUID9configureERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKjRKb\n"
|
||||
:
|
||||
: "r" (ret), "r" (GUID), "r" (config1), "r" (config2), "r" (config3), "r" (config4)
|
||||
: "x8", "x0", "x1", "x2", "x3", "x4", "lr"
|
||||
);
|
||||
}
|
||||
|
||||
// --- logging ---
|
||||
extern uint8_t _ZN13mediaplatform26DebugLogEnabledForPriorityENS_11LogPriorityE();
|
||||
extern int __android_log_print(int prio, const char *tag, const char *fmt, ...);
|
||||
|
507
main.c
Normal file
507
main.c
Normal file
@ -0,0 +1,507 @@
|
||||
#include <errno.h>
|
||||
#include <setjmp.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include "import.h"
|
||||
#include "cmdline.h"
|
||||
#ifndef MyRelease
|
||||
#include "subhook/subhook.c"
|
||||
#endif
|
||||
|
||||
static struct shared_ptr apInf;
|
||||
static uint8_t leaseMgr[16];
|
||||
struct gengetopt_args_info args_info;
|
||||
char *amUsername, *amPassword;
|
||||
|
||||
static void dialogHandler(long j, struct shared_ptr *protoDialogPtr,
|
||||
struct shared_ptr *respHandler) {
|
||||
const char *const title = std_string_data(
|
||||
_ZNK17storeservicescore14ProtocolDialog5titleEv(protoDialogPtr->obj));
|
||||
fprintf(stderr, "[.] dialogHandler: {title: %s, message: %s}\n", title,
|
||||
std_string_data(_ZNK17storeservicescore14ProtocolDialog7messageEv(
|
||||
protoDialogPtr->obj)));
|
||||
|
||||
unsigned char ptr[72];
|
||||
memset(ptr + 8, 0, 16);
|
||||
*(void **)(ptr) =
|
||||
&_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore22ProtocolDialogResponseENS_9allocatorIS2_EEEE +
|
||||
2;
|
||||
struct shared_ptr diagResp = {.obj = ptr + 24, .ctrl_blk = ptr};
|
||||
_ZN17storeservicescore22ProtocolDialogResponseC1Ev(diagResp.obj);
|
||||
|
||||
struct std_vector *butVec =
|
||||
_ZNK17storeservicescore14ProtocolDialog7buttonsEv(protoDialogPtr->obj);
|
||||
if (strcmp("Sign In", title) == 0) {
|
||||
for (struct shared_ptr *b = butVec->begin; b != butVec->end; ++b) {
|
||||
if (strcmp("Use Existing Apple ID",
|
||||
std_string_data(
|
||||
_ZNK17storeservicescore14ProtocolButton5titleEv(
|
||||
b->obj))) == 0) {
|
||||
_ZN17storeservicescore22ProtocolDialogResponse17setSelectedButtonERKNSt6__ndk110shared_ptrINS_14ProtocolButtonEEE(
|
||||
diagResp.obj, b);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (struct shared_ptr *b = butVec->begin; b != butVec->end; ++b) {
|
||||
fprintf(
|
||||
stderr, "[.] button %p: %s\n", b->obj,
|
||||
std_string_data(
|
||||
_ZNK17storeservicescore14ProtocolButton5titleEv(b->obj)));
|
||||
}
|
||||
}
|
||||
_ZN20androidstoreservices28AndroidPresentationInterface28handleProtocolDialogResponseERKlRKNSt6__ndk110shared_ptrIN17storeservicescore22ProtocolDialogResponseEEE(
|
||||
apInf.obj, &j, &diagResp);
|
||||
}
|
||||
|
||||
static void credentialHandler(struct shared_ptr *credReqHandler,
|
||||
struct shared_ptr *credRespHandler) {
|
||||
const uint8_t need2FA =
|
||||
_ZNK17storeservicescore18CredentialsRequest28requiresHSA2VerificationCodeEv(
|
||||
credReqHandler->obj);
|
||||
fprintf(
|
||||
stderr, "[.] credentialHandler: {title: %s, message: %s, 2FA: %s}\n",
|
||||
std_string_data(_ZNK17storeservicescore18CredentialsRequest5titleEv(
|
||||
credReqHandler->obj)),
|
||||
std_string_data(_ZNK17storeservicescore18CredentialsRequest7messageEv(
|
||||
credReqHandler->obj)),
|
||||
need2FA ? "true" : "false");
|
||||
|
||||
int passLen = strlen(amPassword);
|
||||
|
||||
if (need2FA) {
|
||||
printf("2FA code: ");
|
||||
scanf("%6s", amPassword + passLen);
|
||||
}
|
||||
|
||||
uint8_t *const ptr = malloc(80);
|
||||
memset(ptr + 8, 0, 16);
|
||||
*(void **)(ptr) =
|
||||
&_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore19CredentialsResponseENS_9allocatorIS2_EEEE +
|
||||
2;
|
||||
struct shared_ptr credResp = {.obj = ptr + 24, .ctrl_blk = ptr};
|
||||
_ZN17storeservicescore19CredentialsResponseC1Ev(credResp.obj);
|
||||
|
||||
union std_string username = new_std_string(amUsername);
|
||||
_ZN17storeservicescore19CredentialsResponse11setUserNameERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
credResp.obj, &username);
|
||||
|
||||
union std_string password = new_std_string(amPassword);
|
||||
_ZN17storeservicescore19CredentialsResponse11setPasswordERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
credResp.obj, &password);
|
||||
|
||||
_ZN17storeservicescore19CredentialsResponse15setResponseTypeENS0_12ResponseTypeE(
|
||||
credResp.obj, 2);
|
||||
|
||||
_ZN20androidstoreservices28AndroidPresentationInterface25handleCredentialsResponseERKNSt6__ndk110shared_ptrIN17storeservicescore19CredentialsResponseEEE(
|
||||
apInf.obj, &credResp);
|
||||
}
|
||||
|
||||
#ifndef MyRelease
|
||||
static uint8_t allDebug() { return 1; }
|
||||
#endif
|
||||
|
||||
static inline void init() {
|
||||
// srand(time(0));
|
||||
|
||||
// raise(SIGSTOP);
|
||||
fprintf(stderr, "[+] starting...\n");
|
||||
setenv("ANDROID_DNS_MODE", "local", 1);
|
||||
if (args_info.proxy_given) {
|
||||
fprintf(stderr, "[+] Using proxy %s", args_info.proxy_arg);
|
||||
setenv("http_proxy", args_info.proxy_arg, 1);
|
||||
setenv("https_proxy", args_info.proxy_arg, 1);
|
||||
}
|
||||
|
||||
static const char *resolvers[2] = {"1.1.1.1", "1.0.0.1"};
|
||||
_resolv_set_nameservers_for_net(0, resolvers, 2, ".");
|
||||
#ifndef MyRelease
|
||||
subhook_install(subhook_new(
|
||||
_ZN13mediaplatform26DebugLogEnabledForPriorityENS_11LogPriorityE,
|
||||
allDebug, SUBHOOK_64BIT_OFFSET));
|
||||
#endif
|
||||
|
||||
// static char android_id[16];
|
||||
// for (int i = 0; i < 16; ++i) {
|
||||
// android_id[i] = "0123456789abcdef"[rand() % 16];
|
||||
// }
|
||||
union std_string conf1 = new_std_string(android_id);
|
||||
union std_string conf2 = new_std_string("");
|
||||
_ZN14FootHillConfig6configERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE(
|
||||
&conf1);
|
||||
|
||||
// union std_string root = new_std_string("/");
|
||||
// union std_string natLib = new_std_string("/system/lib64/");
|
||||
// void *foothill = malloc(120);
|
||||
// _ZN8FootHillC2ERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_(
|
||||
// foothill, &root, &natLib);
|
||||
// _ZN8FootHill24defaultContextIdentifierEv(foothill);
|
||||
|
||||
struct shared_ptr GUID;
|
||||
_ZN17storeservicescore10DeviceGUID8instanceEvASM(&GUID);
|
||||
|
||||
static uint8_t ret[88];
|
||||
static unsigned int conf3 = 29;
|
||||
static uint8_t conf4 = 1;
|
||||
_ZN17storeservicescore10DeviceGUID9configureERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKjRKbASM(
|
||||
&ret, GUID.obj, &conf1, &conf2, &conf3, &conf4);
|
||||
}
|
||||
|
||||
static inline struct shared_ptr init_ctx() {
|
||||
fprintf(stderr, "[+] initializing ctx...\n");
|
||||
|
||||
struct shared_ptr *reqCtx = newRequestContext("/data/data/com.apple.android.music/files/mpl_db");
|
||||
struct shared_ptr *reqCtxCfg = getRequestContextConfig();
|
||||
|
||||
prepareRequestContextConfig(reqCtxCfg);
|
||||
configureRequestContext(reqCtx);
|
||||
|
||||
static uint8_t buf[88];
|
||||
initRequestContext(buf, reqCtx, reqCtxCfg);
|
||||
setFairPlayDirectoryPath(reqCtx, "/data/data/com.apple.android.music/files");
|
||||
initPresentationInterface(&apInf, &dialogHandler, &credentialHandler);
|
||||
setPresentationInterface(reqCtx, &apInf);
|
||||
|
||||
return *reqCtx;
|
||||
}
|
||||
|
||||
extern void *endLeaseCallback;
|
||||
extern void *pbErrCallback;
|
||||
|
||||
inline static uint8_t login(struct shared_ptr reqCtx) {
|
||||
fprintf(stderr, "[+] logging in...\n");
|
||||
struct shared_ptr flow;
|
||||
_ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_ASM(
|
||||
&flow, &reqCtx);
|
||||
_ZN17storeservicescore16AuthenticateFlow3runEv(flow.obj);
|
||||
struct shared_ptr *resp =
|
||||
_ZNK17storeservicescore16AuthenticateFlow8responseEv(flow.obj);
|
||||
if (resp == NULL || resp->obj == NULL)
|
||||
return 0;
|
||||
const int respType =
|
||||
_ZNK17storeservicescore20AuthenticateResponse12responseTypeEv(
|
||||
resp->obj);
|
||||
fprintf(stderr, "[.] response type %d\n", respType);
|
||||
return respType == 6;
|
||||
// struct shared_ptr subStatMgr;
|
||||
// _ZN20androidstoreservices30SVSubscriptionStatusMgrFactory6createEv(&subStatMgr);
|
||||
// struct shared_ptr data;
|
||||
// int method = 2;
|
||||
// _ZN20androidstoreservices27SVSubscriptionStatusMgrImpl33checkSubscriptionStatusFromSourceERKNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEEERKNS_23SVSubscriptionStatusMgr26SVSubscriptionStatusSourceE(&data,
|
||||
// subStatMgr.obj, &reqCtx, &method);
|
||||
// return 1;
|
||||
}
|
||||
|
||||
static inline uint8_t readfull(const int connfd, void *const buf,
|
||||
const size_t size) {
|
||||
size_t red = 0;
|
||||
while (size > red) {
|
||||
const ssize_t b = read(connfd, ((uint8_t *)buf) + red, size - red);
|
||||
if (b <= 0)
|
||||
return 0;
|
||||
red += b;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline void writefull(const int connfd, void *const buf,
|
||||
const size_t size) {
|
||||
size_t red = 0;
|
||||
while (size > red) {
|
||||
const ssize_t b = write(connfd, ((uint8_t *)buf) + red, size - red);
|
||||
if (b <= 0) {
|
||||
perror("write");
|
||||
break;
|
||||
}
|
||||
red += b;
|
||||
}
|
||||
}
|
||||
|
||||
static void *FHinstance = NULL;
|
||||
static void *preshareCtx = NULL;
|
||||
|
||||
inline static void *getKdContext(const char *const adam,
|
||||
const char *const uri) {
|
||||
uint8_t isPreshare = (strcmp("0", adam) == 0);
|
||||
if (isPreshare && preshareCtx != NULL) {
|
||||
return preshareCtx;
|
||||
}
|
||||
fprintf(stderr, "[.] adamId: %s, uri: %s\n", adam, uri);
|
||||
|
||||
union std_string defaultId = new_std_string(adam);
|
||||
union std_string keyUri = new_std_string(uri);
|
||||
union std_string keyFormat =
|
||||
new_std_string("com.apple.streamingkeydelivery");
|
||||
union std_string keyFormatVer = new_std_string("1");
|
||||
union std_string serverUri = new_std_string(
|
||||
"https://play.itunes.apple.com/WebObjects/MZPlay.woa/music/fps");
|
||||
union std_string protocolType = new_std_string("simplified");
|
||||
union std_string fpsCert = new_std_string(fairplay_cert);
|
||||
|
||||
struct shared_ptr persistK = {.obj = NULL};
|
||||
_ZN21SVFootHillSessionCtrl16getPersistentKeyERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_S8_S8_S8_S8_S8_ASM(
|
||||
&persistK, FHinstance, &defaultId, &defaultId, &keyUri, &keyFormat,
|
||||
&keyFormatVer, &serverUri, &protocolType, &fpsCert);
|
||||
|
||||
if (persistK.obj == NULL)
|
||||
return NULL;
|
||||
|
||||
struct shared_ptr SVFootHillPContext;
|
||||
_ZN21SVFootHillSessionCtrl14decryptContextERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKN11SVDecryptor15SVDecryptorTypeERKbASM(
|
||||
&SVFootHillPContext, FHinstance, persistK.obj);
|
||||
|
||||
if (SVFootHillPContext.obj == NULL)
|
||||
return NULL;
|
||||
|
||||
void *kdContext =
|
||||
*_ZNK18SVFootHillPContext9kdContextEv(SVFootHillPContext.obj);
|
||||
if (kdContext != NULL && isPreshare)
|
||||
preshareCtx = kdContext;
|
||||
return kdContext;
|
||||
}
|
||||
|
||||
void handle(const int connfd) {
|
||||
while (1) {
|
||||
uint8_t adamSize;
|
||||
if (!readfull(connfd, &adamSize, sizeof(uint8_t)))
|
||||
return;
|
||||
if (adamSize <= 0)
|
||||
return;
|
||||
|
||||
char adam[adamSize + 1];
|
||||
if (!readfull(connfd, adam, adamSize))
|
||||
return;
|
||||
adam[adamSize] = '\0';
|
||||
|
||||
uint8_t uri_size;
|
||||
if (!readfull(connfd, &uri_size, sizeof(uint8_t)))
|
||||
return;
|
||||
|
||||
char uri[uri_size + 1];
|
||||
if (!readfull(connfd, uri, uri_size))
|
||||
return;
|
||||
uri[uri_size] = '\0';
|
||||
|
||||
void **const kdContext = getKdContext(adam, uri);
|
||||
if (kdContext == NULL)
|
||||
return;
|
||||
|
||||
while (1) {
|
||||
uint32_t size;
|
||||
if (!readfull(connfd, &size, sizeof(uint32_t))) {
|
||||
perror("read");
|
||||
return;
|
||||
}
|
||||
|
||||
if (size <= 0)
|
||||
break;
|
||||
|
||||
void *sample = malloc(size);
|
||||
if (sample == NULL) {
|
||||
perror("malloc");
|
||||
return;
|
||||
}
|
||||
if (!readfull(connfd, sample, size)) {
|
||||
free(sample);
|
||||
perror("read");
|
||||
return;
|
||||
}
|
||||
|
||||
NfcRKVnxuKZy04KWbdFu71Ou(*kdContext, 5, sample, sample, size);
|
||||
writefull(connfd, sample, size);
|
||||
free(sample);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extern uint8_t handle_cpp(int);
|
||||
|
||||
inline static int new_socket() {
|
||||
const int fd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
|
||||
if (fd == -1) {
|
||||
perror("socket");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
const int optval = 1;
|
||||
setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));
|
||||
|
||||
static struct sockaddr_in serv_addr = {.sin_family = AF_INET};
|
||||
inet_pton(AF_INET, args_info.host_arg, &serv_addr.sin_addr);
|
||||
serv_addr.sin_port = htons(args_info.decrypt_port_arg);
|
||||
if (bind(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
|
||||
perror("bind");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (listen(fd, 5) == -1) {
|
||||
perror("listen");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
fprintf(stderr, "[!] listening %s:%d\n", args_info.host_arg, args_info.decrypt_port_arg);
|
||||
// close(STDOUT_FILENO);
|
||||
|
||||
static struct sockaddr_in peer_addr;
|
||||
static socklen_t peer_addr_size = sizeof(peer_addr);
|
||||
while (1) {
|
||||
const int connfd = accept4(fd, (struct sockaddr *)&peer_addr,
|
||||
&peer_addr_size, SOCK_CLOEXEC);
|
||||
if (connfd == -1) {
|
||||
if (errno == ENETDOWN || errno == EPROTO || errno == ENOPROTOOPT ||
|
||||
errno == EHOSTDOWN || errno == ENONET ||
|
||||
errno == EHOSTUNREACH || errno == EOPNOTSUPP ||
|
||||
errno == ENETUNREACH)
|
||||
continue;
|
||||
perror("accept4");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (!handle_cpp(connfd)) {
|
||||
uint8_t autom = 1;
|
||||
_ZN22SVPlaybackLeaseManager12requestLeaseERKb(leaseMgr, &autom);
|
||||
}
|
||||
// if (sigsetjmp(catcher.env, 0) == 0) {
|
||||
// catcher.do_jump = 1;
|
||||
// handle(connfd);
|
||||
// }
|
||||
// catcher.do_jump = 0;
|
||||
|
||||
if (close(connfd) == -1) {
|
||||
perror("close");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const char* get_m3u8_method_play(uint8_t leaseMgr[16], unsigned long adam) {
|
||||
union std_string HLS = new_std_string_short_mode("HLS");
|
||||
struct std_vector HLSParam = new_std_vector(&HLS);
|
||||
static uint8_t z0 = 0;
|
||||
struct shared_ptr ptr_result;
|
||||
_ZN22SVPlaybackLeaseManager12requestAssetERKmRKNSt6__ndk16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKbASM(
|
||||
&ptr_result, leaseMgr, &adam, &HLSParam, &z0
|
||||
);
|
||||
if (_ZNK23SVPlaybackAssetResponse13hasValidAssetEv(ptr_result.obj)) {
|
||||
struct shared_ptr *playbackAsset = _ZNK23SVPlaybackAssetResponse13playbackAssetEv(ptr_result.obj);
|
||||
union std_string *m3u8 = malloc(24);
|
||||
void *playbackObj = playbackAsset->obj;
|
||||
_ZNK17storeservicescore13PlaybackAsset9URLStringEvASM(m3u8, playbackObj);
|
||||
const char *m3u8_str = std_string_data(m3u8);
|
||||
return m3u8_str;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void handle_m3u8(const int connfd) {
|
||||
while (1)
|
||||
{
|
||||
uint8_t adamSize;
|
||||
if (!readfull(connfd, &adamSize, sizeof(uint8_t))) {
|
||||
return;
|
||||
}
|
||||
if (adamSize <= 0) {
|
||||
return;
|
||||
}
|
||||
char adam[adamSize];
|
||||
for (int i=0; i<adamSize; i=i+1) {
|
||||
readfull(connfd, &adam[i], sizeof(uint8_t));
|
||||
}
|
||||
char *ptr;
|
||||
unsigned long adamID = strtoul(adam, &ptr, 10);
|
||||
const char *m3u8 = get_m3u8_method_play(leaseMgr, adamID);
|
||||
if (m3u8 == NULL) {
|
||||
fprintf(stderr, "[.] failed to get m3u8 of adamId: %ld\n", adamID);
|
||||
writefull(connfd, NULL, sizeof(NULL));
|
||||
} else {
|
||||
fprintf(stderr, "[.] m3u8 adamId: %ld, url: %s\n", adamID, m3u8);
|
||||
strcat((char *)m3u8, "\n");
|
||||
writefull(connfd, (void *)m3u8, strlen(m3u8));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline void *new_socket_m3u8(void *args) {
|
||||
const int fd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
|
||||
if (fd == -1) {
|
||||
perror("socket");
|
||||
}
|
||||
const int optval = 1;
|
||||
setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));
|
||||
|
||||
static struct sockaddr_in serv_addr = {.sin_family = AF_INET};
|
||||
inet_pton(AF_INET, args_info.host_arg, &serv_addr.sin_addr);
|
||||
serv_addr.sin_port = htons(args_info.m3u8_port_arg);
|
||||
if (bind(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
|
||||
perror("bind");
|
||||
}
|
||||
|
||||
if (listen(fd, 5) == -1) {
|
||||
perror("listen");
|
||||
}
|
||||
|
||||
fprintf(stderr, "[!] listening m3u8 request on %s:%d\n", args_info.host_arg, args_info.m3u8_port_arg);
|
||||
// close(STDOUT_FILENO);
|
||||
|
||||
static struct sockaddr_in peer_addr;
|
||||
static socklen_t peer_addr_size = sizeof(peer_addr);
|
||||
while (1) {
|
||||
const int connfd = accept4(fd, (struct sockaddr *)&peer_addr,
|
||||
&peer_addr_size, SOCK_CLOEXEC);
|
||||
if (connfd == -1) {
|
||||
if (errno == ENETDOWN || errno == EPROTO || errno == ENOPROTOOPT ||
|
||||
errno == EHOSTDOWN || errno == ENONET ||
|
||||
errno == EHOSTUNREACH || errno == EOPNOTSUPP ||
|
||||
errno == ENETUNREACH)
|
||||
continue;
|
||||
perror("accept4");
|
||||
|
||||
}
|
||||
|
||||
handle_m3u8(connfd);
|
||||
|
||||
if (close(connfd) == -1) {
|
||||
perror("close");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
cmdline_parser(argc, argv, &args_info);
|
||||
|
||||
init();
|
||||
const struct shared_ptr ctx = init_ctx();
|
||||
if (args_info.login_given) {
|
||||
amUsername = strtok(args_info.login_arg, ":");
|
||||
amPassword = strtok(NULL, ":");
|
||||
}
|
||||
if (args_info.login_given && !login(ctx)) {
|
||||
fprintf(stderr, "[!] login failed\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
_ZN22SVPlaybackLeaseManagerC2ERKNSt6__ndk18functionIFvRKiEEERKNS1_IFvRKNS0_10shared_ptrIN17storeservicescore19StoreErrorConditionEEEEEE(
|
||||
leaseMgr, &endLeaseCallback, &pbErrCallback);
|
||||
uint8_t autom = 1;
|
||||
_ZN22SVPlaybackLeaseManager25refreshLeaseAutomaticallyERKb(leaseMgr,
|
||||
&autom);
|
||||
_ZN22SVPlaybackLeaseManager12requestLeaseERKb(leaseMgr, &autom);
|
||||
FHinstance = getFootHillInstance();
|
||||
|
||||
if (args_info.m3u8_port_given) {
|
||||
pthread_t m3u8_thread;
|
||||
pthread_create(&m3u8_thread, NULL, &new_socket_m3u8, NULL);
|
||||
} else {
|
||||
fprintf(stderr, "[!] The feature of getting m3u8 is defaultly disabled because it's unstable now. To enable it, please manually specify m3u8-port param.\n");
|
||||
}
|
||||
return new_socket();
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user