apkpatcher package

Submodules

apkpatcher.cli module

apkpatcher.cli.main() int

cli function

apkpatcher.conf module

conf file

Module contents

class apkpatcher.Manifest(file: Path)

Bases: object

read()
update(xml)
write()
class apkpatcher.Patcher

Bases: object

Raises:

ValueError: _description_ ValueError: _description_ ValueError: _description_ when: _description_ FileNotFoundError: _description_ FileNotFoundError: _description_ ValueError: _description_ FileNotFoundError: _description_ ValueError: _description_

ARCH_ARM = 'arm'
ARCH_ARM64 = 'arm64'
ARCH_X64 = 'x64'
ARCH_X86 = 'x86'
ARCH_X86_64 = 'x86_64'
AUTOLOAD_BIT = 2
CONFIG_BIT = 1
DEFAULT_CONFIG_NAME = 'generatedConfigFile.config'
DEFAULT_HOOKFILE_NAME = 'libhook.js.so'
INTERNET_PERMISSION = 'android.permission.INTERNET'
add_certificate(keycertificate: Path | str, keyalias: str, keypass: str)

Add signature certificate

Args:

keycertificate (Path | str): certificate path keyalias (str): aliasname keypass (str): password

add_network_certificate(cert: Path)

add network certificate

Args:

cert (Path): the certificate to inject

calculate_sha256(file_path: Path)

Calculate the SHA-256 hash of a file.

Parameters:

file_path – Path to the file.

Returns:

SHA-256 hash as a hexadecimal string.

check_libextract() bool

Force extractNativeLibs=true on the base AND every split manifest.

compute_directory_hashes(base_directory, hash_dict: dict | None = None) None

Compute SHA-256 hashes for all files in a directory and store them in a nested dictionary.

Parameters:

base_directory – Path to the base directory.

create_lib_arch_folders(arch)

make lib folder in the apk to put native lib

create_security_config_xml(path_network: str) bool

Create security config file for add certificate

Args:

path_network (str): path network

delete_existing_gadget(arch_folder: Path, lib_name: str, delete_custom_files: int = 0)

delete existing gadget inside the apk

download_frida() str | None

Download frida binary

Returns:

str | None: return the name of lib

enable_debug_mode() bool

Enable debug mode

Returns:

bool: success to enable debug mode

enable_user_certificates(rsc: ARSC)

Enable user certificate

Args:

rsc (pyaxml.ARSC): return ARSC file return 2 if rsc modified return 1 if success return 0 if failed

enable_v4_signature(file: Path | str)

enable v4 signature

Args:

file (Path | str): v4_signature file

extract_apk(apk: Path, final_dir: Path)

Extract the apk on the temporary folder

extract_dex(dex_file: Path)

Extract Dex

Args:

dex_file (Path): the dexfile to extract

get_entrypoint_class_name() str | None

get the class name of the entrypoint

get_entrypoint_smali_path() Path | None

get the path of apk entrypoint on the smali files

get_package() str
has_permission(permission_name: str) bool

Check if the apk have ‘permission_name’ as permission

Parameters:

permission_name (str): name of the permission with format: android.permission.XXX

Returns:

has_permission (bool): permission is present

inject_custom_network_certificate(rsc, path_network: str) bool

Inject custom network certificate

inject_permission_manifest(permission: str)

Inject permission on the Manifest

inject_user_certificates_label(rsc: ARSC) -> (<class 'str'>, <class 'int'>)

Inject a proxy certificate directly inside the application

Args:

rsc (pyaxml.ARSC): ARSC file (resource file of Android)

Raises:

FileNotFoundError: raise when manifest is not found

Returns:

str: return the path of network file

insert_lib(gadget_path: str | Path, arch: str, dst: str | Path, config_file_path=None, auto_load_script_path=None)

Insert native lib inside the apk

Parameters:
  • gadget_path (str): the path of the gadget to insert

insert_lib_loader(lib_name='libfrida-gadget')

inject snippet to load lib in smali code

keep_certificate()

keep certificate after use it

missing_sdktools()

raise an error when sdktools is missing

Raises:

ValueError: The error

property need_full_extraction: bool

need full extraction

Returns:

bool: return true if needed full extraction

patching(gadget_to_use: str | Path | None = None, output_file: Path | None = None, user_certificate: bool = False, splits_apk: list[Path] | None = None, entrypoint=None, permissions: list[str] = None) bool

patch the apk with gadget ‘gadget_to_use’

property pause: bool

get Pause status

Returns:

bool: pause

repackage_apk(target_file: Path | None = None) Path | None

repackage the apk

Parameters:
  • target_file (str) : the path of the new apk created if none, a new apk will be created with suffix “_patched.apk”

repackage_dex(classes_dir: Path) bool

Repackage Dex

Args:

classes_dir (Path): classes directory

Returns:

bool: _description_

set_arch(arch: str)

set architecture of target phone where apk would be installed

Args:

arch (str): architecture

set_compression(method: int, level: int)

set compression method for zip level

Args:

method (int): one of these method ( zipfile.ZIP_STORED, zipfile.ZIP_DEFLATED, zipfile.ZIP_BZIP2, zipfile.ZIP_LZMA) level (int): The compresslevel parameter controls the compression level to use when writing files to the archive. When using ZIP_STORED or ZIP_LZMA it has no effect. When using ZIP_DEFLATED integers 0 through 9 are accepted (see zlib for more information). When using ZIP_BZIP2 integers 1 through 9 are accepted (see bz2 for more information).

set_debug()

set debug mode

set_plugin(plugin: str | Path | Callable[[List[str | Path]], int]) None

set a plugin

Args:

plugin (str | Path | Callable[str | Path]): set a plugin binary or python method that should be called just right before repackage the application. The method should take as parameter the list of directory where the apk has been unpacked.

set_use_download_frida(frida_version: str)

Specify frida version to download

Args:

frida_version (str): frida version

sign_and_zipalign(apk_path: Path, splits_apk: List[Path])

sign and zipalign file

apkpatcher.download_baksmali(output_file: Path)

Download baksmali

Args:

output_file (Path): output location

apkpatcher.download_smali(output_file: Path)

Download smali

Args:

output_file (Path): output location

apkpatcher.get_latest_version_directory(base_path: Path) str | None

Get latest version directory

Args:

base_path (Path): base path

Returns:

str | None: the latest version directory

apkpatcher.new_logger(level: logging._Level) Logger

Instanciate Logger

Args:

level (logging._Level): level of logger

Returns:

logging.Logger: new logger

apkpatcher.plba(filename: str | Path, arch: str) str

Filename with architecture

Args:

filename (str | Path): base filename arch (str): architecture

Returns:

str: return filename with architecture