mirror of
https://github.com/zhaarey/wrapper.git
synced 2025-07-01 23:59:56 +09:00
Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
f3b208fabb | |||
cbb7f3f62f | |||
662866981e | |||
de7cff2b54 | |||
caf52b1f91 | |||
b19efdd267 | |||
ca1f26a950 | |||
639f50bf4d | |||
57dd342fd7 | |||
1077660bcc | |||
976118d948 | |||
86d1c1a507 | |||
aa1886e487 | |||
b96afbbd3a | |||
c37d47c2ec | |||
4fdc3aabce | |||
5e687bed4f | |||
cfd4ad5fd1 |
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
|
||||
|
49
.github/workflows/build.yml
vendored
Normal file
49
.github/workflows/build.yml
vendored
Normal file
@ -0,0 +1,49 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
|
||||
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: 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.x86_64.${{ steps.vars.outputs.sha_short }}
|
||||
include-hidden-files: true
|
||||
path: |
|
||||
rootfs
|
||||
wrapper
|
||||
Dockerfile
|
||||
|
||||
|
92
.gitignore
vendored
Normal file
92
.gitignore
vendored
Normal file
@ -0,0 +1,92 @@
|
||||
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Object files
|
||||
*.o
|
||||
*.ko
|
||||
*.obj
|
||||
*.elf
|
||||
|
||||
# Linker output
|
||||
*.ilk
|
||||
*.map
|
||||
*.exp
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Libraries
|
||||
*.lib
|
||||
*.a
|
||||
*.la
|
||||
*.lo
|
||||
|
||||
# Shared objects (inc. Windows DLLs)
|
||||
*.dll
|
||||
*.so
|
||||
*.so.*
|
||||
*.dylib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
*.i*86
|
||||
*.x86_64
|
||||
*.hex
|
||||
|
||||
# Debug files
|
||||
*.dSYM/
|
||||
*.su
|
||||
*.idb
|
||||
*.pdb
|
||||
|
||||
# Kernel Module Compile Results
|
||||
*.mod*
|
||||
*.cmd
|
||||
.tmp_versions/
|
||||
modules.order
|
||||
Module.symvers
|
||||
Mkfile.old
|
||||
dkms.conf
|
||||
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Compiled Object files
|
||||
*.slo
|
||||
*.lo
|
||||
*.o
|
||||
*.obj
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Compiled Dynamic libraries
|
||||
*.so
|
||||
*.dylib
|
||||
*.dll
|
||||
|
||||
# Fortran module files
|
||||
*.mod
|
||||
*.smod
|
||||
|
||||
# Compiled Static libraries
|
||||
*.lai
|
||||
*.la
|
||||
*.a
|
||||
*.lib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
|
||||
rootfs/
|
||||
.vscode/
|
||||
wrapper
|
||||
rootfs/system/bin/linker64
|
||||
build/
|
58
CMakeLists.txt
Normal file
58
CMakeLists.txt
Normal file
@ -0,0 +1,58 @@
|
||||
cmake_minimum_required(VERSION 3.25)
|
||||
|
||||
project(wrapper)
|
||||
include(ExternalProject)
|
||||
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
|
||||
set(ANDROID_NDK_PATH "$ENV{HOME}/android-ndk-r23b")
|
||||
set(TOOLCHAIN "${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64")
|
||||
|
||||
set(CMAKE_C_COMPILER "${TOOLCHAIN}/bin/aarch64-linux-android22-clang")
|
||||
set(CMAKE_CXX_COMPILER "${TOOLCHAIN}/bin/aarch64-linux-android22-clang++")
|
||||
set(C_COMPILER "${TOOLCHAIN}/bin/clang")
|
||||
|
||||
set(CMAKE_C_FLAGS "-g -Wall -Werror")
|
||||
set(CMAKE_CXX_FLAGS "-g -Wall -Werror")
|
||||
|
||||
set(CMDLINE_SOURCE cmdline.c)
|
||||
set(HANDLE_SOURCE main.cpp)
|
||||
set(MAIN_SOURCE main.c)
|
||||
set(WRAPPER_SOURCE wrapper.c)
|
||||
|
||||
add_library(cmdline_object OBJECT ${CMDLINE_SOURCE})
|
||||
add_library(handle_object OBJECT ${HANDLE_SOURCE})
|
||||
|
||||
add_executable(main ${MAIN_SOURCE} $<TARGET_OBJECTS:cmdline_object> $<TARGET_OBJECTS:handle_object>)
|
||||
|
||||
set_target_properties(main PROPERTIES
|
||||
COMPILE_DEFINITIONS "MyRelease"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/rootfs/system/bin"
|
||||
)
|
||||
|
||||
find_library(ANDROIDAPPMUSIC_LIB androidappmusic PATHS ${CMAKE_SOURCE_DIR}/rootfs/system/lib64)
|
||||
find_library(STORESERVICESCORE_LIB storeservicescore PATHS ${CMAKE_SOURCE_DIR}/rootfs/system/lib64)
|
||||
find_library(MEDIAPLATFORM_LIB mediaplatform PATHS ${CMAKE_SOURCE_DIR}/rootfs/system/lib64)
|
||||
find_library(CXX_SHARED_LIB c++_shared PATHS ${CMAKE_SOURCE_DIR}/rootfs/system/lib64)
|
||||
|
||||
# Link libraries
|
||||
target_link_libraries(main
|
||||
${CXX_SHARED_LIB}
|
||||
${ANDROIDAPPMUSIC_LIB}
|
||||
${STORESERVICESCORE_LIB}
|
||||
${MEDIAPLATFORM_LIB}
|
||||
)
|
||||
|
||||
link_directories(${CMAKE_SOURCE_DIR}/rootfs/system/lib64)
|
||||
|
||||
ExternalProject_Add(
|
||||
wrapper
|
||||
PREFIX ${CMAKE_BINARY_DIR}
|
||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND aarch64-linux-gnu-gcc -o wrapper ${WRAPPER_SOURCE}
|
||||
BUILD_IN_SOURCE 1
|
||||
INSTALL_COMMAND ""
|
||||
DEPENDS main
|
||||
)
|
9
Dockerfile
Normal file
9
Dockerfile
Normal file
@ -0,0 +1,9 @@
|
||||
FROM ubuntu:latest
|
||||
|
||||
WORKDIR /app
|
||||
COPY . /app
|
||||
ENV args ""
|
||||
|
||||
CMD ["bash", "-c", "./wrapper ${args}"]
|
||||
|
||||
EXPOSE 10020 20020
|
13
Makefile
13
Makefile
@ -1,13 +0,0 @@
|
||||
all: handle.o main wrapper
|
||||
|
||||
handle.o: main.cpp
|
||||
~/android-ndk-r23b/standalone/bin/clang++ -Wall -Werror -nostdlib -c -O3 -o handle.o main.cpp
|
||||
|
||||
main: handle.o test.c
|
||||
~/android-ndk-r23b/standalone/bin/clang -DMyRelease -Wall -Werror -L ./rootfs/system/lib64 -landroidappmusic -lstoreservicescore -lmediaplatform -lc++_shared -O3 -Wall -o rootfs/system/bin/main handle.o test.c
|
||||
|
||||
wrapper: wrapper.c
|
||||
clang -O3 -Wall -o wrapper wrapper.c
|
||||
|
||||
clean:
|
||||
rm handle.o wrapper rootfs/system/bin/main
|
36
README.md
36
README.md
@ -1,2 +1,36 @@
|
||||
# wrapper
|
||||
All files from anonymous, No need for an Android emulator to decrypt alac
|
||||
A tool to decrypt Apple Music's music. An active subscription is still needed.
|
||||
|
||||
Only support Linux x86_64 and arm64.
|
||||
|
||||
# Install
|
||||
Get the pre-built version from this project's Actions.
|
||||
|
||||
Or you can refer to the Actions configuration file for compilation.
|
||||
|
||||
# Docker
|
||||
Available for x86_64 and arm64. Need to download prebuilt version from releases or actions.
|
||||
|
||||
Build image: `docker build --tag wrapper .`
|
||||
|
||||
Login: `docker run -v ./rootfs/data:/app/rootfs/data -p 10020:10020 -e args="-L username:password -F -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
|
||||
```
|
||||
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)
|
||||
-F, --code-from-file (default=off)
|
||||
```
|
||||
|
||||
# Special thanks
|
||||
- Anonymous, for providing the original version of this project and the legacy Frida decryption method.
|
||||
- chocomint, for providing support for arm64 arch.
|
639
cmdline.c
Normal file
639
cmdline.c
Normal file
@ -0,0 +1,639 @@
|
||||
/*
|
||||
File autogenerated by gengetopt version 2.23
|
||||
generated with the following command:
|
||||
gengetopt -i wrapper.ggo
|
||||
|
||||
The developers of gengetopt consider the fixed text that goes in all
|
||||
gengetopt output files to be in the public domain:
|
||||
we make no copyright claims on it.
|
||||
*/
|
||||
|
||||
/* If we use autoconf. */
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef FIX_UNUSED
|
||||
#define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */
|
||||
#endif
|
||||
|
||||
#include <getopt.h>
|
||||
|
||||
#include "cmdline.h"
|
||||
|
||||
const char *gengetopt_args_info_purpose = "";
|
||||
|
||||
const char *gengetopt_args_info_usage = "Usage: wrapper [OPTION]...";
|
||||
|
||||
const char *gengetopt_args_info_versiontext = "";
|
||||
|
||||
const char *gengetopt_args_info_description = "";
|
||||
|
||||
const char *gengetopt_args_info_help[] = {
|
||||
" -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",
|
||||
" -F, --code-from-file (default=off)",
|
||||
0
|
||||
};
|
||||
|
||||
typedef enum {ARG_NO
|
||||
, ARG_FLAG
|
||||
, ARG_STRING
|
||||
, ARG_INT
|
||||
} cmdline_parser_arg_type;
|
||||
|
||||
static
|
||||
void clear_given (struct gengetopt_args_info *args_info);
|
||||
static
|
||||
void clear_args (struct gengetopt_args_info *args_info);
|
||||
|
||||
static int
|
||||
cmdline_parser_internal (int argc, char **argv, struct gengetopt_args_info *args_info,
|
||||
struct cmdline_parser_params *params, const char *additional_error);
|
||||
|
||||
|
||||
static char *
|
||||
gengetopt_strdup (const char *s);
|
||||
|
||||
static
|
||||
void clear_given (struct gengetopt_args_info *args_info)
|
||||
{
|
||||
args_info->help_given = 0 ;
|
||||
args_info->version_given = 0 ;
|
||||
args_info->host_given = 0 ;
|
||||
args_info->decrypt_port_given = 0 ;
|
||||
args_info->m3u8_port_given = 0 ;
|
||||
args_info->proxy_given = 0 ;
|
||||
args_info->login_given = 0 ;
|
||||
args_info->code_from_file_given = 0 ;
|
||||
}
|
||||
|
||||
static
|
||||
void clear_args (struct gengetopt_args_info *args_info)
|
||||
{
|
||||
FIX_UNUSED (args_info);
|
||||
args_info->host_arg = gengetopt_strdup ("127.0.0.1");
|
||||
args_info->host_orig = NULL;
|
||||
args_info->decrypt_port_arg = 10020;
|
||||
args_info->decrypt_port_orig = NULL;
|
||||
args_info->m3u8_port_arg = 20020;
|
||||
args_info->m3u8_port_orig = NULL;
|
||||
args_info->proxy_arg = gengetopt_strdup ("");
|
||||
args_info->proxy_orig = NULL;
|
||||
args_info->login_arg = NULL;
|
||||
args_info->login_orig = NULL;
|
||||
args_info->code_from_file_flag = 0;
|
||||
|
||||
}
|
||||
|
||||
static
|
||||
void init_args_info(struct gengetopt_args_info *args_info)
|
||||
{
|
||||
|
||||
|
||||
args_info->help_help = gengetopt_args_info_help[0] ;
|
||||
args_info->version_help = gengetopt_args_info_help[1] ;
|
||||
args_info->host_help = gengetopt_args_info_help[2] ;
|
||||
args_info->decrypt_port_help = gengetopt_args_info_help[3] ;
|
||||
args_info->m3u8_port_help = gengetopt_args_info_help[4] ;
|
||||
args_info->proxy_help = gengetopt_args_info_help[5] ;
|
||||
args_info->login_help = gengetopt_args_info_help[6] ;
|
||||
args_info->code_from_file_help = gengetopt_args_info_help[7] ;
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
cmdline_parser_print_version (void)
|
||||
{
|
||||
printf ("%s %s\n",
|
||||
(strlen(CMDLINE_PARSER_PACKAGE_NAME) ? CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE),
|
||||
CMDLINE_PARSER_VERSION);
|
||||
|
||||
if (strlen(gengetopt_args_info_versiontext) > 0)
|
||||
printf("\n%s\n", gengetopt_args_info_versiontext);
|
||||
}
|
||||
|
||||
static void print_help_common(void)
|
||||
{
|
||||
size_t len_purpose = strlen(gengetopt_args_info_purpose);
|
||||
size_t len_usage = strlen(gengetopt_args_info_usage);
|
||||
|
||||
if (len_usage > 0) {
|
||||
printf("%s\n", gengetopt_args_info_usage);
|
||||
}
|
||||
if (len_purpose > 0) {
|
||||
printf("%s\n", gengetopt_args_info_purpose);
|
||||
}
|
||||
|
||||
if (len_usage || len_purpose) {
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (strlen(gengetopt_args_info_description) > 0) {
|
||||
printf("%s\n\n", gengetopt_args_info_description);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
cmdline_parser_print_help (void)
|
||||
{
|
||||
int i = 0;
|
||||
print_help_common();
|
||||
while (gengetopt_args_info_help[i])
|
||||
printf("%s\n", gengetopt_args_info_help[i++]);
|
||||
}
|
||||
|
||||
void
|
||||
cmdline_parser_init (struct gengetopt_args_info *args_info)
|
||||
{
|
||||
clear_given (args_info);
|
||||
clear_args (args_info);
|
||||
init_args_info (args_info);
|
||||
}
|
||||
|
||||
void
|
||||
cmdline_parser_params_init(struct cmdline_parser_params *params)
|
||||
{
|
||||
if (params)
|
||||
{
|
||||
params->override = 0;
|
||||
params->initialize = 1;
|
||||
params->check_required = 1;
|
||||
params->check_ambiguity = 0;
|
||||
params->print_errors = 1;
|
||||
}
|
||||
}
|
||||
|
||||
struct cmdline_parser_params *
|
||||
cmdline_parser_params_create(void)
|
||||
{
|
||||
struct cmdline_parser_params *params =
|
||||
(struct cmdline_parser_params *)malloc(sizeof(struct cmdline_parser_params));
|
||||
cmdline_parser_params_init(params);
|
||||
return params;
|
||||
}
|
||||
|
||||
static void
|
||||
free_string_field (char **s)
|
||||
{
|
||||
if (*s)
|
||||
{
|
||||
free (*s);
|
||||
*s = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
cmdline_parser_release (struct gengetopt_args_info *args_info)
|
||||
{
|
||||
|
||||
free_string_field (&(args_info->host_arg));
|
||||
free_string_field (&(args_info->host_orig));
|
||||
free_string_field (&(args_info->decrypt_port_orig));
|
||||
free_string_field (&(args_info->m3u8_port_orig));
|
||||
free_string_field (&(args_info->proxy_arg));
|
||||
free_string_field (&(args_info->proxy_orig));
|
||||
free_string_field (&(args_info->login_arg));
|
||||
free_string_field (&(args_info->login_orig));
|
||||
|
||||
|
||||
|
||||
clear_given (args_info);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[])
|
||||
{
|
||||
FIX_UNUSED (values);
|
||||
if (arg) {
|
||||
fprintf(outfile, "%s=\"%s\"\n", opt, arg);
|
||||
} else {
|
||||
fprintf(outfile, "%s\n", opt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
if (!outfile)
|
||||
{
|
||||
fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (args_info->help_given)
|
||||
write_into_file(outfile, "help", 0, 0 );
|
||||
if (args_info->version_given)
|
||||
write_into_file(outfile, "version", 0, 0 );
|
||||
if (args_info->host_given)
|
||||
write_into_file(outfile, "host", args_info->host_orig, 0);
|
||||
if (args_info->decrypt_port_given)
|
||||
write_into_file(outfile, "decrypt-port", args_info->decrypt_port_orig, 0);
|
||||
if (args_info->m3u8_port_given)
|
||||
write_into_file(outfile, "m3u8-port", args_info->m3u8_port_orig, 0);
|
||||
if (args_info->proxy_given)
|
||||
write_into_file(outfile, "proxy", args_info->proxy_orig, 0);
|
||||
if (args_info->login_given)
|
||||
write_into_file(outfile, "login", args_info->login_orig, 0);
|
||||
if (args_info->code_from_file_given)
|
||||
write_into_file(outfile, "code-from-file", 0, 0 );
|
||||
|
||||
|
||||
i = EXIT_SUCCESS;
|
||||
return i;
|
||||
}
|
||||
|
||||
int
|
||||
cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info)
|
||||
{
|
||||
FILE *outfile;
|
||||
int i = 0;
|
||||
|
||||
outfile = fopen(filename, "w");
|
||||
|
||||
if (!outfile)
|
||||
{
|
||||
fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
i = cmdline_parser_dump(outfile, args_info);
|
||||
fclose (outfile);
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
void
|
||||
cmdline_parser_free (struct gengetopt_args_info *args_info)
|
||||
{
|
||||
cmdline_parser_release (args_info);
|
||||
}
|
||||
|
||||
/** @brief replacement of strdup, which is not standard */
|
||||
char *
|
||||
gengetopt_strdup (const char *s)
|
||||
{
|
||||
char *result = 0;
|
||||
if (!s)
|
||||
return result;
|
||||
|
||||
result = (char*)malloc(strlen(s) + 1);
|
||||
if (result == (char*)0)
|
||||
return (char*)0;
|
||||
strcpy(result, s);
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
cmdline_parser (int argc, char **argv, struct gengetopt_args_info *args_info)
|
||||
{
|
||||
return cmdline_parser2 (argc, argv, args_info, 0, 1, 1);
|
||||
}
|
||||
|
||||
int
|
||||
cmdline_parser_ext (int argc, char **argv, struct gengetopt_args_info *args_info,
|
||||
struct cmdline_parser_params *params)
|
||||
{
|
||||
int result;
|
||||
result = cmdline_parser_internal (argc, argv, args_info, params, 0);
|
||||
|
||||
if (result == EXIT_FAILURE)
|
||||
{
|
||||
cmdline_parser_free (args_info);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
cmdline_parser2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required)
|
||||
{
|
||||
int result;
|
||||
struct cmdline_parser_params params;
|
||||
|
||||
params.override = override;
|
||||
params.initialize = initialize;
|
||||
params.check_required = check_required;
|
||||
params.check_ambiguity = 0;
|
||||
params.print_errors = 1;
|
||||
|
||||
result = cmdline_parser_internal (argc, argv, args_info, ¶ms, 0);
|
||||
|
||||
if (result == EXIT_FAILURE)
|
||||
{
|
||||
cmdline_parser_free (args_info);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name)
|
||||
{
|
||||
FIX_UNUSED (args_info);
|
||||
FIX_UNUSED (prog_name);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static char *package_name = 0;
|
||||
|
||||
/**
|
||||
* @brief updates an option
|
||||
* @param field the generic pointer to the field to update
|
||||
* @param orig_field the pointer to the orig field
|
||||
* @param field_given the pointer to the number of occurrence of this option
|
||||
* @param prev_given the pointer to the number of occurrence already seen
|
||||
* @param value the argument for this option (if null no arg was specified)
|
||||
* @param possible_values the possible values for this option (if specified)
|
||||
* @param default_value the default value (in case the option only accepts fixed values)
|
||||
* @param arg_type the type of this option
|
||||
* @param check_ambiguity @see cmdline_parser_params.check_ambiguity
|
||||
* @param override @see cmdline_parser_params.override
|
||||
* @param no_free whether to free a possible previous value
|
||||
* @param multiple_option whether this is a multiple option
|
||||
* @param long_opt the corresponding long option
|
||||
* @param short_opt the corresponding short option (or '-' if none)
|
||||
* @param additional_error possible further error specification
|
||||
*/
|
||||
static
|
||||
int update_arg(void *field, char **orig_field,
|
||||
unsigned int *field_given, unsigned int *prev_given,
|
||||
char *value, const char *possible_values[],
|
||||
const char *default_value,
|
||||
cmdline_parser_arg_type arg_type,
|
||||
int check_ambiguity, int override,
|
||||
int no_free, int multiple_option,
|
||||
const char *long_opt, char short_opt,
|
||||
const char *additional_error)
|
||||
{
|
||||
char *stop_char = 0;
|
||||
const char *val = value;
|
||||
int found;
|
||||
char **string_field;
|
||||
FIX_UNUSED (field);
|
||||
|
||||
stop_char = 0;
|
||||
found = 0;
|
||||
|
||||
if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given)))
|
||||
{
|
||||
if (short_opt != '-')
|
||||
fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n",
|
||||
package_name, long_opt, short_opt,
|
||||
(additional_error ? additional_error : ""));
|
||||
else
|
||||
fprintf (stderr, "%s: `--%s' option given more than once%s\n",
|
||||
package_name, long_opt,
|
||||
(additional_error ? additional_error : ""));
|
||||
return 1; /* failure */
|
||||
}
|
||||
|
||||
FIX_UNUSED (default_value);
|
||||
|
||||
if (field_given && *field_given && ! override)
|
||||
return 0;
|
||||
if (prev_given)
|
||||
(*prev_given)++;
|
||||
if (field_given)
|
||||
(*field_given)++;
|
||||
if (possible_values)
|
||||
val = possible_values[found];
|
||||
|
||||
switch(arg_type) {
|
||||
case ARG_FLAG:
|
||||
*((int *)field) = !*((int *)field);
|
||||
break;
|
||||
case ARG_INT:
|
||||
if (val) *((int *)field) = strtol (val, &stop_char, 0);
|
||||
break;
|
||||
case ARG_STRING:
|
||||
if (val) {
|
||||
string_field = (char **)field;
|
||||
if (!no_free && *string_field)
|
||||
free (*string_field); /* free previous string */
|
||||
*string_field = gengetopt_strdup (val);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
|
||||
/* check numeric conversion */
|
||||
switch(arg_type) {
|
||||
case ARG_INT:
|
||||
if (val && !(stop_char && *stop_char == '\0')) {
|
||||
fprintf(stderr, "%s: invalid numeric value: %s\n", package_name, val);
|
||||
return 1; /* failure */
|
||||
}
|
||||
break;
|
||||
default:
|
||||
;
|
||||
};
|
||||
|
||||
/* store the original value */
|
||||
switch(arg_type) {
|
||||
case ARG_NO:
|
||||
case ARG_FLAG:
|
||||
break;
|
||||
default:
|
||||
if (value && orig_field) {
|
||||
if (no_free) {
|
||||
*orig_field = value;
|
||||
} else {
|
||||
if (*orig_field)
|
||||
free (*orig_field); /* free previous string */
|
||||
*orig_field = gengetopt_strdup (value);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return 0; /* OK */
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cmdline_parser_internal (
|
||||
int argc, char **argv, struct gengetopt_args_info *args_info,
|
||||
struct cmdline_parser_params *params, const char *additional_error)
|
||||
{
|
||||
int c; /* Character of the parsed option. */
|
||||
|
||||
int error_occurred = 0;
|
||||
struct gengetopt_args_info local_args_info;
|
||||
|
||||
int override;
|
||||
int initialize;
|
||||
int check_required;
|
||||
int check_ambiguity;
|
||||
|
||||
package_name = argv[0];
|
||||
|
||||
/* TODO: Why is this here? It is not used anywhere. */
|
||||
override = params->override;
|
||||
FIX_UNUSED(override);
|
||||
|
||||
initialize = params->initialize;
|
||||
check_required = params->check_required;
|
||||
|
||||
/* TODO: Why is this here? It is not used anywhere. */
|
||||
check_ambiguity = params->check_ambiguity;
|
||||
FIX_UNUSED(check_ambiguity);
|
||||
|
||||
if (initialize)
|
||||
cmdline_parser_init (args_info);
|
||||
|
||||
cmdline_parser_init (&local_args_info);
|
||||
|
||||
optarg = 0;
|
||||
optind = 0;
|
||||
opterr = params->print_errors;
|
||||
optopt = '?';
|
||||
|
||||
while (1)
|
||||
{
|
||||
int option_index = 0;
|
||||
|
||||
static struct option long_options[] = {
|
||||
{ "help", 0, NULL, 'h' },
|
||||
{ "version", 0, NULL, 'V' },
|
||||
{ "host", 1, NULL, 'H' },
|
||||
{ "decrypt-port", 1, NULL, 'D' },
|
||||
{ "m3u8-port", 1, NULL, 'M' },
|
||||
{ "proxy", 1, NULL, 'P' },
|
||||
{ "login", 1, NULL, 'L' },
|
||||
{ "code-from-file", 0, NULL, 'F' },
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
c = getopt_long (argc, argv, "hVH:D:M:P:L:F", long_options, &option_index);
|
||||
|
||||
if (c == -1) break; /* Exit from `while (1)' loop. */
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 'h': /* Print help and exit. */
|
||||
cmdline_parser_print_help ();
|
||||
cmdline_parser_free (&local_args_info);
|
||||
exit (EXIT_SUCCESS);
|
||||
|
||||
case 'V': /* Print version and exit. */
|
||||
cmdline_parser_print_version ();
|
||||
cmdline_parser_free (&local_args_info);
|
||||
exit (EXIT_SUCCESS);
|
||||
|
||||
case 'H': /* . */
|
||||
|
||||
|
||||
if (update_arg( (void *)&(args_info->host_arg),
|
||||
&(args_info->host_orig), &(args_info->host_given),
|
||||
&(local_args_info.host_given), optarg, 0, "127.0.0.1", ARG_STRING,
|
||||
check_ambiguity, override, 0, 0,
|
||||
"host", 'H',
|
||||
additional_error))
|
||||
goto failure;
|
||||
|
||||
break;
|
||||
case 'D': /* . */
|
||||
|
||||
|
||||
if (update_arg( (void *)&(args_info->decrypt_port_arg),
|
||||
&(args_info->decrypt_port_orig), &(args_info->decrypt_port_given),
|
||||
&(local_args_info.decrypt_port_given), optarg, 0, "10020", ARG_INT,
|
||||
check_ambiguity, override, 0, 0,
|
||||
"decrypt-port", 'D',
|
||||
additional_error))
|
||||
goto failure;
|
||||
|
||||
break;
|
||||
case 'M': /* . */
|
||||
|
||||
|
||||
if (update_arg( (void *)&(args_info->m3u8_port_arg),
|
||||
&(args_info->m3u8_port_orig), &(args_info->m3u8_port_given),
|
||||
&(local_args_info.m3u8_port_given), optarg, 0, "20020", ARG_INT,
|
||||
check_ambiguity, override, 0, 0,
|
||||
"m3u8-port", 'M',
|
||||
additional_error))
|
||||
goto failure;
|
||||
|
||||
break;
|
||||
case 'P': /* . */
|
||||
|
||||
|
||||
if (update_arg( (void *)&(args_info->proxy_arg),
|
||||
&(args_info->proxy_orig), &(args_info->proxy_given),
|
||||
&(local_args_info.proxy_given), optarg, 0, "", ARG_STRING,
|
||||
check_ambiguity, override, 0, 0,
|
||||
"proxy", 'P',
|
||||
additional_error))
|
||||
goto failure;
|
||||
|
||||
break;
|
||||
case 'L': /* username:password. */
|
||||
|
||||
|
||||
if (update_arg( (void *)&(args_info->login_arg),
|
||||
&(args_info->login_orig), &(args_info->login_given),
|
||||
&(local_args_info.login_given), optarg, 0, 0, ARG_STRING,
|
||||
check_ambiguity, override, 0, 0,
|
||||
"login", 'L',
|
||||
additional_error))
|
||||
goto failure;
|
||||
|
||||
break;
|
||||
case 'F': /* . */
|
||||
|
||||
|
||||
if (update_arg((void *)&(args_info->code_from_file_flag), 0, &(args_info->code_from_file_given),
|
||||
&(local_args_info.code_from_file_given), optarg, 0, 0, ARG_FLAG,
|
||||
check_ambiguity, override, 1, 0, "code-from-file", 'F',
|
||||
additional_error))
|
||||
goto failure;
|
||||
|
||||
break;
|
||||
|
||||
case 0: /* Long option with no short option */
|
||||
case '?': /* Invalid option. */
|
||||
/* `getopt_long' already printed an error message. */
|
||||
goto failure;
|
||||
|
||||
default: /* bug: option not considered. */
|
||||
fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : ""));
|
||||
abort ();
|
||||
} /* switch */
|
||||
} /* while */
|
||||
|
||||
|
||||
|
||||
FIX_UNUSED(check_required);
|
||||
|
||||
cmdline_parser_release (&local_args_info);
|
||||
|
||||
if ( error_occurred )
|
||||
return (EXIT_FAILURE);
|
||||
|
||||
return 0;
|
||||
|
||||
failure:
|
||||
|
||||
cmdline_parser_release (&local_args_info);
|
||||
return (EXIT_FAILURE);
|
||||
}
|
||||
/* vim: set ft=c noet ts=8 sts=8 sw=8 tw=80 nojs spell : */
|
196
cmdline.h
Normal file
196
cmdline.h
Normal file
@ -0,0 +1,196 @@
|
||||
/** @file cmdline.h
|
||||
* @brief The header file for the command line option parser
|
||||
* generated by GNU Gengetopt version 2.23
|
||||
* http://www.gnu.org/software/gengetopt.
|
||||
* DO NOT modify this file, since it can be overwritten
|
||||
* @author GNU Gengetopt */
|
||||
|
||||
#ifndef CMDLINE_H
|
||||
#define CMDLINE_H
|
||||
|
||||
/* If we use autoconf. */
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h> /* for FILE */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#ifndef CMDLINE_PARSER_PACKAGE
|
||||
/** @brief the program name (used for printing errors) */
|
||||
#define CMDLINE_PARSER_PACKAGE "wrapper"
|
||||
#endif
|
||||
|
||||
#ifndef CMDLINE_PARSER_PACKAGE_NAME
|
||||
/** @brief the complete program name (used for help and version) */
|
||||
#define CMDLINE_PARSER_PACKAGE_NAME "wrapper"
|
||||
#endif
|
||||
|
||||
#ifndef CMDLINE_PARSER_VERSION
|
||||
/** @brief the program version */
|
||||
#define CMDLINE_PARSER_VERSION "1.2.0"
|
||||
#endif
|
||||
|
||||
/** @brief Where the command line options are stored */
|
||||
struct gengetopt_args_info
|
||||
{
|
||||
const char *help_help; /**< @brief Print help and exit help description. */
|
||||
const char *version_help; /**< @brief Print version and exit help description. */
|
||||
char * host_arg; /**< @brief (default='127.0.0.1'). */
|
||||
char * host_orig; /**< @brief original value given at command line. */
|
||||
const char *host_help; /**< @brief help description. */
|
||||
int decrypt_port_arg; /**< @brief (default='10020'). */
|
||||
char * decrypt_port_orig; /**< @brief original value given at command line. */
|
||||
const char *decrypt_port_help; /**< @brief help description. */
|
||||
int m3u8_port_arg; /**< @brief (default='20020'). */
|
||||
char * m3u8_port_orig; /**< @brief original value given at command line. */
|
||||
const char *m3u8_port_help; /**< @brief help description. */
|
||||
char * proxy_arg; /**< @brief (default=''). */
|
||||
char * proxy_orig; /**< @brief original value given at command line. */
|
||||
const char *proxy_help; /**< @brief help description. */
|
||||
char * login_arg; /**< @brief username:password. */
|
||||
char * login_orig; /**< @brief username:password original value given at command line. */
|
||||
const char *login_help; /**< @brief username:password help description. */
|
||||
int code_from_file_flag; /**< @brief (default=off). */
|
||||
const char *code_from_file_help; /**< @brief help description. */
|
||||
|
||||
unsigned int help_given ; /**< @brief Whether help was given. */
|
||||
unsigned int version_given ; /**< @brief Whether version was given. */
|
||||
unsigned int host_given ; /**< @brief Whether host was given. */
|
||||
unsigned int decrypt_port_given ; /**< @brief Whether decrypt-port was given. */
|
||||
unsigned int m3u8_port_given ; /**< @brief Whether m3u8-port was given. */
|
||||
unsigned int proxy_given ; /**< @brief Whether proxy was given. */
|
||||
unsigned int login_given ; /**< @brief Whether login was given. */
|
||||
unsigned int code_from_file_given ; /**< @brief Whether code-from-file was given. */
|
||||
|
||||
} ;
|
||||
|
||||
/** @brief The additional parameters to pass to parser functions */
|
||||
struct cmdline_parser_params
|
||||
{
|
||||
int override; /**< @brief whether to override possibly already present options (default 0) */
|
||||
int initialize; /**< @brief whether to initialize the option structure gengetopt_args_info (default 1) */
|
||||
int check_required; /**< @brief whether to check that all required options were provided (default 1) */
|
||||
int check_ambiguity; /**< @brief whether to check for options already specified in the option structure gengetopt_args_info (default 0) */
|
||||
int print_errors; /**< @brief whether getopt_long should print an error message for a bad option (default 1) */
|
||||
} ;
|
||||
|
||||
/** @brief the purpose string of the program */
|
||||
extern const char *gengetopt_args_info_purpose;
|
||||
/** @brief the usage string of the program */
|
||||
extern const char *gengetopt_args_info_usage;
|
||||
/** @brief the description string of the program */
|
||||
extern const char *gengetopt_args_info_description;
|
||||
/** @brief all the lines making the help output */
|
||||
extern const char *gengetopt_args_info_help[];
|
||||
|
||||
/**
|
||||
* The command line parser
|
||||
* @param argc the number of command line options
|
||||
* @param argv the command line options
|
||||
* @param args_info the structure where option information will be stored
|
||||
* @return 0 if everything went fine, NON 0 if an error took place
|
||||
*/
|
||||
int cmdline_parser (int argc, char **argv,
|
||||
struct gengetopt_args_info *args_info);
|
||||
|
||||
/**
|
||||
* The command line parser (version with additional parameters - deprecated)
|
||||
* @param argc the number of command line options
|
||||
* @param argv the command line options
|
||||
* @param args_info the structure where option information will be stored
|
||||
* @param override whether to override possibly already present options
|
||||
* @param initialize whether to initialize the option structure my_args_info
|
||||
* @param check_required whether to check that all required options were provided
|
||||
* @return 0 if everything went fine, NON 0 if an error took place
|
||||
* @deprecated use cmdline_parser_ext() instead
|
||||
*/
|
||||
int cmdline_parser2 (int argc, char **argv,
|
||||
struct gengetopt_args_info *args_info,
|
||||
int override, int initialize, int check_required);
|
||||
|
||||
/**
|
||||
* The command line parser (version with additional parameters)
|
||||
* @param argc the number of command line options
|
||||
* @param argv the command line options
|
||||
* @param args_info the structure where option information will be stored
|
||||
* @param params additional parameters for the parser
|
||||
* @return 0 if everything went fine, NON 0 if an error took place
|
||||
*/
|
||||
int cmdline_parser_ext (int argc, char **argv,
|
||||
struct gengetopt_args_info *args_info,
|
||||
struct cmdline_parser_params *params);
|
||||
|
||||
/**
|
||||
* Save the contents of the option struct into an already open FILE stream.
|
||||
* @param outfile the stream where to dump options
|
||||
* @param args_info the option struct to dump
|
||||
* @return 0 if everything went fine, NON 0 if an error took place
|
||||
*/
|
||||
int cmdline_parser_dump(FILE *outfile,
|
||||
struct gengetopt_args_info *args_info);
|
||||
|
||||
/**
|
||||
* Save the contents of the option struct into a (text) file.
|
||||
* This file can be read by the config file parser (if generated by gengetopt)
|
||||
* @param filename the file where to save
|
||||
* @param args_info the option struct to save
|
||||
* @return 0 if everything went fine, NON 0 if an error took place
|
||||
*/
|
||||
int cmdline_parser_file_save(const char *filename,
|
||||
struct gengetopt_args_info *args_info);
|
||||
|
||||
/**
|
||||
* Print the help
|
||||
*/
|
||||
void cmdline_parser_print_help(void);
|
||||
/**
|
||||
* Print the version
|
||||
*/
|
||||
void cmdline_parser_print_version(void);
|
||||
|
||||
/**
|
||||
* Initializes all the fields a cmdline_parser_params structure
|
||||
* to their default values
|
||||
* @param params the structure to initialize
|
||||
*/
|
||||
void cmdline_parser_params_init(struct cmdline_parser_params *params);
|
||||
|
||||
/**
|
||||
* Allocates dynamically a cmdline_parser_params structure and initializes
|
||||
* all its fields to their default values
|
||||
* @return the created and initialized cmdline_parser_params structure
|
||||
*/
|
||||
struct cmdline_parser_params *cmdline_parser_params_create(void);
|
||||
|
||||
/**
|
||||
* Initializes the passed gengetopt_args_info structure's fields
|
||||
* (also set default values for options that have a default)
|
||||
* @param args_info the structure to initialize
|
||||
*/
|
||||
void cmdline_parser_init (struct gengetopt_args_info *args_info);
|
||||
/**
|
||||
* Deallocates the string fields of the gengetopt_args_info structure
|
||||
* (but does not deallocate the structure itself)
|
||||
* @param args_info the structure to deallocate
|
||||
*/
|
||||
void cmdline_parser_free (struct gengetopt_args_info *args_info);
|
||||
|
||||
/**
|
||||
* Checks that all the required options were specified
|
||||
* @param args_info the structure to check
|
||||
* @param prog_name the name of the program that will be used to print
|
||||
* possible errors
|
||||
* @return
|
||||
*/
|
||||
int cmdline_parser_required (struct gengetopt_args_info *args_info,
|
||||
const char *prog_name);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif /* CMDLINE_H */
|
509
import.h
509
import.h
@ -1,265 +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 const char *std_string_data(union std_string *str) {
|
||||
if ((str->mark & 1) == 0) {
|
||||
return str->str;
|
||||
}
|
||||
return str->data;
|
||||
}
|
||||
|
||||
extern void _ZN20androidstoreservices30SVSubscriptionStatusMgrFactory6createEv(struct shared_ptr *);
|
||||
extern void
|
||||
_ZN20androidstoreservices27SVSubscriptionStatusMgrImpl33checkSubscriptionStatusFromSourceERKNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEEERKNS_23SVSubscriptionStatusMgr26SVSubscriptionStatusSourceE(
|
||||
struct shared_ptr *, void *, struct shared_ptr *, int *);
|
||||
extern void
|
||||
_ZN17storeservicescore14RequestContext24setFairPlayDirectoryPathERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
void *, union std_string *);
|
||||
#include <stdint.h>
|
||||
#include "structs.h"
|
||||
|
||||
extern void _resolv_set_nameservers_for_net(unsigned netid, const char **servers, int numservers, const char *domains);
|
||||
|
||||
extern void
|
||||
_ZN14FootHillConfig6configERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE(union std_string *);
|
||||
// --- dialog / interface ---
|
||||
extern union std_string *_ZNK17storeservicescore14ProtocolDialog5titleEv(void *);
|
||||
extern void *_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore22ProtocolDialogResponseENS_9allocatorIS2_EEEE;
|
||||
extern void _ZN17storeservicescore22ProtocolDialogResponseC1Ev(void *);
|
||||
extern struct std_vector *_ZNK17storeservicescore14ProtocolDialog7buttonsEv(void *);
|
||||
extern union std_string *_ZNK17storeservicescore14ProtocolButton5titleEv(void *);
|
||||
extern union std_string *_ZNK17storeservicescore14ProtocolDialog7messageEv(void *);
|
||||
extern union std_string *_ZNK17storeservicescore18CredentialsRequest5titleEv(void *);
|
||||
extern union std_string *_ZNK17storeservicescore18CredentialsRequest7messageEv(void *);
|
||||
extern void _ZN17storeservicescore19CredentialsResponseC1Ev(void *);
|
||||
extern void _ZN17storeservicescore22ProtocolDialogResponse17setSelectedButtonERKNSt6__ndk110shared_ptrINS_14ProtocolButtonEEE(void *, struct shared_ptr *);
|
||||
extern void _ZN20androidstoreservices28AndroidPresentationInterface28handleProtocolDialogResponseERKlRKNSt6__ndk110shared_ptrIN17storeservicescore22ProtocolDialogResponseEEE(void *, long *, struct shared_ptr *);
|
||||
|
||||
extern void
|
||||
_ZNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEE11make_sharedIJRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEES3_DpOT_(
|
||||
struct shared_ptr *, union std_string *);
|
||||
extern void _ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_(
|
||||
struct shared_ptr *);
|
||||
// --- credentials ---
|
||||
extern uint8_t _ZNK17storeservicescore18CredentialsRequest28requiresHSA2VerificationCodeEv(void *);
|
||||
extern void *_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore19CredentialsResponseENS_9allocatorIS2_EEEE;
|
||||
extern void _ZN17storeservicescore19CredentialsResponse11setUserNameERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN17storeservicescore19CredentialsResponse11setPasswordERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN17storeservicescore19CredentialsResponse15setResponseTypeENS0_12ResponseTypeE(void *, int responseType);
|
||||
extern void _ZN20androidstoreservices28AndroidPresentationInterface25handleCredentialsResponseERKNSt6__ndk110shared_ptrIN17storeservicescore19CredentialsResponseEEE(void *, struct shared_ptr *);
|
||||
|
||||
extern void
|
||||
_ZN20androidstoreservices28AndroidPresentationInterface16setDialogHandlerEPFvlNSt6__ndk110shared_ptrIN17storeservicescore14ProtocolDialogEEENS2_INS_36AndroidProtocolDialogResponseHandlerEEEE(
|
||||
void *, void (*)(long, struct shared_ptr *, struct shared_ptr *));
|
||||
extern void
|
||||
_ZN20androidstoreservices28AndroidPresentationInterface21setCredentialsHandlerEPFvNSt6__ndk110shared_ptrIN17storeservicescore18CredentialsRequestEEENS2_INS_33AndroidCredentialsResponseHandlerEEEE(
|
||||
void *, void (*)(struct shared_ptr *, struct shared_ptr *));
|
||||
|
||||
extern void
|
||||
_ZN17storeservicescore14RequestContext24setPresentationInterfaceERKNSt6__ndk110shared_ptrINS_21PresentationInterfaceEEE(
|
||||
void *, struct shared_ptr *);
|
||||
// --- decryption ---
|
||||
extern void _ZN21SVFootHillSessionCtrl9cleanKeysERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE(void *, union std_string *);
|
||||
extern void _ZN21SVFootHillSessionCtrl16getPersistentKeyERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_S8_S8_S8_S8_S8_(struct shared_ptr *, void *, union std_string *, union std_string *, union std_string *, union std_string *, union std_string *, union std_string *, union std_string *, union std_string *);
|
||||
void _ZN21SVFootHillSessionCtrl16getPersistentKeyERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_S8_S8_S8_S8_S8_ASM(struct shared_ptr *persistent_key, void *instance, union std_string * adam_id, union std_string *prefetch_adam_id, union std_string *key_uri, union std_string *key_format, union std_string *key_format_ver, union std_string *server_uri, union std_string *protocol_type, union std_string *fps_cert) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"mov x0, %1\n"
|
||||
"mov x1, %2\n"
|
||||
"mov x2, %3\n"
|
||||
"mov x3, %4\n"
|
||||
"mov x4, %5\n"
|
||||
"mov x5, %6\n"
|
||||
"mov x6, %7\n"
|
||||
"mov x7, %8\n"
|
||||
"sub sp, sp, #0x10\n"
|
||||
"mov x9, %9\n"
|
||||
"str x9, [sp]\n"
|
||||
"bl _ZN21SVFootHillSessionCtrl16getPersistentKeyERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_S8_S8_S8_S8_S8_\n"
|
||||
"add sp, sp, #0x10\n"
|
||||
:
|
||||
: "r" (persistent_key), "r" (instance), "r" (adam_id), "r" (prefetch_adam_id), "r" (key_uri), "r" (key_format), "r" (key_format_ver), "r" (server_uri), "r" (protocol_type), "r" (fps_cert)
|
||||
: "x8", "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x9", "memory", "lr"
|
||||
);
|
||||
}
|
||||
extern void _ZN21SVFootHillSessionCtrl14decryptContextERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKN11SVDecryptor15SVDecryptorTypeERKb(struct shared_ptr *, void *, void *);
|
||||
void _ZN21SVFootHillSessionCtrl14decryptContextERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKN11SVDecryptor15SVDecryptorTypeERKbASM(struct shared_ptr *decrypted_context, void *instance, void *context) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"mov x0, %1\n"
|
||||
"mov x1, %2\n"
|
||||
"bl _ZN21SVFootHillSessionCtrl14decryptContextERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKN11SVDecryptor15SVDecryptorTypeERKb\n"
|
||||
:
|
||||
: "r" (decrypted_context), "r" (instance), "r" (context)
|
||||
: "x8", "x0", "x1", "memory", "lr"
|
||||
);
|
||||
}
|
||||
extern void **_ZNK18SVFootHillPContext9kdContextEv(void *);
|
||||
extern long NfcRKVnxuKZy04KWbdFu71Ou(void *, uint32_t, void *, void *, size_t); // Decryption function
|
||||
extern void *_ZN21SVFootHillSessionCtrl8instanceEv();
|
||||
void *getFootHillInstance() {
|
||||
return _ZN21SVFootHillSessionCtrl8instanceEv();
|
||||
}
|
||||
const char *const fairplay_cert = "MIIEzjCCA7agAwIBAgIIAXAVjHFZDjgwDQYJKoZIhvcNAQEFBQAwfzELMAkGA1UEBhMCVVMxEzARBgNVBAoMCkFwcGxlIEluYy4xJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYDVQQDDCpBcHBsZSBLZXkgU2VydmljZXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTIwNzI1MTgwMjU4WhcNMTQwNzI2MTgwMjU4WjAwMQswCQYDVQQGEwJVUzESMBAGA1UECgwJQXBwbGUgSW5jMQ0wCwYDVQQDDARGUFMxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqZ9IbMt0J0dTKQN4cUlfeQRY9bcnbnP95HFv9A16Yayh4xQzRLAQqVSmisZtBK2/nawZcDmcs+XapBojRb+jDM4Dzk6/Ygdqo8LoA+BE1zipVyalGLj8Y86hTC9QHX8i05oWNCDIlmabjjWvFBoEOk+ezOAPg8c0SET38x5u+TwIDAQABo4ICHzCCAhswHQYDVR0OBBYEFPP6sfTWpOQ5Sguf5W3Y0oibbEc3MAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUY+RHVMuFcVlGLIOszEQxZGcDLL4wgeIGA1UdIASB2jCB1zCB1AYJKoZIhvdjZAUBMIHGMIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwuYXBwbGUuY29tL2tleXNlcnZpY2VzLmNybDAOBgNVHQ8BAf8EBAMCBSAwFAYLKoZIhvdjZAYNAQUBAf8EAgUAMBsGCyqGSIb3Y2QGDQEGAQH/BAkBAAAAAQAAAAEwKQYLKoZIhvdjZAYNAQMBAf8EFwF+bjsY57ASVFmeehD2bdu6HLGBxeC2MEEGCyqGSIb3Y2QGDQEEAQH/BC8BHrKviHJf/Se/ibc7T0/55Bt1GePzaYBVfgF3ZiNuV93z8P3qsawAqAXzzh9o5DANBgkqhkiG9w0BAQUFAAOCAQEAVGyCtuLYcYb/aPijBCtaemxuV0IokXJn3EgmwYHZynaR6HZmeGRUp9p3f8EXu6XPSekKCCQi+a86hXX9RfnGEjRdvtP+jts5MDSKuUIoaqce8cLX2dpUOZXdf3lR0IQM0kXHb5boNGBsmbTLVifqeMsexfZryGw2hE/4WDOJdGQm1gMJZU4jP1b/HSLNIUhHWAaMeWtcJTPRBucR4urAtvvtOWD88mriZNHG+veYw55b+qA36PSqDPMbku9xTY7fsMa6mxIRmwULQgi8nOk1wNhw3ZO0qUKtaCO3gSqWdloecxpxUQSZCSW7tWPkpXXwDZqegUkij9xMFS1pr37RIjCCBVAwggQ4oAMCAQICEEVKuaGraq1Cp4z6TFOeVfUwDQYJKoZIhvcNAQELBQAwUDEsMCoGA1UEAwwjQXBwbGUgRlAgU2VydmljZSBFbmFibGUgUlNBIENBIC0gRzExEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMB4XDTIwMDQwNzIwMjY0NFoXDTIyMDQwNzIwMjY0NFowWjEhMB8GA1UEAwwYZnBzMjA0OC5pdHVuZXMuYXBwbGUuY29tMRMwEQYDVQQLDApBcHBsZSBJbmMuMRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJNoUHuTRLafofQgIRgGa2TFIf+bsFDMjs+y3Ep1xCzFLE4QbnwG6OG0duKUl5IoGUsouzZk9iGsXz5k3ESLOWKz2BFrDTvGrzAcuLpH66jJHGsk/l+ZzsDOJaoQ22pu0JvzYzW8/yEKvpE6JF/2dsC6V9RDTri3VWFxrl5uh8czzncoEQoRcQsSatHzs4tw/QdHFtBIigqxqr4R7XiCaHbsQmqbP9h7oxRs/6W/DDA2BgkuFY1ocX/8dTjmH6szKPfGt3KaYCwy3fuRC+FibTyohtvmlXsYhm7AUzorwWIwN/MbiFQ0OHHtDomIy71wDcTNMnY0jZYtGmIlJETAgYcCAwEAAaOCAhowggIWMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUrI/yBkpV623/IeMrXzs8fC7VkZkwRQYIKwYBBQUHAQEEOTA3MDUGCCsGAQUFBzABhilodHRwOi8vb2NzcC5hcHBsZS5jb20vb2NzcDAzLWZwc3J2cnNhZzEwMzCBwwYDVR0gBIG7MIG4MIG1BgkqhkiG92NkBQEwgacwgaQGCCsGAQUFBwICMIGXDIGUUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2NlcHRhbmNlIG9mIGFueSBhcHBsaWNhYmxlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSBhbmQvb3IgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjAdBgNVHQ4EFgQU2RpCSSHFXeoZQQWxbwJuRZ9RrIEwDgYDVR0PAQH/BAQDAgUgMBQGCyqGSIb3Y2QGDQEFAQH/BAIFADAjBgsqhkiG92NkBg0BBgEB/wQRAQAAAAMAAAABAAAAAgAAAAMwOQYLKoZIhvdjZAYNAQMBAf8EJwG+pUeWbeZBUI0PikyFwSggL5dHaeugSDoQKwcP28csLuh5wplpATAzBgsqhkiG92NkBg0BBAEB/wQhAfl9TGjP/UY9TyQzYsn8sX9ZvHChok9QrrUhtAyWR1yCMA0GCSqGSIb3DQEBCwUAA4IBAQBNMzZ6llQ0laLXsrmyVieuoW9+pHeAaDJ7cBiQLjM3ZdIO3Gq5dkbWYYYwJwymdxZ74WGZMuVv3ueJKcxG1jAhCRhr0lb6QaPaQQSNW+xnoesb3CLA0RzrcgBp/9WFZNdttJOSyC93lQmiE0r5RqPpe/IWUzwoZxri8qnsghVFxCBEcMB+U4PJR8WeAkPrji8po2JLYurvgNRhGkDKcAFPuGEpXdF86hPts+07zazsP0fBjBSVgP3jqb8G31w5W+O+wBW0B9uCf3s0vXU4LuJTAywws2ImZ7O/AaY/uXWOyIUMUKPgL1/QJieB7pBoENIJ2CeJS2M3iv00ssmCmTEJ";
|
||||
|
||||
extern void
|
||||
_ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_(
|
||||
struct shared_ptr *, struct shared_ptr *);
|
||||
extern void _ZN17storeservicescore16AuthenticateFlow3runEv(void *);
|
||||
extern struct shared_ptr *_ZNK17storeservicescore16AuthenticateFlow8responseEv(void *);
|
||||
extern int _ZNK17storeservicescore20AuthenticateResponse12responseTypeEv(void *);
|
||||
|
||||
// storeservicescore::PlaybackLeaseSession::PlaybackLeaseSession(std::__ndk1::shared_ptr<storeservicescore::RequestContext>
|
||||
// const&)
|
||||
extern void
|
||||
_ZN22SVPlaybackLeaseManagerC2ERKNSt6__ndk18functionIFvRKiEEERKNS1_IFvRKNS0_10shared_ptrIN17storeservicescore19StoreErrorConditionEEEEEE(
|
||||
void *, void *, void *);
|
||||
// --- playback ---
|
||||
extern void _ZN22SVPlaybackLeaseManagerC2ERKNSt6__ndk18functionIFvRKiEEERKNS1_IFvRKNS0_10shared_ptrIN17storeservicescore19StoreErrorConditionEEEEEE(void *, void *, void *);
|
||||
extern void _ZN22SVPlaybackLeaseManager25refreshLeaseAutomaticallyERKb(void *, uint8_t *);
|
||||
extern void _ZN22SVPlaybackLeaseManager12requestLeaseERKb(void *, uint8_t *);
|
||||
|
||||
// storeservicescore::ProtocolDialogResponse::setSelectedButton(std::__ndk1::shared_ptr<storeservicescore::ProtocolButton>
|
||||
// const&)
|
||||
extern void
|
||||
_ZN17storeservicescore22ProtocolDialogResponse17setSelectedButtonERKNSt6__ndk110shared_ptrINS_14ProtocolButtonEEE(
|
||||
void *, struct shared_ptr *);
|
||||
// storeservicescore::ProtocolDialog::title() const
|
||||
extern union std_string *_ZNK17storeservicescore14ProtocolDialog5titleEv(void *);
|
||||
// storeservicescore::ProtocolDialog::message() const
|
||||
extern union std_string *_ZNK17storeservicescore14ProtocolDialog7messageEv(void *);
|
||||
extern 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 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"
|
||||
);
|
||||
}
|
||||
|
||||
extern union std_string *_ZNK17storeservicescore18CredentialsRequest5titleEv(void *);
|
||||
extern union std_string *_ZNK17storeservicescore18CredentialsRequest7messageEv(void *);
|
||||
extern uint8_t _ZNK17storeservicescore18CredentialsRequest28requiresHSA2VerificationCodeEv(void *);
|
||||
// --- 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
|
||||
_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 *);
|
||||
struct shared_ptr *getRequestContextConfig() {
|
||||
uint8_t *ptr = (uint8_t *)malloc(480);
|
||||
*(void **)(ptr) = &_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore20RequestContextConfigENS_9allocatorIS2_EEEE + 2;
|
||||
|
||||
extern void
|
||||
_ZN17storeservicescore14RequestContext4initERKNSt6__ndk110shared_ptrINS_20RequestContextConfigEEE(void *, void *,
|
||||
struct shared_ptr *);
|
||||
struct shared_ptr *reqCtxConfig = (struct shared_ptr *)malloc(sizeof(struct shared_ptr));
|
||||
reqCtxConfig->obj = ptr + 32;
|
||||
reqCtxConfig->ctrl_blk = 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);
|
||||
_ZN17storeservicescore20RequestContextConfigC2Ev(reqCtxConfig->obj);
|
||||
return reqCtxConfig;
|
||||
}
|
||||
|
||||
extern void _ZN8FootHillC2ERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_(void *,
|
||||
union std_string *,
|
||||
union std_string *);
|
||||
extern void _ZN8FootHill24defaultContextIdentifierEv(void *);
|
||||
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);
|
||||
|
||||
// RequestContextManager::configure(std::__ndk1::shared_ptr<storeservicescore::RequestContext>
|
||||
// const&)
|
||||
extern void _ZN21RequestContextManager9configureERKNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEEE(
|
||||
struct shared_ptr *);
|
||||
union std_string clientIdentifier = new_std_string("Music");
|
||||
_ZN17storeservicescore20RequestContextConfig19setClientIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &clientIdentifier);
|
||||
|
||||
union std_string versionIdentifier = new_std_string("4.9.2");
|
||||
_ZN17storeservicescore20RequestContextConfig20setVersionIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &versionIdentifier);
|
||||
|
||||
union std_string platformIdentifier = new_std_string("Android");
|
||||
_ZN17storeservicescore20RequestContextConfig21setPlatformIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &platformIdentifier);
|
||||
|
||||
union std_string productVersion = new_std_string("15");
|
||||
_ZN17storeservicescore20RequestContextConfig17setProductVersionERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &productVersion);
|
||||
|
||||
union std_string deviceModel = new_std_string("Pixel 8");
|
||||
_ZN17storeservicescore20RequestContextConfig14setDeviceModelERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &deviceModel);
|
||||
|
||||
union std_string buildVersion = new_std_string("7663313");
|
||||
_ZN17storeservicescore20RequestContextConfig15setBuildVersionERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &buildVersion);
|
||||
|
||||
union std_string locale = new_std_string("en_US");
|
||||
_ZN17storeservicescore20RequestContextConfig19setLocaleIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &locale);
|
||||
_ZN17storeservicescore20RequestContextConfig21setLanguageIdentifierERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtxConfig->obj, &locale);
|
||||
}
|
||||
|
||||
extern void _ZN21RequestContextManager9configureERKNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEEE(struct shared_ptr *);
|
||||
void configureRequestContext(struct shared_ptr *reqCtx)
|
||||
{
|
||||
_ZN21RequestContextManager9configureERKNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEEE(reqCtx);
|
||||
}
|
||||
|
||||
|
||||
extern void _ZN17storeservicescore14RequestContext4initERKNSt6__ndk110shared_ptrINS_20RequestContextConfigEEE(void *, void *, struct shared_ptr *);
|
||||
void _ZN17storeservicescore14RequestContext4initERKNSt6__ndk110shared_ptrINS_20RequestContextConfigEEEASM(uint8_t *buf, struct shared_ptr *reqCtx, struct shared_ptr *reqCtxConfig) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"mov x0, %1\n"
|
||||
"mov x1, %2\n"
|
||||
"bl _ZN17storeservicescore14RequestContext4initERKNSt6__ndk110shared_ptrINS_20RequestContextConfigEEE\n"
|
||||
:
|
||||
: "r" (buf), "r" (reqCtx), "r" (reqCtxConfig)
|
||||
: "x8", "x0", "x1", "lr"
|
||||
);
|
||||
}
|
||||
void initRequestContext(uint8_t *buf, struct shared_ptr *reqCtx, struct shared_ptr *reqCtxConfig)
|
||||
{
|
||||
_ZN17storeservicescore14RequestContext4initERKNSt6__ndk110shared_ptrINS_20RequestContextConfigEEEASM(buf, reqCtx->obj, reqCtxConfig);
|
||||
}
|
||||
|
||||
|
||||
extern void _ZN17storeservicescore14RequestContext24setFairPlayDirectoryPathERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(void *, union std_string *);
|
||||
|
||||
void setFairPlayDirectoryPath(struct shared_ptr *reqCtx, const char *str)
|
||||
{
|
||||
union std_string strBuf = new_std_string(str);
|
||||
_ZN17storeservicescore14RequestContext24setFairPlayDirectoryPathERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(reqCtx->obj, &strBuf);
|
||||
}
|
||||
|
||||
const char *const android_id = "dc28071e981c439e";
|
||||
const char *const fairplayCert = "MIIEzjCCA7agAwIBAgIIAXAVjHFZDjgwDQYJKoZIhvcNAQEFBQAwfzELMAkGA1UEBhMCVVMxEz"
|
||||
"ARBgNVBAoMCkFwcGxlIEluYy4xJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9y"
|
||||
"aXR5MTMwMQYDVQQDDCpBcHBsZSBLZXkgU2VydmljZXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdH"
|
||||
"kwHhcNMTIwNzI1MTgwMjU4WhcNMTQwNzI2MTgwMjU4WjAwMQswCQYDVQQGEwJVUzESMBAGA1UE"
|
||||
"CgwJQXBwbGUgSW5jMQ0wCwYDVQQDDARGUFMxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ"
|
||||
"CqZ9IbMt0J0dTKQN4cUlfeQRY9bcnbnP95HFv9A16Yayh4xQzRLAQqVSmisZtBK2/nawZcDmcs"
|
||||
"+XapBojRb+jDM4Dzk6/Ygdqo8LoA+BE1zipVyalGLj8Y86hTC9QHX8i05oWNCDIlmabjjWvFBo"
|
||||
"EOk+ezOAPg8c0SET38x5u+TwIDAQABo4ICHzCCAhswHQYDVR0OBBYEFPP6sfTWpOQ5Sguf5W3Y"
|
||||
"0oibbEc3MAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUY+RHVMuFcVlGLIOszEQxZGcDLL4wge"
|
||||
"IGA1UdIASB2jCB1zCB1AYJKoZIhvdjZAUBMIHGMIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNl"
|
||||
"IG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZi"
|
||||
"B0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVz"
|
||||
"ZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbW"
|
||||
"VudHMuMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwuYXBwbGUuY29tL2tleXNlcnZpY2Vz"
|
||||
"LmNybDAOBgNVHQ8BAf8EBAMCBSAwFAYLKoZIhvdjZAYNAQUBAf8EAgUAMBsGCyqGSIb3Y2QGDQ"
|
||||
"EGAQH/BAkBAAAAAQAAAAEwKQYLKoZIhvdjZAYNAQMBAf8EFwF+bjsY57ASVFmeehD2bdu6HLGB"
|
||||
"xeC2MEEGCyqGSIb3Y2QGDQEEAQH/BC8BHrKviHJf/Se/ibc7T0/55Bt1GePzaYBVfgF3ZiNuV9"
|
||||
"3z8P3qsawAqAXzzh9o5DANBgkqhkiG9w0BAQUFAAOCAQEAVGyCtuLYcYb/aPijBCtaemxuV0Io"
|
||||
"kXJn3EgmwYHZynaR6HZmeGRUp9p3f8EXu6XPSekKCCQi+a86hXX9RfnGEjRdvtP+jts5MDSKuU"
|
||||
"Ioaqce8cLX2dpUOZXdf3lR0IQM0kXHb5boNGBsmbTLVifqeMsexfZryGw2hE/4WDOJdGQm1gMJ"
|
||||
"ZU4jP1b/HSLNIUhHWAaMeWtcJTPRBucR4urAtvvtOWD88mriZNHG+veYw55b+qA36PSqDPMbku"
|
||||
"9xTY7fsMa6mxIRmwULQgi8nOk1wNhw3ZO0qUKtaCO3gSqWdloecxpxUQSZCSW7tWPkpXXwDZqe"
|
||||
"gUkij9xMFS1pr37RIjCCBVAwggQ4oAMCAQICEEVKuaGraq1Cp4z6TFOeVfUwDQYJKoZIhvcNAQ"
|
||||
"ELBQAwUDEsMCoGA1UEAwwjQXBwbGUgRlAgU2VydmljZSBFbmFibGUgUlNBIENBIC0gRzExEzAR"
|
||||
"BgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMB4XDTIwMDQwNzIwMjY0NFoXDTIyMDQwNz"
|
||||
"IwMjY0NFowWjEhMB8GA1UEAwwYZnBzMjA0OC5pdHVuZXMuYXBwbGUuY29tMRMwEQYDVQQLDApB"
|
||||
"cHBsZSBJbmMuMRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzCCASIwDQYJKoZIhv"
|
||||
"cNAQEBBQADggEPADCCAQoCggEBAJNoUHuTRLafofQgIRgGa2TFIf+bsFDMjs+y3Ep1xCzFLE4Q"
|
||||
"bnwG6OG0duKUl5IoGUsouzZk9iGsXz5k3ESLOWKz2BFrDTvGrzAcuLpH66jJHGsk/l+ZzsDOJa"
|
||||
"oQ22pu0JvzYzW8/yEKvpE6JF/2dsC6V9RDTri3VWFxrl5uh8czzncoEQoRcQsSatHzs4tw/QdH"
|
||||
"FtBIigqxqr4R7XiCaHbsQmqbP9h7oxRs/6W/DDA2BgkuFY1ocX/8dTjmH6szKPfGt3KaYCwy3f"
|
||||
"uRC+FibTyohtvmlXsYhm7AUzorwWIwN/MbiFQ0OHHtDomIy71wDcTNMnY0jZYtGmIlJETAgYcC"
|
||||
"AwEAAaOCAhowggIWMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUrI/yBkpV623/IeMrXzs8fC"
|
||||
"7VkZkwRQYIKwYBBQUHAQEEOTA3MDUGCCsGAQUFBzABhilodHRwOi8vb2NzcC5hcHBsZS5jb20v"
|
||||
"b2NzcDAzLWZwc3J2cnNhZzEwMzCBwwYDVR0gBIG7MIG4MIG1BgkqhkiG92NkBQEwgacwgaQGCC"
|
||||
"sGAQUFBwICMIGXDIGUUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkg"
|
||||
"YXNzdW1lcyBhY2NlcHRhbmNlIG9mIGFueSBhcHBsaWNhYmxlIHRlcm1zIGFuZCBjb25kaXRpb2"
|
||||
"5zIG9mIHVzZSBhbmQvb3IgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjAdBgNV"
|
||||
"HQ4EFgQU2RpCSSHFXeoZQQWxbwJuRZ9RrIEwDgYDVR0PAQH/BAQDAgUgMBQGCyqGSIb3Y2QGDQ"
|
||||
"EFAQH/BAIFADAjBgsqhkiG92NkBg0BBgEB/wQRAQAAAAMAAAABAAAAAgAAAAMwOQYLKoZIhvdj"
|
||||
"ZAYNAQMBAf8EJwG+pUeWbeZBUI0PikyFwSggL5dHaeugSDoQKwcP28csLuh5wplpATAzBgsqhk"
|
||||
"iG92NkBg0BBAEB/wQhAfl9TGjP/UY9TyQzYsn8sX9ZvHChok9QrrUhtAyWR1yCMA0GCSqGSIb3"
|
||||
"DQEBCwUAA4IBAQBNMzZ6llQ0laLXsrmyVieuoW9+pHeAaDJ7cBiQLjM3ZdIO3Gq5dkbWYYYwJw"
|
||||
"ymdxZ74WGZMuVv3ueJKcxG1jAhCRhr0lb6QaPaQQSNW+xnoesb3CLA0RzrcgBp/9WFZNdttJOS"
|
||||
"yC93lQmiE0r5RqPpe/IWUzwoZxri8qnsghVFxCBEcMB+U4PJR8WeAkPrji8po2JLYurvgNRhGk"
|
||||
"DKcAFPuGEpXdF86hPts+07zazsP0fBjBSVgP3jqb8G31w5W+O+wBW0B9uCf3s0vXU4LuJTAyww"
|
||||
"s2ImZ7O/AaY/uXWOyIUMUKPgL1/QJieB7pBoENIJ2CeJS2M3iv00ssmCmTEJ";
|
||||
|
||||
// --- interface ---
|
||||
extern void _ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_(struct shared_ptr *);
|
||||
void _ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_ASM(struct shared_ptr *apInterface) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"bl _ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_\n"
|
||||
:
|
||||
: "r" (apInterface)
|
||||
: "x8", "x0", "lr"
|
||||
);
|
||||
}
|
||||
extern void _ZN20androidstoreservices28AndroidPresentationInterface16setDialogHandlerEPFvlNSt6__ndk110shared_ptrIN17storeservicescore14ProtocolDialogEEENS2_INS_36AndroidProtocolDialogResponseHandlerEEEE(void *, void (*)(long, struct shared_ptr *, struct shared_ptr *));
|
||||
extern void _ZN20androidstoreservices28AndroidPresentationInterface21setCredentialsHandlerEPFvNSt6__ndk110shared_ptrIN17storeservicescore18CredentialsRequestEEENS2_INS_33AndroidCredentialsResponseHandlerEEEE(void *, void (*)(struct shared_ptr *, struct shared_ptr *));
|
||||
void initPresentationInterface(
|
||||
struct shared_ptr *apInterface,
|
||||
void (*dialog_handler)(long, struct shared_ptr *, struct shared_ptr *),
|
||||
void (*credentials_handler)(struct shared_ptr *, struct shared_ptr *)
|
||||
)
|
||||
{
|
||||
_ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_ASM(apInterface);
|
||||
_ZN20androidstoreservices28AndroidPresentationInterface16setDialogHandlerEPFvlNSt6__ndk110shared_ptrIN17storeservicescore14ProtocolDialogEEENS2_INS_36AndroidProtocolDialogResponseHandlerEEEE(apInterface->obj, dialog_handler);
|
||||
_ZN20androidstoreservices28AndroidPresentationInterface21setCredentialsHandlerEPFvNSt6__ndk110shared_ptrIN17storeservicescore18CredentialsRequestEEENS2_INS_33AndroidCredentialsResponseHandlerEEEE(apInterface->obj, credentials_handler);
|
||||
}
|
||||
|
||||
extern void _ZN17storeservicescore14RequestContext24setPresentationInterfaceERKNSt6__ndk110shared_ptrINS_21PresentationInterfaceEEE(void *, struct shared_ptr *);
|
||||
void setPresentationInterface(struct shared_ptr *reqCtx, struct shared_ptr *apInterface)
|
||||
{
|
||||
_ZN17storeservicescore14RequestContext24setPresentationInterfaceERKNSt6__ndk110shared_ptrINS_21PresentationInterfaceEEE(reqCtx->obj, apInterface);
|
||||
}
|
||||
|
||||
|
||||
// --- auth flow ---
|
||||
extern void _ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_(struct shared_ptr *, struct shared_ptr *);
|
||||
void _ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_ASM(struct shared_ptr *flow, struct shared_ptr *reqCtx) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"mov x0, %1\n"
|
||||
"bl _ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_\n"
|
||||
:
|
||||
: "r" (flow), "r" (reqCtx)
|
||||
: "x8", "x0", "lr"
|
||||
);
|
||||
}
|
||||
extern void _ZN17storeservicescore16AuthenticateFlow3runEv(void *);
|
||||
extern struct shared_ptr *_ZNK17storeservicescore16AuthenticateFlow8responseEv(void *);
|
||||
extern int _ZNK17storeservicescore20AuthenticateResponse12responseTypeEv(void *);
|
||||
extern void _ZN14FootHillConfig6configERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE(union std_string *);
|
||||
extern void _ZN17storeservicescore10DeviceGUID8instanceEv(struct shared_ptr *);
|
||||
void _ZN17storeservicescore10DeviceGUID8instanceEvASM(struct shared_ptr *GUID) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"bl _ZN17storeservicescore10DeviceGUID8instanceEv\n"
|
||||
:
|
||||
: "r" (GUID)
|
||||
: "x8", "x0", "lr"
|
||||
);
|
||||
}
|
||||
extern void _ZN17storeservicescore10DeviceGUID9configureERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKjRKb(void *, void *, union std_string *, union std_string *, unsigned int *, uint8_t *);
|
||||
void _ZN17storeservicescore10DeviceGUID9configureERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKjRKbASM(void *ret, void *GUID, union std_string *config1, union std_string *config2, unsigned int *config3, uint8_t *config4) {
|
||||
asm volatile(
|
||||
"mov x8, %0\n"
|
||||
"mov x0, %1\n"
|
||||
"mov x1, %2\n"
|
||||
"mov x2, %3\n"
|
||||
"mov x3, %4\n"
|
||||
"mov x4, %5\n"
|
||||
"bl _ZN17storeservicescore10DeviceGUID9configureERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKjRKb\n"
|
||||
:
|
||||
: "r" (ret), "r" (GUID), "r" (config1), "r" (config2), "r" (config3), "r" (config4)
|
||||
: "x8", "x0", "x1", "x2", "x3", "x4", "lr"
|
||||
);
|
||||
}
|
||||
|
||||
// --- logging ---
|
||||
extern uint8_t _ZN13mediaplatform26DebugLogEnabledForPriorityENS_11LogPriorityE();
|
||||
extern int __android_log_print(int prio, const char *tag, const char *fmt, ...);
|
||||
|
257
test.c → main.c
257
test.c → main.c
@ -5,20 +5,28 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "import.h"
|
||||
#include "cmdline.h"
|
||||
#ifndef MyRelease
|
||||
#include "subhook/subhook.c"
|
||||
#endif
|
||||
|
||||
static struct shared_ptr apInf;
|
||||
static size_t passLen;
|
||||
static char *amUsername, *amPassword;
|
||||
static uint16_t port;
|
||||
static uint8_t leaseMgr[16];
|
||||
struct gengetopt_args_info args_info;
|
||||
char *amUsername, *amPassword;
|
||||
|
||||
int file_exists(char *filename) {
|
||||
struct stat buffer;
|
||||
return (stat (filename, &buffer) == 0);
|
||||
}
|
||||
|
||||
static void dialogHandler(long j, struct shared_ptr *protoDialogPtr,
|
||||
struct shared_ptr *respHandler) {
|
||||
@ -74,10 +82,36 @@ static void credentialHandler(struct shared_ptr *credReqHandler,
|
||||
credReqHandler->obj)),
|
||||
need2FA ? "true" : "false");
|
||||
|
||||
int passLen = strlen(amPassword);
|
||||
|
||||
if (need2FA) {
|
||||
if (args_info.code_from_file_flag) {
|
||||
fprintf(stderr, "[!] Enter your 2FA code into rootfs/data/code.txt\n");
|
||||
fprintf(stderr, "[!] Example command: echo -n 114514 > rootfs/data/2fa.txt\n");
|
||||
fprintf(stderr, "[!] Waiting for input...\n");
|
||||
int count = 0;
|
||||
while (1)
|
||||
{
|
||||
if (count >= 20) {
|
||||
fprintf(stderr, "[!] Failed to get 2FA Code in 60s. Exiting...\n");
|
||||
exit(0);
|
||||
}
|
||||
if (file_exists("/data/2fa.txt")) {
|
||||
FILE *fp = fopen("/data/2fa.txt", "r");
|
||||
fscanf(fp, "%6s", amPassword + passLen);
|
||||
remove("/data/2fa.txt");
|
||||
fprintf(stderr, "[!] Code file detected! Logging in...\n");
|
||||
break;
|
||||
} else {
|
||||
sleep(3);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
printf("2FA code: ");
|
||||
scanf("%6s", amPassword + passLen);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t *const ptr = malloc(80);
|
||||
memset(ptr + 8, 0, 16);
|
||||
@ -112,6 +146,12 @@ static inline void init() {
|
||||
// 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
|
||||
@ -137,80 +177,31 @@ static inline void init() {
|
||||
// _ZN8FootHill24defaultContextIdentifierEv(foothill);
|
||||
|
||||
struct shared_ptr GUID;
|
||||
_ZN17storeservicescore10DeviceGUID8instanceEv(&GUID);
|
||||
_ZN17storeservicescore10DeviceGUID8instanceEvASM(&GUID);
|
||||
|
||||
static uint8_t ret[88];
|
||||
static unsigned int conf3 = 29;
|
||||
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);
|
||||
}
|
||||
|
||||
static inline struct shared_ptr init_ctx() {
|
||||
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;
|
||||
_ZNSt6__ndk110shared_ptrIN17storeservicescore14RequestContextEE11make_sharedIJRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEES3_DpOT_(
|
||||
&reqCtx, &strBuf);
|
||||
struct shared_ptr *reqCtx = newRequestContext("/data/data/com.apple.android.music/files/mpl_db");
|
||||
struct shared_ptr *reqCtxCfg = getRequestContextConfig();
|
||||
|
||||
static uint8_t ptr[480];
|
||||
*(void **)(ptr) =
|
||||
&_ZTVNSt6__ndk120__shared_ptr_emplaceIN17storeservicescore20RequestContextConfigENS_9allocatorIS2_EEEE +
|
||||
2;
|
||||
struct shared_ptr reqCtxCfg = {.obj = ptr + 32, .ctrl_blk = ptr};
|
||||
prepareRequestContextConfig(reqCtxCfg);
|
||||
configureRequestContext(reqCtx);
|
||||
|
||||
_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];
|
||||
_ZN17storeservicescore14RequestContext4initERKNSt6__ndk110shared_ptrINS_20RequestContextConfigEEE(
|
||||
&buf, reqCtx.obj, &reqCtxCfg);
|
||||
strBuf = new_std_string("/data/data/com.apple.android.music/files");
|
||||
_ZN17storeservicescore14RequestContext24setFairPlayDirectoryPathERKNSt6__ndk112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE(
|
||||
reqCtx.obj, &strBuf);
|
||||
initRequestContext(buf, reqCtx, reqCtxCfg);
|
||||
setFairPlayDirectoryPath(reqCtx, "/data/data/com.apple.android.music/files");
|
||||
initPresentationInterface(&apInf, &dialogHandler, &credentialHandler);
|
||||
setPresentationInterface(reqCtx, &apInf);
|
||||
|
||||
_ZNSt6__ndk110shared_ptrIN20androidstoreservices28AndroidPresentationInterfaceEE11make_sharedIJEEES3_DpOT_(
|
||||
&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;
|
||||
return *reqCtx;
|
||||
}
|
||||
|
||||
extern void *endLeaseCallback;
|
||||
@ -219,7 +210,7 @@ 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_(
|
||||
_ZNSt6__ndk110shared_ptrIN17storeservicescore16AuthenticateFlowEE11make_sharedIJRNS0_INS1_14RequestContextEEEEEES3_DpOT_ASM(
|
||||
&flow, &reqCtx);
|
||||
_ZN17storeservicescore16AuthenticateFlow3runEv(flow.obj);
|
||||
struct shared_ptr *resp =
|
||||
@ -284,10 +275,10 @@ inline static void *getKdContext(const char *const adam,
|
||||
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(fairplayCert);
|
||||
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_(
|
||||
_ZN21SVFootHillSessionCtrl16getPersistentKeyERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_S8_S8_S8_S8_S8_ASM(
|
||||
&persistK, FHinstance, &defaultId, &defaultId, &keyUri, &keyFormat,
|
||||
&keyFormatVer, &serverUri, &protocolType, &fpsCert);
|
||||
|
||||
@ -295,7 +286,7 @@ inline static void *getKdContext(const char *const adam,
|
||||
return NULL;
|
||||
|
||||
struct shared_ptr SVFootHillPContext;
|
||||
_ZN21SVFootHillSessionCtrl14decryptContextERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKN11SVDecryptor15SVDecryptorTypeERKb(
|
||||
_ZN21SVFootHillSessionCtrl14decryptContextERKNSt6__ndk112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKN11SVDecryptor15SVDecryptorTypeERKbASM(
|
||||
&SVFootHillPContext, FHinstance, persistK.obj);
|
||||
|
||||
if (SVFootHillPContext.obj == NULL)
|
||||
@ -363,8 +354,6 @@ void handle(const int connfd) {
|
||||
}
|
||||
|
||||
extern uint8_t handle_cpp(int);
|
||||
static char *selfPath;
|
||||
static char *portStr;
|
||||
|
||||
inline static int new_socket() {
|
||||
const int fd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
|
||||
@ -376,8 +365,8 @@ inline static int new_socket() {
|
||||
setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));
|
||||
|
||||
static struct sockaddr_in serv_addr = {.sin_family = AF_INET};
|
||||
serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
||||
serv_addr.sin_port = htons(port);
|
||||
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;
|
||||
@ -388,8 +377,8 @@ inline static int new_socket() {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
fprintf(stderr, "[!] listening 127.0.0.1:%d\n", port);
|
||||
close(STDOUT_FILENO);
|
||||
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);
|
||||
@ -423,24 +412,110 @@ inline static int new_socket() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const char* get_m3u8_method_play(uint8_t leaseMgr[16], unsigned long adam) {
|
||||
union std_string HLS = new_std_string_short_mode("HLS");
|
||||
struct std_vector HLSParam = new_std_vector(&HLS);
|
||||
static uint8_t z0 = 0;
|
||||
struct shared_ptr ptr_result;
|
||||
_ZN22SVPlaybackLeaseManager12requestAssetERKmRKNSt6__ndk16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKbASM(
|
||||
&ptr_result, leaseMgr, &adam, &HLSParam, &z0
|
||||
);
|
||||
if (_ZNK23SVPlaybackAssetResponse13hasValidAssetEv(ptr_result.obj)) {
|
||||
struct shared_ptr *playbackAsset = _ZNK23SVPlaybackAssetResponse13playbackAssetEv(ptr_result.obj);
|
||||
union std_string *m3u8 = malloc(24);
|
||||
void *playbackObj = playbackAsset->obj;
|
||||
_ZNK17storeservicescore13PlaybackAsset9URLStringEvASM(m3u8, playbackObj);
|
||||
const char *m3u8_str = std_string_data(m3u8);
|
||||
return m3u8_str;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void handle_m3u8(const int connfd) {
|
||||
while (1)
|
||||
{
|
||||
uint8_t adamSize;
|
||||
if (!readfull(connfd, &adamSize, sizeof(uint8_t))) {
|
||||
return;
|
||||
}
|
||||
if (adamSize <= 0) {
|
||||
return;
|
||||
}
|
||||
char adam[adamSize];
|
||||
for (int i=0; i<adamSize; i=i+1) {
|
||||
readfull(connfd, &adam[i], sizeof(uint8_t));
|
||||
}
|
||||
char *ptr;
|
||||
unsigned long adamID = strtoul(adam, &ptr, 10);
|
||||
const char *m3u8 = get_m3u8_method_play(leaseMgr, adamID);
|
||||
if (m3u8 == NULL) {
|
||||
fprintf(stderr, "[.] failed to get m3u8 of adamId: %ld\n", adamID);
|
||||
writefull(connfd, NULL, sizeof(NULL));
|
||||
} else {
|
||||
fprintf(stderr, "[.] m3u8 adamId: %ld, url: %s\n", adamID, m3u8);
|
||||
strcat((char *)m3u8, "\n");
|
||||
writefull(connfd, (void *)m3u8, strlen(m3u8));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline void *new_socket_m3u8(void *args) {
|
||||
const int fd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
|
||||
if (fd == -1) {
|
||||
perror("socket");
|
||||
}
|
||||
const int optval = 1;
|
||||
setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));
|
||||
|
||||
static struct sockaddr_in serv_addr = {.sin_family = AF_INET};
|
||||
inet_pton(AF_INET, args_info.host_arg, &serv_addr.sin_addr);
|
||||
serv_addr.sin_port = htons(args_info.m3u8_port_arg);
|
||||
if (bind(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
|
||||
perror("bind");
|
||||
}
|
||||
|
||||
if (listen(fd, 5) == -1) {
|
||||
perror("listen");
|
||||
}
|
||||
|
||||
fprintf(stderr, "[!] listening m3u8 request on %s:%d\n", args_info.host_arg, args_info.m3u8_port_arg);
|
||||
// close(STDOUT_FILENO);
|
||||
|
||||
static struct sockaddr_in peer_addr;
|
||||
static socklen_t peer_addr_size = sizeof(peer_addr);
|
||||
while (1) {
|
||||
const int connfd = accept4(fd, (struct sockaddr *)&peer_addr,
|
||||
&peer_addr_size, SOCK_CLOEXEC);
|
||||
if (connfd == -1) {
|
||||
if (errno == ENETDOWN || errno == EPROTO || errno == ENOPROTOOPT ||
|
||||
errno == EHOSTDOWN || errno == ENONET ||
|
||||
errno == EHOSTUNREACH || errno == EOPNOTSUPP ||
|
||||
errno == ENETUNREACH)
|
||||
continue;
|
||||
perror("accept4");
|
||||
|
||||
}
|
||||
|
||||
handle_m3u8(connfd);
|
||||
|
||||
if (close(connfd) == -1) {
|
||||
perror("close");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
selfPath = argv[0];
|
||||
if (argc != 2) {
|
||||
if (argc != 4) {
|
||||
fprintf(stderr, "usage: %s [port] ([username] [password])\n",
|
||||
argv[0]);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
amUsername = argv[2];
|
||||
passLen = strlen(argv[3]);
|
||||
amPassword = malloc(passLen + 7);
|
||||
strcpy(amPassword, argv[3]);
|
||||
}
|
||||
port = atoi(portStr = argv[1]);
|
||||
cmdline_parser(argc, argv, &args_info);
|
||||
|
||||
init();
|
||||
const struct shared_ptr ctx = init_ctx();
|
||||
if (argc == 4 && !login(ctx)) {
|
||||
if (args_info.login_given) {
|
||||
amUsername = strtok(args_info.login_arg, ":");
|
||||
amPassword = strtok(NULL, ":");
|
||||
}
|
||||
if (args_info.login_given && !login(ctx)) {
|
||||
fprintf(stderr, "[!] login failed\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
@ -450,7 +525,13 @@ int main(int argc, char *argv[]) {
|
||||
_ZN22SVPlaybackLeaseManager25refreshLeaseAutomaticallyERKb(leaseMgr,
|
||||
&autom);
|
||||
_ZN22SVPlaybackLeaseManager12requestLeaseERKb(leaseMgr, &autom);
|
||||
FHinstance = _ZN21SVFootHillSessionCtrl8instanceEv();
|
||||
FHinstance = getFootHillInstance();
|
||||
|
||||
if (args_info.m3u8_port_given) {
|
||||
pthread_t m3u8_thread;
|
||||
pthread_create(&m3u8_thread, NULL, &new_socket_m3u8, NULL);
|
||||
} else {
|
||||
fprintf(stderr, "[!] The feature of getting m3u8 is defaultly disabled because it's unstable now. To enable it, please manually specify m3u8-port param.\n");
|
||||
}
|
||||
return new_socket();
|
||||
}
|
@ -0,0 +1 @@
|
||||
GITKEEP
|
@ -0,0 +1 @@
|
||||
GITKEEP
|
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
Reference in New Issue
Block a user