forked from sim1222-mirror/wrapper
Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
de7cff2b54 | ||
|
caf52b1f91 | ||
|
b19efdd267 |
51
.github/workflows/build-for-arm64.yml
vendored
Normal file
51
.github/workflows/build-for-arm64.yml
vendored
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
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
|
||||||
|
Dockerfile
|
||||||
|
|
47
.github/workflows/wrapper-qemu.yml
vendored
47
.github/workflows/wrapper-qemu.yml
vendored
@ -1,47 +0,0 @@
|
|||||||
name: wrapper-qemu
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_run:
|
|
||||||
workflows: ["Build"]
|
|
||||||
types: [completed]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
on-success:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Download wrapper-qemu basic image
|
|
||||||
run: wget https://github.com/zhaarey/wrapper/releases/download/wrapper-qemu/wrapper.qcow2
|
|
||||||
|
|
||||||
- name: Mount image
|
|
||||||
run: |
|
|
||||||
sudo apt-get install -y qemu-utils
|
|
||||||
sudo modprobe nbd max_part=8
|
|
||||||
sudo qemu-nbd --connect=/dev/nbd0 wrapper.qcow2
|
|
||||||
sudo mkdir /mnt/wrapper
|
|
||||||
sudo mount /dev/nbd0p3 /mnt/wrapper/
|
|
||||||
|
|
||||||
- name: Download latest artifact
|
|
||||||
uses: dawidd6/action-download-artifact@v6
|
|
||||||
with:
|
|
||||||
github_token: ${{secrets.ACTION_TOKEN}}
|
|
||||||
run_id: ${{ github.event.workflow_run.id }}
|
|
||||||
|
|
||||||
- name: Copy wrapper to image
|
|
||||||
run: |
|
|
||||||
mv Wrapper.x86_64.* wrapper
|
|
||||||
sudo mv wrapper /mnt/wrapper/root/wrapper
|
|
||||||
sudo chmod +x /mnt/wrapper/root/wrapper/wrapper
|
|
||||||
|
|
||||||
- name: Unmount image
|
|
||||||
run: |
|
|
||||||
sudo umount /mnt/wrapper/
|
|
||||||
sudo qemu-nbd --disconnect /dev/nbd0
|
|
||||||
|
|
||||||
- name: Upload artifact
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: wrapper-qemu
|
|
||||||
path: wrapper.qcow2
|
|
@ -9,12 +9,12 @@ set(CMAKE_CXX_STANDARD 11)
|
|||||||
set(ANDROID_NDK_PATH "$ENV{HOME}/android-ndk-r23b")
|
set(ANDROID_NDK_PATH "$ENV{HOME}/android-ndk-r23b")
|
||||||
set(TOOLCHAIN "${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64")
|
set(TOOLCHAIN "${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64")
|
||||||
|
|
||||||
set(CMAKE_C_COMPILER "${TOOLCHAIN}/bin/x86_64-linux-android22-clang")
|
set(CMAKE_C_COMPILER "${TOOLCHAIN}/bin/aarch64-linux-android22-clang")
|
||||||
set(CMAKE_CXX_COMPILER "${TOOLCHAIN}/bin/x86_64-linux-android22-clang++")
|
set(CMAKE_CXX_COMPILER "${TOOLCHAIN}/bin/aarch64-linux-android22-clang++")
|
||||||
set(C_COMPILER "${TOOLCHAIN}/bin/clang")
|
set(C_COMPILER "${TOOLCHAIN}/bin/clang")
|
||||||
|
|
||||||
set(CMAKE_C_FLAGS "-Wall -Werror -O3")
|
set(CMAKE_C_FLAGS "-g -Wall -Werror")
|
||||||
set(CMAKE_CXX_FLAGS "-Wall -Werror -O3")
|
set(CMAKE_CXX_FLAGS "-g -Wall -Werror")
|
||||||
|
|
||||||
set(CMDLINE_SOURCE cmdline.c)
|
set(CMDLINE_SOURCE cmdline.c)
|
||||||
set(HANDLE_SOURCE main.cpp)
|
set(HANDLE_SOURCE main.cpp)
|
||||||
@ -51,7 +51,7 @@ ExternalProject_Add(
|
|||||||
PREFIX ${CMAKE_BINARY_DIR}
|
PREFIX ${CMAKE_BINARY_DIR}
|
||||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
|
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
CONFIGURE_COMMAND ""
|
CONFIGURE_COMMAND ""
|
||||||
BUILD_COMMAND ${C_COMPILER} -O3 -Wall -o wrapper ${WRAPPER_SOURCE}
|
BUILD_COMMAND aarch64-linux-gnu-gcc -o wrapper ${WRAPPER_SOURCE}
|
||||||
BUILD_IN_SOURCE 1
|
BUILD_IN_SOURCE 1
|
||||||
INSTALL_COMMAND ""
|
INSTALL_COMMAND ""
|
||||||
DEPENDS main
|
DEPENDS main
|
||||||
|
21
Dockerfile
21
Dockerfile
@ -1,26 +1,9 @@
|
|||||||
FROM ubuntu:latest AS builder
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
RUN apt update && \
|
|
||||||
apt install aria2 lsb-release wget software-properties-common gnupg unzip build-essential cmake -y
|
|
||||||
|
|
||||||
RUN bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
|
|
||||||
|
|
||||||
RUN aria2c -o android-ndk-r23b-linux.zip https://dl.google.com/android/repository/android-ndk-r23b-linux.zip
|
|
||||||
RUN unzip -q -d ~ android-ndk-r23b-linux.zip
|
|
||||||
|
|
||||||
COPY . /app
|
|
||||||
|
|
||||||
RUN mkdir /app/build && cd /app/build && cmake .. && make
|
|
||||||
|
|
||||||
FROM ubuntu:latest
|
FROM ubuntu:latest
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY --from=builder /app/rootfs/ /app/rootfs/
|
COPY . /app
|
||||||
COPY --from=builder /app/wrapper /app/
|
|
||||||
ENV args ""
|
ENV args ""
|
||||||
|
|
||||||
CMD ["bash", "-c", "./wrapper ${args}"]
|
CMD ["bash", "-c", "./wrapper ${args}"]
|
||||||
|
|
||||||
EXPOSE 10020 10020
|
EXPOSE 10020 20020
|
77
README.md
77
README.md
@ -1,17 +1,14 @@
|
|||||||
## 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
|
# Install
|
||||||
#### Only support Linux x86_64 and arm64.
|
Get the pre-built version from this project's Actions.
|
||||||
For best results, it's recommended to use **Windows Subsystem for Linux (WSL)**.
|
|
||||||
|
|
||||||
# Special thanks
|
Or you can refer to the Actions configuration file for compilation.
|
||||||
- Anonymous, for providing the original version of this project and the legacy Frida decryption method.
|
|
||||||
- chocomint, for providing support for arm64 arch.
|
|
||||||
|
|
||||||
---
|
# Docker
|
||||||
### Version 2 Docker
|
|
||||||
Available for x86_64 and arm64. Need to download prebuilt version from releases or actions.
|
Available for x86_64 and arm64. Need to download prebuilt version from releases or actions.
|
||||||
|
|
||||||
Build image: `docker build --tag wrapper .`
|
Build image: `docker build --tag wrapper .`
|
||||||
@ -20,52 +17,20 @@ Login: `docker run -v ./rootfs/data:/app/rootfs/data -p 10020:10020 -e args="-L
|
|||||||
|
|
||||||
Run: `docker run -v ./rootfs/data:/app/rootfs/data -p 10020:10020 -e args="-H 0.0.0.0" wrapper`
|
Run: `docker run -v ./rootfs/data:/app/rootfs/data -p 10020:10020 -e args="-H 0.0.0.0" wrapper`
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
|
||||||
### 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])
|
|
||||||
```
|
```
|
||||||
#### Installation x86_64:
|
Usage: wrapper [OPTION]...
|
||||||
```shell
|
|
||||||
sudo -i
|
-h, --help Print help and exit
|
||||||
wget "https://github.com/zhaarey/wrapper/releases/download/linux.V2/wrapper.x86_64.tar.gz"
|
-V, --version Print version and exit
|
||||||
mkdir wrapper
|
-H, --host=STRING (default=`127.0.0.1')
|
||||||
tar -xzf wrapper.x86_64.tar.gz -C wrapper
|
-D, --decrypt-port=INT (default=`10020')
|
||||||
cd wrapper
|
-M, --m3u8-port=INT (default=`20020')
|
||||||
./wrapper
|
-P, --proxy=STRING (default=`')
|
||||||
```
|
-L, --login=STRING (username:password)
|
||||||
#### Installation arm64:
|
-F, --code-from-file (default=off)
|
||||||
```shell
|
|
||||||
sudo -i
|
|
||||||
wget "https://github.com/zhaarey/wrapper/releases/download/arm64/wrapper.arm64.tar.gz"
|
|
||||||
mkdir wrapper
|
|
||||||
tar -xzf wrapper.arm64.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.
|
||||||
### Version 1
|
|
||||||
#### Usage:
|
|
||||||
`./wrapper [port] ([username] [password])`
|
|
||||||
#### Installation only x86_64:
|
|
||||||
```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
|
|
||||||
```
|
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
File autogenerated by gengetopt version 2.23
|
File autogenerated by gengetopt version 2.23
|
||||||
generated with the following command:
|
generated with the following command:
|
||||||
gengetopt
|
gengetopt -i wrapper.ggo
|
||||||
|
|
||||||
The developers of gengetopt consider the fixed text that goes in all
|
The developers of gengetopt consider the fixed text that goes in all
|
||||||
gengetopt output files to be in the public domain:
|
gengetopt output files to be in the public domain:
|
||||||
|
10
compose.yaml
10
compose.yaml
@ -1,10 +0,0 @@
|
|||||||
services:
|
|
||||||
wrapper:
|
|
||||||
image: sim1222/wrapper:latest
|
|
||||||
build: .
|
|
||||||
volumes:
|
|
||||||
- ./rootfs/data:/app/rootfs/data
|
|
||||||
ports:
|
|
||||||
- 10020:10020
|
|
||||||
environment:
|
|
||||||
- args="-H 0.0.0.0"
|
|
546
import.h
546
import.h
@ -1,290 +1,288 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
struct shared_ptr {
|
#include "structs.h"
|
||||||
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 *);
|
|
||||||
|
|
||||||
extern void _resolv_set_nameservers_for_net(unsigned netid, const char **servers, int numservers, const char *domains);
|
extern void _resolv_set_nameservers_for_net(unsigned netid, const char **servers, int numservers, const char *domains);
|
||||||
|
|
||||||
extern void
|
// --- dialog / interface ---
|
||||||
_ZN14FootHillConfig6configERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE(union std_string *);
|
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
|
// --- credentials ---
|
||||||
_ZNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEE11make_sharedIJRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEES3_DpOT_(
|
extern uint8_t _ZNK17storeservicescore18CredentialsRequest28requiresHSA2VerificationCodeEv(void *);
|
||||||
struct shared_ptr *, union std_string *);
|
extern void *_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore19CredentialsResponseENS_9allocatorIS2_EEEE;
|
||||||
extern void _ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_(
|
extern void _ZN17storeservicescore19CredentialsResponse11setUserNameERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||||
struct shared_ptr *);
|
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
|
// --- decryption ---
|
||||||
_ZN17storeservicescore14RequestContext24setPresentationInterfaceERKNSt6__ndk110shared_ptrINS_21PresentationInterfaceEEE(
|
extern void _ZN21SVFootHillSessionCtrl9cleanKeysERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE(void *, union std_string *);
|
||||||
void *, struct shared_ptr *);
|
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>
|
// --- playback ---
|
||||||
// const&)
|
extern void _ZN22SVPlaybackLeaseManagerC2ERKNSt6__ndk18functionIFvRKiEEERKNS1_IFvRKNS0_10shared_ptrIN17storeservicescore19StoreErrorConditionEEEEEE(void *, void *, void *);
|
||||||
extern void
|
|
||||||
_ZN22SVPlaybackLeaseManagerC2ERKNSt6__ndk18functionIFvRKiEEERKNS1_IFvRKNS0_10shared_ptrIN17storeservicescore19StoreErrorConditionEEEEEE(
|
|
||||||
void *, void *, void *);
|
|
||||||
extern void _ZN22SVPlaybackLeaseManager25refreshLeaseAutomaticallyERKb(void *, uint8_t *);
|
extern void _ZN22SVPlaybackLeaseManager25refreshLeaseAutomaticallyERKb(void *, uint8_t *);
|
||||||
extern void _ZN22SVPlaybackLeaseManager12requestLeaseERKb(void *, uint8_t *);
|
extern void _ZN22SVPlaybackLeaseManager12requestLeaseERKb(void *, uint8_t *);
|
||||||
|
|
||||||
// storeservicescore::ProtocolDialogResponse::setSelectedButton(std::__ndk1::shared_ptr<storeservicescore::ProtocolButton>
|
extern void _ZN22SVPlaybackLeaseManager12requestAssetERKmRKNSt6__ndk16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKb(void *, void *, unsigned long *, struct std_vector *, uint8_t *);
|
||||||
// const&)
|
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) {
|
||||||
extern void
|
asm volatile(
|
||||||
_ZN17storeservicescore22ProtocolDialogResponse17setSelectedButtonERKNSt6__ndk110shared_ptrINS_14ProtocolButtonEEE(
|
"mov x8, %0\n"
|
||||||
void *, struct shared_ptr *);
|
"mov x0, %1\n"
|
||||||
// storeservicescore::ProtocolDialog::title() const
|
"mov x1, %2\n"
|
||||||
extern union std_string *_ZNK17storeservicescore14ProtocolDialog5titleEv(void *);
|
"mov x2, %3\n"
|
||||||
// storeservicescore::ProtocolDialog::message() const
|
"mov x3, %4\n"
|
||||||
extern union std_string *_ZNK17storeservicescore14ProtocolDialog7messageEv(void *);
|
"bl _ZN22SVPlaybackLeaseManager12requestAssetERKmRKNSt6__ndk16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKb\n"
|
||||||
|
:
|
||||||
extern union std_string *_ZNK17storeservicescore18CredentialsRequest5titleEv(void *);
|
: "r" (result), "r" (leaseMgr), "r" (adam), "r" (hls_param), "r" (z0)
|
||||||
extern union std_string *_ZNK17storeservicescore18CredentialsRequest7messageEv(void *);
|
: "x8", "x0", "x1", "x2", "x3", "lr"
|
||||||
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 int _ZNK23SVPlaybackAssetResponse13hasValidAssetEv(void *);
|
extern int _ZNK23SVPlaybackAssetResponse13hasValidAssetEv(void *);
|
||||||
extern struct shared_ptr *_ZNK23SVPlaybackAssetResponse13playbackAssetEv(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 android_id = "dc28071e981c439e";
|
||||||
const char *const fairplayCert = "MIIEzjCCA7agAwIBAgIIAXAVjHFZDjgwDQYJKoZIhvcNAQEFBQAwfzELMAkGA1UEBhMCVVMxEz"
|
|
||||||
"ARBgNVBAoMCkFwcGxlIEluYy4xJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9y"
|
// --- interface ---
|
||||||
"aXR5MTMwMQYDVQQDDCpBcHBsZSBLZXkgU2VydmljZXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdH"
|
extern void _ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_(struct shared_ptr *);
|
||||||
"kwHhcNMTIwNzI1MTgwMjU4WhcNMTQwNzI2MTgwMjU4WjAwMQswCQYDVQQGEwJVUzESMBAGA1UE"
|
void _ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_ASM(struct shared_ptr *apInterface) {
|
||||||
"CgwJQXBwbGUgSW5jMQ0wCwYDVQQDDARGUFMxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ"
|
asm volatile(
|
||||||
"CqZ9IbMt0J0dTKQN4cUlfeQRY9bcnbnP95HFv9A16Yayh4xQzRLAQqVSmisZtBK2/nawZcDmcs"
|
"mov x8, %0\n"
|
||||||
"+XapBojRb+jDM4Dzk6/Ygdqo8LoA+BE1zipVyalGLj8Y86hTC9QHX8i05oWNCDIlmabjjWvFBo"
|
"bl _ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_\n"
|
||||||
"EOk+ezOAPg8c0SET38x5u+TwIDAQABo4ICHzCCAhswHQYDVR0OBBYEFPP6sfTWpOQ5Sguf5W3Y"
|
:
|
||||||
"0oibbEc3MAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUY+RHVMuFcVlGLIOszEQxZGcDLL4wge"
|
: "r" (apInterface)
|
||||||
"IGA1UdIASB2jCB1zCB1AYJKoZIhvdjZAUBMIHGMIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNl"
|
: "x8", "x0", "lr"
|
||||||
"IG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZi"
|
);
|
||||||
"B0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVz"
|
}
|
||||||
"ZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbW"
|
extern void _ZN20androidstoreservices28AndroidPresentationInterface16setDialogHandlerEPFvlNSt6__ndk110shared_ptrIN17storeservicescore14ProtocolDialogEEENS2_INS_36AndroidProtocolDialogResponseHandlerEEEE(void *, void (*)(long, struct shared_ptr *, struct shared_ptr *));
|
||||||
"VudHMuMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwuYXBwbGUuY29tL2tleXNlcnZpY2Vz"
|
extern void _ZN20androidstoreservices28AndroidPresentationInterface21setCredentialsHandlerEPFvNSt6__ndk110shared_ptrIN17storeservicescore18CredentialsRequestEEENS2_INS_33AndroidCredentialsResponseHandlerEEEE(void *, void (*)(struct shared_ptr *, struct shared_ptr *));
|
||||||
"LmNybDAOBgNVHQ8BAf8EBAMCBSAwFAYLKoZIhvdjZAYNAQUBAf8EAgUAMBsGCyqGSIb3Y2QGDQ"
|
void initPresentationInterface(
|
||||||
"EGAQH/BAkBAAAAAQAAAAEwKQYLKoZIhvdjZAYNAQMBAf8EFwF+bjsY57ASVFmeehD2bdu6HLGB"
|
struct shared_ptr *apInterface,
|
||||||
"xeC2MEEGCyqGSIb3Y2QGDQEEAQH/BC8BHrKviHJf/Se/ibc7T0/55Bt1GePzaYBVfgF3ZiNuV9"
|
void (*dialog_handler)(long, struct shared_ptr *, struct shared_ptr *),
|
||||||
"3z8P3qsawAqAXzzh9o5DANBgkqhkiG9w0BAQUFAAOCAQEAVGyCtuLYcYb/aPijBCtaemxuV0Io"
|
void (*credentials_handler)(struct shared_ptr *, struct shared_ptr *)
|
||||||
"kXJn3EgmwYHZynaR6HZmeGRUp9p3f8EXu6XPSekKCCQi+a86hXX9RfnGEjRdvtP+jts5MDSKuU"
|
)
|
||||||
"Ioaqce8cLX2dpUOZXdf3lR0IQM0kXHb5boNGBsmbTLVifqeMsexfZryGw2hE/4WDOJdGQm1gMJ"
|
{
|
||||||
"ZU4jP1b/HSLNIUhHWAaMeWtcJTPRBucR4urAtvvtOWD88mriZNHG+veYw55b+qA36PSqDPMbku"
|
_ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_ASM(apInterface);
|
||||||
"9xTY7fsMa6mxIRmwULQgi8nOk1wNhw3ZO0qUKtaCO3gSqWdloecxpxUQSZCSW7tWPkpXXwDZqe"
|
_ZN20androidstoreservices28AndroidPresentationInterface16setDialogHandlerEPFvlNSt6__ndk110shared_ptrIN17storeservicescore14ProtocolDialogEEENS2_INS_36AndroidProtocolDialogResponseHandlerEEEE(apInterface->obj, dialog_handler);
|
||||||
"gUkij9xMFS1pr37RIjCCBVAwggQ4oAMCAQICEEVKuaGraq1Cp4z6TFOeVfUwDQYJKoZIhvcNAQ"
|
_ZN20androidstoreservices28AndroidPresentationInterface21setCredentialsHandlerEPFvNSt6__ndk110shared_ptrIN17storeservicescore18CredentialsRequestEEENS2_INS_33AndroidCredentialsResponseHandlerEEEE(apInterface->obj, credentials_handler);
|
||||||
"ELBQAwUDEsMCoGA1UEAwwjQXBwbGUgRlAgU2VydmljZSBFbmFibGUgUlNBIENBIC0gRzExEzAR"
|
}
|
||||||
"BgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMB4XDTIwMDQwNzIwMjY0NFoXDTIyMDQwNz"
|
|
||||||
"IwMjY0NFowWjEhMB8GA1UEAwwYZnBzMjA0OC5pdHVuZXMuYXBwbGUuY29tMRMwEQYDVQQLDApB"
|
extern void _ZN17storeservicescore14RequestContext24setPresentationInterfaceERKNSt6__ndk110shared_ptrINS_21PresentationInterfaceEEE(void *, struct shared_ptr *);
|
||||||
"cHBsZSBJbmMuMRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzCCASIwDQYJKoZIhv"
|
void setPresentationInterface(struct shared_ptr *reqCtx, struct shared_ptr *apInterface)
|
||||||
"cNAQEBBQADggEPADCCAQoCggEBAJNoUHuTRLafofQgIRgGa2TFIf+bsFDMjs+y3Ep1xCzFLE4Q"
|
{
|
||||||
"bnwG6OG0duKUl5IoGUsouzZk9iGsXz5k3ESLOWKz2BFrDTvGrzAcuLpH66jJHGsk/l+ZzsDOJa"
|
_ZN17storeservicescore14RequestContext24setPresentationInterfaceERKNSt6__ndk110shared_ptrINS_21PresentationInterfaceEEE(reqCtx->obj, apInterface);
|
||||||
"oQ22pu0JvzYzW8/yEKvpE6JF/2dsC6V9RDTri3VWFxrl5uh8czzncoEQoRcQsSatHzs4tw/QdH"
|
}
|
||||||
"FtBIigqxqr4R7XiCaHbsQmqbP9h7oxRs/6W/DDA2BgkuFY1ocX/8dTjmH6szKPfGt3KaYCwy3f"
|
|
||||||
"uRC+FibTyohtvmlXsYhm7AUzorwWIwN/MbiFQ0OHHtDomIy71wDcTNMnY0jZYtGmIlJETAgYcC"
|
|
||||||
"AwEAAaOCAhowggIWMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUrI/yBkpV623/IeMrXzs8fC"
|
// --- auth flow ---
|
||||||
"7VkZkwRQYIKwYBBQUHAQEEOTA3MDUGCCsGAQUFBzABhilodHRwOi8vb2NzcC5hcHBsZS5jb20v"
|
extern void _ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_(struct shared_ptr *, struct shared_ptr *);
|
||||||
"b2NzcDAzLWZwc3J2cnNhZzEwMzCBwwYDVR0gBIG7MIG4MIG1BgkqhkiG92NkBQEwgacwgaQGCC"
|
void _ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_ASM(struct shared_ptr *flow, struct shared_ptr *reqCtx) {
|
||||||
"sGAQUFBwICMIGXDIGUUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkg"
|
asm volatile(
|
||||||
"YXNzdW1lcyBhY2NlcHRhbmNlIG9mIGFueSBhcHBsaWNhYmxlIHRlcm1zIGFuZCBjb25kaXRpb2"
|
"mov x8, %0\n"
|
||||||
"5zIG9mIHVzZSBhbmQvb3IgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjAdBgNV"
|
"mov x0, %1\n"
|
||||||
"HQ4EFgQU2RpCSSHFXeoZQQWxbwJuRZ9RrIEwDgYDVR0PAQH/BAQDAgUgMBQGCyqGSIb3Y2QGDQ"
|
"bl _ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_\n"
|
||||||
"EFAQH/BAIFADAjBgsqhkiG92NkBg0BBgEB/wQRAQAAAAMAAAABAAAAAgAAAAMwOQYLKoZIhvdj"
|
:
|
||||||
"ZAYNAQMBAf8EJwG+pUeWbeZBUI0PikyFwSggL5dHaeugSDoQKwcP28csLuh5wplpATAzBgsqhk"
|
: "r" (flow), "r" (reqCtx)
|
||||||
"iG92NkBg0BBAEB/wQhAfl9TGjP/UY9TyQzYsn8sX9ZvHChok9QrrUhtAyWR1yCMA0GCSqGSIb3"
|
: "x8", "x0", "lr"
|
||||||
"DQEBCwUAA4IBAQBNMzZ6llQ0laLXsrmyVieuoW9+pHeAaDJ7cBiQLjM3ZdIO3Gq5dkbWYYYwJw"
|
);
|
||||||
"ymdxZ74WGZMuVv3ueJKcxG1jAhCRhr0lb6QaPaQQSNW+xnoesb3CLA0RzrcgBp/9WFZNdttJOS"
|
}
|
||||||
"yC93lQmiE0r5RqPpe/IWUzwoZxri8qnsghVFxCBEcMB+U4PJR8WeAkPrji8po2JLYurvgNRhGk"
|
extern void _ZN17storeservicescore16AuthenticateFlow3runEv(void *);
|
||||||
"DKcAFPuGEpXdF86hPts+07zazsP0fBjBSVgP3jqb8G31w5W+O+wBW0B9uCf3s0vXU4LuJTAyww"
|
extern struct shared_ptr *_ZNK17storeservicescore16AuthenticateFlow8responseEv(void *);
|
||||||
"s2ImZ7O/AaY/uXWOyIUMUKPgL1/QJieB7pBoENIJ2CeJS2M3iv00ssmCmTEJ";
|
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, ...);
|
||||||
|
136
main.c
136
main.c
@ -177,80 +177,31 @@ static inline void init() {
|
|||||||
// _ZN8FootHill24defaultContextIdentifierEv(foothill);
|
// _ZN8FootHill24defaultContextIdentifierEv(foothill);
|
||||||
|
|
||||||
struct shared_ptr GUID;
|
struct shared_ptr GUID;
|
||||||
_ZN17storeservicescore10DeviceGUID8instanceEv(&GUID);
|
_ZN17storeservicescore10DeviceGUID8instanceEvASM(&GUID);
|
||||||
|
|
||||||
static uint8_t ret[88];
|
static uint8_t ret[88];
|
||||||
static unsigned int conf3 = 29;
|
static unsigned int conf3 = 29;
|
||||||
static uint8_t conf4 = 1;
|
static uint8_t conf4 = 1;
|
||||||
_ZN17storeservicescore10DeviceGUID9configureERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKjRKb(
|
_ZN17storeservicescore10DeviceGUID9configureERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKjRKbASM(
|
||||||
&ret, GUID.obj, &conf1, &conf2, &conf3, &conf4);
|
&ret, GUID.obj, &conf1, &conf2, &conf3, &conf4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct shared_ptr init_ctx() {
|
static inline struct shared_ptr init_ctx() {
|
||||||
fprintf(stderr, "[+] initializing ctx...\n");
|
fprintf(stderr, "[+] initializing ctx...\n");
|
||||||
union std_string strBuf =
|
|
||||||
new_std_string("/data/data/com.apple.android.music/files/mpl_db");
|
|
||||||
|
|
||||||
struct shared_ptr reqCtx;
|
struct shared_ptr *reqCtx = newRequestContext("/data/data/com.apple.android.music/files/mpl_db");
|
||||||
_ZNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEE11make_sharedIJRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEES3_DpOT_(
|
struct shared_ptr *reqCtxCfg = getRequestContextConfig();
|
||||||
&reqCtx, &strBuf);
|
|
||||||
|
|
||||||
static uint8_t ptr[480];
|
prepareRequestContextConfig(reqCtxCfg);
|
||||||
*(void **)(ptr) =
|
configureRequestContext(reqCtx);
|
||||||
&_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore20RequestContextConfigENS_9allocatorIS2_EEEE +
|
|
||||||
2;
|
|
||||||
struct shared_ptr reqCtxCfg = {.obj = ptr + 32, .ctrl_blk = ptr};
|
|
||||||
|
|
||||||
_ZN17storeservicescore20RequestContextConfigC2Ev(reqCtxCfg.obj);
|
|
||||||
// _ZN17storeservicescore20RequestContextConfig9setCPFlagEb(reqCtx.obj, 1);
|
|
||||||
_ZN17storeservicescore20RequestContextConfig20setBaseDirectoryPathERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
|
||||||
reqCtxCfg.obj, &strBuf);
|
|
||||||
strBuf = new_std_string("Music");
|
|
||||||
_ZN17storeservicescore20RequestContextConfig19setClientIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
|
||||||
reqCtxCfg.obj, &strBuf);
|
|
||||||
strBuf = new_std_string("4.9");
|
|
||||||
_ZN17storeservicescore20RequestContextConfig20setVersionIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
|
||||||
reqCtxCfg.obj, &strBuf);
|
|
||||||
strBuf = new_std_string("Android");
|
|
||||||
_ZN17storeservicescore20RequestContextConfig21setPlatformIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
|
||||||
reqCtxCfg.obj, &strBuf);
|
|
||||||
strBuf = new_std_string("10");
|
|
||||||
_ZN17storeservicescore20RequestContextConfig17setProductVersionERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
|
||||||
reqCtxCfg.obj, &strBuf);
|
|
||||||
strBuf = new_std_string("Samsung S9");
|
|
||||||
_ZN17storeservicescore20RequestContextConfig14setDeviceModelERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
|
||||||
reqCtxCfg.obj, &strBuf);
|
|
||||||
strBuf = new_std_string("7663313");
|
|
||||||
_ZN17storeservicescore20RequestContextConfig15setBuildVersionERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
|
||||||
reqCtxCfg.obj, &strBuf);
|
|
||||||
strBuf = new_std_string("en-US");
|
|
||||||
_ZN17storeservicescore20RequestContextConfig19setLocaleIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
|
||||||
reqCtxCfg.obj, &strBuf);
|
|
||||||
_ZN17storeservicescore20RequestContextConfig21setLanguageIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
|
||||||
reqCtxCfg.obj, &strBuf);
|
|
||||||
|
|
||||||
_ZN21RequestContextManager9configureERKNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEEE(
|
|
||||||
&reqCtx);
|
|
||||||
static uint8_t buf[88];
|
static uint8_t buf[88];
|
||||||
_ZN17storeservicescore14RequestContext4initERKNSt6__ndk110shared_ptrINS_20RequestContextConfigEEE(
|
initRequestContext(buf, reqCtx, reqCtxCfg);
|
||||||
&buf, reqCtx.obj, &reqCtxCfg);
|
setFairPlayDirectoryPath(reqCtx, "/data/data/com.apple.android.music/files");
|
||||||
strBuf = new_std_string("/data/data/com.apple.android.music/files");
|
initPresentationInterface(&apInf, &dialogHandler, &credentialHandler);
|
||||||
_ZN17storeservicescore14RequestContext24setFairPlayDirectoryPathERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
setPresentationInterface(reqCtx, &apInf);
|
||||||
reqCtx.obj, &strBuf);
|
|
||||||
|
|
||||||
_ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_(
|
return *reqCtx;
|
||||||
&apInf);
|
|
||||||
|
|
||||||
_ZN20androidstoreservices28AndroidPresentationInterface16setDialogHandlerEPFvlNSt6__ndk110shared_ptrIN17storeservicescore14ProtocolDialogEEENS2_INS_36AndroidProtocolDialogResponseHandlerEEEE(
|
|
||||||
apInf.obj, &dialogHandler);
|
|
||||||
|
|
||||||
_ZN20androidstoreservices28AndroidPresentationInterface21setCredentialsHandlerEPFvNSt6__ndk110shared_ptrIN17storeservicescore18CredentialsRequestEEENS2_INS_33AndroidCredentialsResponseHandlerEEEE(
|
|
||||||
apInf.obj, &credentialHandler);
|
|
||||||
|
|
||||||
_ZN17storeservicescore14RequestContext24setPresentationInterfaceERKNSt6__ndk110shared_ptrINS_21PresentationInterfaceEEE(
|
|
||||||
reqCtx.obj, &apInf);
|
|
||||||
|
|
||||||
return reqCtx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void *endLeaseCallback;
|
extern void *endLeaseCallback;
|
||||||
@ -259,7 +210,7 @@ extern void *pbErrCallback;
|
|||||||
inline static uint8_t login(struct shared_ptr reqCtx) {
|
inline static uint8_t login(struct shared_ptr reqCtx) {
|
||||||
fprintf(stderr, "[+] logging in...\n");
|
fprintf(stderr, "[+] logging in...\n");
|
||||||
struct shared_ptr flow;
|
struct shared_ptr flow;
|
||||||
_ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_(
|
_ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_ASM(
|
||||||
&flow, &reqCtx);
|
&flow, &reqCtx);
|
||||||
_ZN17storeservicescore16AuthenticateFlow3runEv(flow.obj);
|
_ZN17storeservicescore16AuthenticateFlow3runEv(flow.obj);
|
||||||
struct shared_ptr *resp =
|
struct shared_ptr *resp =
|
||||||
@ -324,10 +275,10 @@ inline static void *getKdContext(const char *const adam,
|
|||||||
union std_string serverUri = new_std_string(
|
union std_string serverUri = new_std_string(
|
||||||
"https://play.itunes.apple.com/WebObjects/MZPlay.woa/music/fps");
|
"https://play.itunes.apple.com/WebObjects/MZPlay.woa/music/fps");
|
||||||
union std_string protocolType = new_std_string("simplified");
|
union std_string protocolType = new_std_string("simplified");
|
||||||
union std_string fpsCert = new_std_string(fairplayCert);
|
union std_string fpsCert = new_std_string(fairplay_cert);
|
||||||
|
|
||||||
struct shared_ptr persistK = {.obj = NULL};
|
struct shared_ptr persistK = {.obj = NULL};
|
||||||
_ZN21SVFootHillSessionCtrl16getPersistentKeyERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_S8_S8_S8_S8_S8_(
|
_ZN21SVFootHillSessionCtrl16getPersistentKeyERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_S8_S8_S8_S8_S8_ASM(
|
||||||
&persistK, FHinstance, &defaultId, &defaultId, &keyUri, &keyFormat,
|
&persistK, FHinstance, &defaultId, &defaultId, &keyUri, &keyFormat,
|
||||||
&keyFormatVer, &serverUri, &protocolType, &fpsCert);
|
&keyFormatVer, &serverUri, &protocolType, &fpsCert);
|
||||||
|
|
||||||
@ -335,7 +286,7 @@ inline static void *getKdContext(const char *const adam,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
struct shared_ptr SVFootHillPContext;
|
struct shared_ptr SVFootHillPContext;
|
||||||
_ZN21SVFootHillSessionCtrl14decryptContextERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKN11SVDecryptor15SVDecryptorTypeERKb(
|
_ZN21SVFootHillSessionCtrl14decryptContextERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKN11SVDecryptor15SVDecryptorTypeERKbASM(
|
||||||
&SVFootHillPContext, FHinstance, persistK.obj);
|
&SVFootHillPContext, FHinstance, persistK.obj);
|
||||||
|
|
||||||
if (SVFootHillPContext.obj == NULL)
|
if (SVFootHillPContext.obj == NULL)
|
||||||
@ -467,41 +418,16 @@ const char* get_m3u8_method_play(uint8_t leaseMgr[16], unsigned long adam) {
|
|||||||
struct std_vector HLSParam = new_std_vector(&HLS);
|
struct std_vector HLSParam = new_std_vector(&HLS);
|
||||||
static uint8_t z0 = 0;
|
static uint8_t z0 = 0;
|
||||||
struct shared_ptr ptr_result;
|
struct shared_ptr ptr_result;
|
||||||
_ZN22SVPlaybackLeaseManager12requestAssetERKmRKNSt6__ndk16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKb(
|
_ZN22SVPlaybackLeaseManager12requestAssetERKmRKNSt6__ndk16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKbASM(
|
||||||
&ptr_result, leaseMgr, &adam, &HLSParam, &z0
|
&ptr_result, leaseMgr, &adam, &HLSParam, &z0
|
||||||
);
|
);
|
||||||
|
|
||||||
if (ptr_result.obj == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_ZNK23SVPlaybackAssetResponse13hasValidAssetEv(ptr_result.obj)) {
|
if (_ZNK23SVPlaybackAssetResponse13hasValidAssetEv(ptr_result.obj)) {
|
||||||
struct shared_ptr *playbackAsset = _ZNK23SVPlaybackAssetResponse13playbackAssetEv(ptr_result.obj);
|
struct shared_ptr *playbackAsset = _ZNK23SVPlaybackAssetResponse13playbackAssetEv(ptr_result.obj);
|
||||||
if (playbackAsset == NULL || playbackAsset->obj == NULL) {
|
union std_string *m3u8 = malloc(24);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
union std_string *m3u8 = malloc(sizeof(union std_string));
|
|
||||||
if (m3u8 == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *playbackObj = playbackAsset->obj;
|
void *playbackObj = playbackAsset->obj;
|
||||||
_ZNK17storeservicescore13PlaybackAsset9URLStringEv(m3u8, playbackObj);
|
_ZNK17storeservicescore13PlaybackAsset9URLStringEvASM(m3u8, playbackObj);
|
||||||
|
|
||||||
if (m3u8 == NULL || std_string_data(m3u8) == NULL) {
|
|
||||||
free(m3u8);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *m3u8_str = std_string_data(m3u8);
|
const char *m3u8_str = std_string_data(m3u8);
|
||||||
if (m3u8_str) {
|
return m3u8_str;
|
||||||
char *result = strdup(m3u8_str); // Make a copy
|
|
||||||
free(m3u8);
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -526,17 +452,11 @@ void handle_m3u8(const int connfd) {
|
|||||||
const char *m3u8 = get_m3u8_method_play(leaseMgr, adamID);
|
const char *m3u8 = get_m3u8_method_play(leaseMgr, adamID);
|
||||||
if (m3u8 == NULL) {
|
if (m3u8 == NULL) {
|
||||||
fprintf(stderr, "[.] failed to get m3u8 of adamId: %ld\n", adamID);
|
fprintf(stderr, "[.] failed to get m3u8 of adamId: %ld\n", adamID);
|
||||||
writefull(connfd, "\n", sizeof("\n"));
|
writefull(connfd, NULL, sizeof(NULL));
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "[.] m3u8 adamId: %ld, url: %s\n", adamID, m3u8);
|
fprintf(stderr, "[.] m3u8 adamId: %ld, url: %s\n", adamID, m3u8);
|
||||||
char *with_newline = malloc(strlen(m3u8) + 2);
|
strcat((char *)m3u8, "\n");
|
||||||
if (with_newline) {
|
writefull(connfd, (void *)m3u8, strlen(m3u8));
|
||||||
strcpy(with_newline, m3u8);
|
|
||||||
strcat(with_newline, "\n");
|
|
||||||
writefull(connfd, with_newline, strlen(with_newline));
|
|
||||||
free(with_newline);
|
|
||||||
}
|
|
||||||
free((void *)m3u8);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -605,11 +525,13 @@ int main(int argc, char *argv[]) {
|
|||||||
_ZN22SVPlaybackLeaseManager25refreshLeaseAutomaticallyERKb(leaseMgr,
|
_ZN22SVPlaybackLeaseManager25refreshLeaseAutomaticallyERKb(leaseMgr,
|
||||||
&autom);
|
&autom);
|
||||||
_ZN22SVPlaybackLeaseManager12requestLeaseERKb(leaseMgr, &autom);
|
_ZN22SVPlaybackLeaseManager12requestLeaseERKb(leaseMgr, &autom);
|
||||||
FHinstance = _ZN21SVFootHillSessionCtrl8instanceEv();
|
FHinstance = getFootHillInstance();
|
||||||
|
|
||||||
pthread_t m3u8_thread;
|
|
||||||
pthread_create(&m3u8_thread, NULL, &new_socket_m3u8, NULL);
|
|
||||||
pthread_detach(m3u8_thread);
|
|
||||||
|
|
||||||
|
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();
|
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.
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