diff --git a/.github/workflows/build-for-arm64.yml b/.github/workflows/build-for-arm64.yml new file mode 100644 index 0000000..f9ca836 --- /dev/null +++ b/.github/workflows/build-for-arm64.yml @@ -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 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 31e941b..8c80a7c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,6 +27,9 @@ jobs: - name: Build run: | + mkdir build + cd build + cmake .. make - name: Set outputs diff --git a/.github/workflows/wrapper-qemu.yml b/.github/workflows/wrapper-qemu.yml index 957092b..666067c 100644 --- a/.github/workflows/wrapper-qemu.yml +++ b/.github/workflows/wrapper-qemu.yml @@ -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: | diff --git a/.gitignore b/.gitignore index 02afee2..c96359f 100644 --- a/.gitignore +++ b/.gitignore @@ -89,3 +89,4 @@ rootfs/ .vscode/ wrapper rootfs/system/bin/linker64 +build/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..cc2928d --- /dev/null +++ b/CMakeLists.txt @@ -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} $ $) + +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 +) \ No newline at end of file diff --git a/README.md b/README.md index f8d97c9..0b6c02a 100644 --- a/README.md +++ b/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: -```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]) +# Usage ``` -#### 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 +Usage: 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) ``` - ---- -### 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 -``` \ No newline at end of file +# Special thanks +- Anonymous, for providing the original version of this project and the legacy Frida decryption method. +- chocomint, for providing support for arm64 arch. \ No newline at end of file diff --git a/import.h b/import.h index 18fcc9b..41de5a4 100644 --- a/import.h +++ b/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 +#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 -// 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 -// 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 -// 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, std::__ndk1::allocator > const&) -extern void -_ZN17storeservicescore19CredentialsResponse11setUserNameERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE( - void *, union std_string *); -// storeservicescore::CredentialsResponse::setPassword(std::__ndk1::basic_string, std::__ndk1::allocator > 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, std::__ndk1::allocator > const&, -// std::__ndk1::basic_string, -// std::__ndk1::allocator > 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 > -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, std::__ndk1::allocator > 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 -// 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"; \ No newline at end of file + +// --- 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, ...); diff --git a/main.c b/main.c new file mode 100644 index 0000000..3394a97 --- /dev/null +++ b/main.c @@ -0,0 +1,507 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#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; imark & 1) == 0) { + return str->str; + } + return str->data; +} \ No newline at end of file