From 206541d9f0013d198ca12d42135bdb5afa253721 Mon Sep 17 00:00:00 2001 From: opa334 Date: Fri, 12 Jan 2024 15:40:20 +0100 Subject: [PATCH] Update ChOma (yes this sucks) --- .../src/external/include/choma/CSBlob.h | 7 +- .../external/include/choma/CodeDirectory.h | 10 +- .../external/include/choma/MachOByteOrder.h | 2 +- .../external/include/choma/MachOLoadCommand.h | 2 +- .../src/external/include/choma/MemoryStream.h | 2 +- .../src/external/include/choma/PatchFinder.h | 76 +++++++++----- .../include/choma/PatchFinder_arm64.h | 33 ++++++ .../src/external/include/choma/SignOSSL.h | 4 + .../src/external/include/choma/Util.h | 29 +++++- .../src/external/include/choma/arm64.h | 94 ++++++++++++++++++ .../fastPathSign/src/external/lib/libchoma.a | Bin 120096 -> 120160 bytes RootHelper/external/include/choma/CSBlob.h | 7 +- .../external/include/choma/CodeDirectory.h | 10 +- .../external/include/choma/MachOByteOrder.h | 2 +- .../external/include/choma/MachOLoadCommand.h | 2 +- .../external/include/choma/MemoryStream.h | 2 +- .../external/include/choma/PatchFinder.h | 76 +++++++++----- .../include/choma/PatchFinder_arm64.h | 33 ++++++ RootHelper/external/include/choma/SignOSSL.h | 4 + RootHelper/external/include/choma/Util.h | 29 +++++- RootHelper/external/include/choma/arm64.h | 94 ++++++++++++++++++ RootHelper/external/lib/libchoma.a | Bin 92696 -> 120528 bytes 22 files changed, 446 insertions(+), 72 deletions(-) create mode 100644 Exploits/fastPathSign/src/external/include/choma/PatchFinder_arm64.h create mode 100644 Exploits/fastPathSign/src/external/include/choma/arm64.h create mode 100644 RootHelper/external/include/choma/PatchFinder_arm64.h create mode 100644 RootHelper/external/include/choma/arm64.h diff --git a/Exploits/fastPathSign/src/external/include/choma/CSBlob.h b/Exploits/fastPathSign/src/external/include/choma/CSBlob.h index f779929..0eee4d1 100644 --- a/Exploits/fastPathSign/src/external/include/choma/CSBlob.h +++ b/Exploits/fastPathSign/src/external/include/choma/CSBlob.h @@ -31,7 +31,7 @@ typedef struct __GenericBlob { } CS_GenericBlob; // CMS blob magic types -enum { +typedef enum { CSMAGIC_REQUIREMENT = 0xfade0c00, CSMAGIC_REQUIREMENTS = 0xfade0c01, CSMAGIC_CODEDIRECTORY = 0xfade0c02, @@ -44,7 +44,7 @@ enum { CSMAGIC_EMBEDDED_LAUNCH_CONSTRAINT = 0xfade8181, } CS_BlobMagic; -enum { +typedef enum { CSSLOT_CODEDIRECTORY = 0, CSSLOT_INFOSLOT = 1, CSSLOT_REQUIREMENTS = 2, @@ -90,8 +90,6 @@ CS_SuperBlob *macho_read_code_signature(MachO *macho); int macho_replace_code_signature(MachO *macho, CS_SuperBlob *superblob); -int update_load_commands(MachO *macho, CS_SuperBlob *superblob, uint64_t originalSize); - CS_DecodedBlob *csd_blob_init(uint32_t type, CS_GenericBlob *blobData); int csd_blob_read(CS_DecodedBlob *blob, uint64_t offset, size_t size, void *outBuf); int csd_blob_write(CS_DecodedBlob *blob, uint64_t offset, size_t size, const void *inBuf); @@ -104,6 +102,7 @@ uint32_t csd_blob_get_type(CS_DecodedBlob *blob); void csd_blob_set_type(CS_DecodedBlob *blob, uint32_t type); void csd_blob_free(CS_DecodedBlob *blob); +CS_DecodedSuperBlob *csd_superblob_init(void); CS_DecodedSuperBlob *csd_superblob_decode(CS_SuperBlob *superblob); CS_SuperBlob *csd_superblob_encode(CS_DecodedSuperBlob *decodedSuperblob); CS_DecodedBlob *csd_superblob_find_blob(CS_DecodedSuperBlob *superblob, uint32_t type, uint32_t *indexOut); diff --git a/Exploits/fastPathSign/src/external/include/choma/CodeDirectory.h b/Exploits/fastPathSign/src/external/include/choma/CodeDirectory.h index 66eb553..36cca20 100644 --- a/Exploits/fastPathSign/src/external/include/choma/CodeDirectory.h +++ b/Exploits/fastPathSign/src/external/include/choma/CodeDirectory.h @@ -12,7 +12,6 @@ #include "MachOLoadCommand.h" #include "MemoryStream.h" - // Code directory blob header typedef struct __CodeDirectory { uint32_t magic; @@ -26,12 +25,15 @@ typedef struct __CodeDirectory { uint32_t codeLimit; uint8_t hashSize; uint8_t hashType; - uint8_t spare1; + uint8_t platform; uint8_t pageSize; uint32_t spare2; + + /* Version 0x20100 */ uint32_t scatterOffset; uint32_t teamOffset; -} CS_CodeDirectory; +} CS_CodeDirectory +__attribute__ ((aligned(1))); enum CS_HashType { CS_HASHTYPE_SHA160_160 = 1, @@ -40,7 +42,7 @@ enum CS_HashType { CS_HASHTYPE_SHA384_384 = 4, }; -char *csd_code_directory_copy_identity(CS_DecodedBlob *codeDirBlob, uint32_t *offsetOut); +char *csd_code_directory_copy_identifier(CS_DecodedBlob *codeDirBlob, uint32_t *offsetOut); char *csd_code_directory_copy_team_id(CS_DecodedBlob *codeDirBlob, uint32_t *offsetOut); int csd_code_directory_set_team_id(CS_DecodedBlob *codeDirBlob, char *newTeamID); uint32_t csd_code_directory_get_flags(CS_DecodedBlob *codeDirBlob); diff --git a/Exploits/fastPathSign/src/external/include/choma/MachOByteOrder.h b/Exploits/fastPathSign/src/external/include/choma/MachOByteOrder.h index f1b0a7b..510df98 100644 --- a/Exploits/fastPathSign/src/external/include/choma/MachOByteOrder.h +++ b/Exploits/fastPathSign/src/external/include/choma/MachOByteOrder.h @@ -131,7 +131,7 @@ applier(cd, codeLimit); \ applier(cd, hashSize); \ applier(cd, hashType); \ - applier(cd, spare1); \ + applier(cd, platform); \ applier(cd, pageSize); \ applier(cd, spare2); \ applier(cd, scatterOffset); \ diff --git a/Exploits/fastPathSign/src/external/include/choma/MachOLoadCommand.h b/Exploits/fastPathSign/src/external/include/choma/MachOLoadCommand.h index d07ccbd..ae5514a 100644 --- a/Exploits/fastPathSign/src/external/include/choma/MachOLoadCommand.h +++ b/Exploits/fastPathSign/src/external/include/choma/MachOLoadCommand.h @@ -3,9 +3,9 @@ #include #include "MachO.h" -#include "CSBlob.h" #include "FileStream.h" #include "MachOByteOrder.h" +#include "CSBlob.h" // Convert load command to load command name char *load_command_to_string(int loadCommand); diff --git a/Exploits/fastPathSign/src/external/include/choma/MemoryStream.h b/Exploits/fastPathSign/src/external/include/choma/MemoryStream.h index b6326fb..ba00102 100644 --- a/Exploits/fastPathSign/src/external/include/choma/MemoryStream.h +++ b/Exploits/fastPathSign/src/external/include/choma/MemoryStream.h @@ -55,6 +55,6 @@ int memory_stream_expand(MemoryStream *stream, size_t expandAtStart, size_t expa void memory_stream_free(MemoryStream *stream); int memory_stream_copy_data(MemoryStream *originStream, uint64_t originOffset, MemoryStream *targetStream, uint64_t targetOffset, size_t size); -int memory_stream_find_memory(MemoryStream *stream, uint64_t searchOffset, size_t searchSize, void *bytes, void *mask, size_t nbytes, uint16_t alignment, uint64_t *foundOffsetOut); +int memory_stream_find_memory(MemoryStream *stream, uint64_t searchStartOffset, uint64_t searchEndOffset, void *bytes, void *mask, size_t nbytes, uint16_t alignment, uint64_t *foundOffsetOut); #endif // MEMORY_STREAM_H \ No newline at end of file diff --git a/Exploits/fastPathSign/src/external/include/choma/PatchFinder.h b/Exploits/fastPathSign/src/external/include/choma/PatchFinder.h index d15b0f4..84cc117 100644 --- a/Exploits/fastPathSign/src/external/include/choma/PatchFinder.h +++ b/Exploits/fastPathSign/src/external/include/choma/PatchFinder.h @@ -1,11 +1,16 @@ +#ifndef PATCHFINDER_H +#define PATCHFINDER_H + #include #include "MachO.h" -#define METRIC_TYPE_PATTERN 1 -#define METRIC_TYPE_STRING_XREF 2 -#define METRIC_TYPE_FUNCTION_XREF 3 +enum { + PF_METRIC_TYPE_PATTERN, + PF_METRIC_TYPE_STRING, + PF_METRIC_TYPE_XREF, +}; -typedef struct PFSection { +typedef struct s_PFSection { MachO *macho; uint64_t fileoff; uint64_t vmaddr; @@ -14,34 +19,57 @@ typedef struct PFSection { bool ownsCache; } PFSection; -PFSection *pf_section_init_from_macho(MachO *macho, const char *filesetEntryId, const char *segName, const char *sectName); -int pf_section_read_at_relative_offset(PFSection *section, uint64_t rel, size_t size, void *outBuf); -int pf_section_read_at_address(PFSection *section, uint64_t vmaddr, void *outBuf, size_t size); -uint32_t pf_section_read32(PFSection *section, uint64_t vmaddr); -int pf_section_set_cached(PFSection *section, bool cached); -void pf_section_free(PFSection *section); +PFSection *pfsec_init_from_macho(MachO *macho, const char *filesetEntryId, const char *segName, const char *sectName); +int pfsec_read_reloff(PFSection *section, uint64_t rel, size_t size, void *outBuf); +uint32_t pfsec_read32_reloff(PFSection *section, uint64_t rel); +int pfsec_read_at_address(PFSection *section, uint64_t vmaddr, void *outBuf, size_t size); +uint32_t pfsec_read32(PFSection *section, uint64_t vmaddr); +uint64_t pfsec_read64(PFSection *section, uint64_t vmaddr); +int pfsec_read_string(PFSection *section, uint64_t vmaddr, char **outString); +int pfsec_set_cached(PFSection *section, bool cached); +uint64_t pfsec_find_prev_inst(PFSection *section, uint64_t startAddr, uint32_t searchCount, uint32_t inst, uint32_t mask); +uint64_t pfsec_find_next_inst(PFSection *section, uint64_t startAddr, uint32_t searchCount, uint32_t inst, uint32_t mask); +uint64_t pfsec_find_function_start(PFSection *section, uint64_t midAddr); +void pfsec_free(PFSection *section); -typedef struct MetricShared { +typedef struct s_MetricShared { uint32_t type; } MetricShared; - -typedef enum { - BYTE_PATTERN_ALIGN_8_BIT, - BYTE_PATTERN_ALIGN_16_BIT, - BYTE_PATTERN_ALIGN_32_BIT, - BYTE_PATTERN_ALIGN_64_BIT, -} BytePatternAlignment; - -typedef struct BytePatternMetric { +typedef struct s_PFPatternMetric { MetricShared shared; void *bytes; void *mask; size_t nbytes; - BytePatternAlignment alignment; -} BytePatternMetric; + uint16_t alignment; +} PFPatternMetric; -BytePatternMetric *pf_create_byte_pattern_metric(void *bytes, void *mask, size_t nbytes, BytePatternAlignment alignment); -void pf_section_run_metric(PFSection *section, void *metric, void (^matchBlock)(uint64_t vmaddr, bool *stop)); +typedef struct s_PFStringMetric { + MetricShared shared; + + char *string; +} PFStringMetric; + +typedef enum { + XREF_TYPE_MASK_CALL = (1 << 0), + XREF_TYPE_MASK_REFERENCE = (1 << 1), + XREF_TYPE_MASK_ALL = (XREF_TYPE_MASK_CALL | XREF_TYPE_MASK_REFERENCE), +} PFXrefTypeMask; + +typedef struct s_PFXrefMetric { + MetricShared shared; + + uint64_t address; + PFXrefTypeMask typeMask; +} PFXrefMetric; + +PFPatternMetric *pfmetric_pattern_init(void *bytes, void *mask, size_t nbytes, uint16_t alignment); +PFStringMetric *pfmetric_string_init(const char *string); +PFXrefMetric *pfmetric_xref_init(uint64_t address, PFXrefTypeMask types); +void pfmetric_free(void *metric); + +void pfmetric_run_in_range(PFSection *section, uint64_t startAddr, uint64_t endAddr, void *metric, void (^matchBlock)(uint64_t vmaddr, bool *stop)); +void pfmetric_run(PFSection *section, void *metric, void (^matchBlock)(uint64_t vmaddr, bool *stop)); +#endif \ No newline at end of file diff --git a/Exploits/fastPathSign/src/external/include/choma/PatchFinder_arm64.h b/Exploits/fastPathSign/src/external/include/choma/PatchFinder_arm64.h new file mode 100644 index 0000000..c487bd6 --- /dev/null +++ b/Exploits/fastPathSign/src/external/include/choma/PatchFinder_arm64.h @@ -0,0 +1,33 @@ +#ifndef PATCHFINDER_ARM64_H +#define PATCHFINDER_ARM64_H + +#include "PatchFinder.h" + +typedef enum { + ARM64_XREF_TYPE_B = 0, + ARM64_XREF_TYPE_BL = 1, + ARM64_XREF_TYPE_ADR = 2, + ARM64_XREF_TYPE_ADRP_ADD = 3, + ARM64_XREF_TYPE_ADRP_LDR = 4, + ARM64_XREF_TYPE_ADRP_STR = 5, +} Arm64XrefType; + +typedef enum { + ARM64_XREF_TYPE_MASK_B = (1 << ARM64_XREF_TYPE_B), + ARM64_XREF_TYPE_MASK_BL = (1 << ARM64_XREF_TYPE_BL), + ARM64_XREF_TYPE_MASK_CALL = (ARM64_XREF_TYPE_MASK_B | ARM64_XREF_TYPE_MASK_BL), + + ARM64_XREF_TYPE_MASK_ADR = (1 << ARM64_XREF_TYPE_ADR), + ARM64_XREF_TYPE_MASK_ADRP_ADD = (1 << ARM64_XREF_TYPE_ADRP_ADD), + ARM64_XREF_TYPE_MASK_ADRP_LDR = (1 << ARM64_XREF_TYPE_ADRP_LDR), + ARM64_XREF_TYPE_MASK_ADRP_STR = (1 << ARM64_XREF_TYPE_ADRP_STR), + ARM64_XREF_TYPE_MASK_REFERENCE = (ARM64_XREF_TYPE_MASK_ADR | ARM64_XREF_TYPE_MASK_ADRP_ADD | ARM64_XREF_TYPE_MASK_ADRP_LDR | ARM64_XREF_TYPE_MASK_ADRP_STR), + + ARM64_XREF_TYPE_ALL = (ARM64_XREF_TYPE_MASK_CALL | ARM64_XREF_TYPE_MASK_REFERENCE), +} Arm64XrefTypeMask; + +uint64_t pfsec_arm64_resolve_adrp_ldr_str_add_reference(PFSection *section, uint64_t adrpAddr, uint64_t ldrStrAddAddr); +uint64_t pfsec_arm64_resolve_adrp_ldr_str_add_reference_auto(PFSection *section, uint64_t ldrStrAddAddr); +uint64_t pfsec_arm64_resolve_stub(PFSection *section, uint64_t stubAddr); +void pfsec_arm64_enumerate_xrefs(PFSection *section, Arm64XrefTypeMask types, void (^xrefBlock)(Arm64XrefType type, uint64_t source, uint64_t target, bool *stop)); +#endif \ No newline at end of file diff --git a/Exploits/fastPathSign/src/external/include/choma/SignOSSL.h b/Exploits/fastPathSign/src/external/include/choma/SignOSSL.h index 00afe5f..f1be620 100644 --- a/Exploits/fastPathSign/src/external/include/choma/SignOSSL.h +++ b/Exploits/fastPathSign/src/external/include/choma/SignOSSL.h @@ -1,6 +1,8 @@ #ifndef SIGN_OSSL_H #define SIGN_OSSL_H +#ifndef DISABLE_SIGNING + #include #include #include @@ -11,6 +13,8 @@ unsigned char *signWithRSA(unsigned char *inputData, size_t inputDataLength, unsigned char *key, size_t key_len, size_t *outputDataLength); +#endif + #endif // SIGN_OSSL_H // 0xA422 \ No newline at end of file diff --git a/Exploits/fastPathSign/src/external/include/choma/Util.h b/Exploits/fastPathSign/src/external/include/choma/Util.h index 4bbda41..e4ccf64 100644 --- a/Exploits/fastPathSign/src/external/include/choma/Util.h +++ b/Exploits/fastPathSign/src/external/include/choma/Util.h @@ -1,7 +1,34 @@ +#ifndef UTIL_H +#define UTIL_H + #include #include +#include +typedef struct s_optional_uint64 { + bool isSet; + uint64_t value; +} optional_uint64_t; +#define OPT_UINT64_IS_SET(x) (x.isSet) +#define OPT_UINT64_GET_VAL(x) (x.value) +#define OPT_UINT64_NONE (optional_uint64_t){.isSet = false, .value = 0} +#define OPT_UINT64(x) (optional_uint64_t){.isSet = true, .value = x} + + +typedef struct s_optional_bool { + bool isSet; + bool value; +} optional_bool; +#define OPT_BOOL_IS_SET(x) (x.isSet) +#define OPT_BOOL_GET_VAL(x) (x.value) +#define OPT_BOOL_NONE (optional_bool){.isSet = false, .value = false} +#define OPT_BOOL(x) (optional_bool){.isSet = true, .value = x} + +int64_t sxt64(int64_t value, uint8_t bits); int memcmp_masked(const void *str1, const void *str2, unsigned char* mask, size_t n); uint64_t align_to_size(int size, int alignment); int count_digits(int64_t num); -void print_hash(uint8_t *hash, size_t size); \ No newline at end of file +void print_hash(uint8_t *hash, size_t size); +void enumerate_range(uint64_t start, uint64_t end, uint16_t alignment, size_t nbytes, bool (^enumerator)(uint64_t cur)); + +#endif \ No newline at end of file diff --git a/Exploits/fastPathSign/src/external/include/choma/arm64.h b/Exploits/fastPathSign/src/external/include/choma/arm64.h new file mode 100644 index 0000000..9affc1d --- /dev/null +++ b/Exploits/fastPathSign/src/external/include/choma/arm64.h @@ -0,0 +1,94 @@ +#ifndef ARM64_H +#define ARM64_H + +#include "Util.h" + +typedef enum { + // registers + ARM64_REG_TYPE_X, + ARM64_REG_TYPE_W, + + // vector shit + ARM64_REG_TYPE_Q, + ARM64_REG_TYPE_D, + ARM64_REG_TYPE_S, + ARM64_REG_TYPE_H, + ARM64_REG_TYPE_B, +} arm64_register_type; + +enum { + ARM64_REG_MASK_ANY_FLAG = (1 << 0), + ARM64_REG_MASK_X_W = (1 << 1), + ARM64_REG_MASK_VECTOR = (1 << 2), + ARM64_REG_MASK_ALL = (ARM64_REG_MASK_X_W | ARM64_REG_MASK_VECTOR), + + ARM64_REG_MASK_ANY_X_W = (ARM64_REG_MASK_X_W | ARM64_REG_MASK_ANY_FLAG), + ARM64_REG_MASK_ANY_VECTOR = (ARM64_REG_MASK_VECTOR | ARM64_REG_MASK_ANY_FLAG), + ARM64_REG_MASK_ANY_ALL = (ARM64_REG_MASK_ALL | ARM64_REG_MASK_ANY_FLAG), +}; + +typedef enum { + LDR_STR_TYPE_ANY, // NOTE: "ANY" will inevitably also match STUR and LDUR instructions + LDR_STR_TYPE_POST_INDEX, + LDR_STR_TYPE_PRE_INDEX, + LDR_STR_TYPE_UNSIGNED, +} arm64_ldr_str_type; + +typedef struct s_arm64_register { + uint8_t mask; + arm64_register_type type; + uint8_t num; +} arm64_register; + +#define ARM64_REG(type_, num_) (arm64_register){.mask = ARM64_REG_MASK_ALL, .type = type_, .num = num_} +#define ARM64_REG_X(x) ARM64_REG(ARM64_REG_TYPE_X, x) +#define ARM64_REG_W(x) ARM64_REG(ARM64_REG_TYPE_W, x) +#define ARM64_REG_Q(x) ARM64_REG(ARM64_REG_TYPE_Q, x) +#define ARM64_REG_S(x) ARM64_REG(ARM64_REG_TYPE_S, x) +#define ARM64_REG_H(x) ARM64_REG(ARM64_REG_TYPE_H, x) +#define ARM64_REG_B(x) ARM64_REG(ARM64_REG_TYPE_B, x) +#define ARM64_REG_ANY (arm64_register){.mask = ARM64_REG_MASK_ANY_ALL, .type = 0, .num = 0} +#define ARM64_REG_ANY_X_W (arm64_register){.mask = ARM64_REG_MASK_ANY_X_W, .type = 0, .num = 0} +#define ARM64_REG_ANY_VECTOR (arm64_register){.mask = ARM64_REG_MASK_ANY_VECTOR, .type = 0, .num = 0} +#define ARM64_REG_GET_TYPE(x) (x.type) +#define ARM64_REG_IS_X(x) (x.type == ARM64_REG_TYPE_X) +#define ARM64_REG_IS_W(x) (x.type == ARM64_REG_TYPE_W) +#define ARM64_REG_IS_VECTOR(x) (x.type == ARM64_REG_TYPE_Q || x.type == ARM64_REG_TYPE_D || x.type == ARM64_REG_TYPE_S || x.type == ARM64_REG_TYPE_H || x.type == ARM64_REG_TYPE_B) +#define ARM64_REG_GET_NUM(x) (x.num & 0x1f) +#define ARM64_REG_IS_ANY(x) (x.mask == ARM64_REG_MASK_ANY_ALL) +#define ARM64_REG_IS_ANY_X_W(x) (x.mask == ARM64_REG_MASK_ANY_X_W) +#define ARM64_REG_IS_ANY_VECTOR(x) (x.mask == ARM64_REG_MASK_ANY_VECTOR) +uint8_t arm64_reg_type_get_width(arm64_register_type type); +const char *arm64_reg_type_get_string(arm64_register_type type); +const char *arm64_reg_get_type_string(arm64_register reg); + +#define ARM64_REG_NUM_SP 31 + +typedef struct s_arm64_cond { + bool isSet; + uint8_t value; +} arm64_cond; +#define ARM64_COND(x) (arm64_cond){.isSet = true, .value = x} +#define ARM64_COND_ANY (arm64_cond){.isSet = false, .value = 0} +#define ARM64_COND_GET_VAL(x) (x.value & 0xf) +#define ARM64_COND_IS_SET(x) x.isSet + +int arm64_gen_b_l(optional_bool optIsBl, optional_uint64_t optOrigin, optional_uint64_t optTarget, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_b_l(uint32_t inst, uint64_t origin, uint64_t *targetOut, bool *isBlOut); +int arm64_gen_b_c_cond(optional_bool optIsBc, optional_uint64_t optOrigin, optional_uint64_t optTarget, arm64_cond optCond, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_b_c_cond(uint32_t inst, uint64_t origin, uint64_t *targetOut, arm64_cond *condOut, bool *isBcOut); +int arm64_gen_adr_p(optional_bool optIsAdrp, optional_uint64_t optOrigin, optional_uint64_t optTarget, arm64_register reg, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_adr_p(uint32_t inst, uint64_t origin, uint64_t *targetOut, arm64_register *registerOut, bool *isAdrpOut); +int arm64_gen_mov_imm(char type, arm64_register destinationReg, optional_uint64_t optImm, optional_uint64_t optShift, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_mov_imm(uint32_t inst, arm64_register *destinationRegOut, uint64_t *immOut, uint64_t *shiftOut, char *typeOut); +int arm64_gen_add_imm(arm64_register destinationReg, arm64_register sourceReg, optional_uint64_t optImm, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_add_imm(uint32_t inst, arm64_register *destinationRegOut, arm64_register *sourceRegOut, uint16_t *immOut); +int arm64_gen_ldr_imm(char type, arm64_ldr_str_type instType, arm64_register destinationReg, arm64_register addrReg, optional_uint64_t optImm, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_ldr_imm(uint32_t inst, arm64_register *destinationReg, arm64_register *addrReg, uint64_t *immOut, char *typeOut, arm64_ldr_str_type *instTypeOut); +int arm64_gen_str_imm(char type, arm64_ldr_str_type instType, arm64_register sourceReg, arm64_register addrReg, optional_uint64_t optImm, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_str_imm(uint32_t inst, arm64_register *sourceRegOut, arm64_register *addrRegOut, uint64_t *immOut, char *typeOut, arm64_ldr_str_type *instTypeOut); +int arm64_gen_ldr_lit(arm64_register destinationReg, optional_uint64_t optImm, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_ldr_lit(uint32_t inst, arm64_register *destinationReg, int64_t *immOut); +int arm64_gen_cb_n_z(optional_bool isCbnz, arm64_register reg, optional_uint64_t optTarget, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_cb_n_z(uint32_t inst, uint64_t origin, bool *isCbnzOut, arm64_register *regOut, uint64_t *targetOut); +#endif \ No newline at end of file diff --git a/Exploits/fastPathSign/src/external/lib/libchoma.a b/Exploits/fastPathSign/src/external/lib/libchoma.a index e69e1860cc810354eee338317d1085e780294d9c..44849e384225f37772a5f52809bcefcc4edc6e35 100644 GIT binary patch delta 41464 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 delta 42189 zcmcJ24R}=5ng4s|CS)expG>|p5s-ikBq2bsj0^?@G(aFku@Ht~GLWgmOqdLsRNWgp z*3xQM;CglgWT} z`+uJQd7k8*-}(N!_n!AX?|IMolNm!#W*n)gZES38tY6w>vn{J{u-R;l^){Q$)=*!+ zys61%ThZ9iIJl}(GiQ)+J(WaP5D9t%5p7sZv`8iDaS&b4bQi)MM7J^h64QTR`maoX z#`M3KPBP6_WcmuGixkpChM!=MtxUU^hMC^W^y^HYW%@GHx0y~cooA8-ZDhKS>0L}8 zXL`z{$%yCJqkvobhcu$L+lfx9lKzD0AD9+%_;RK@nBLBG56Alt#@}UHkuLN5JH~w) zN4%HmNksS#(Q8caVR{GCHB8%>`k8*2>Ax{uGmGfNkBEwy{w7`G+h!4+IZxEdRMRqu z&b&qRDm>mI`UBH%vH!m@En!;AbQ#n2Oxu~>!t|?5f5CK+^Zh2%?@OxD9J4H#m}+LC zz7mCYGL16*7SpSlzRvV53z6*_h0Zelqgmo5nUWSWC8n!5-Znusg$}UCT}(G{#IG>E zlIcPA-^Fy4{d1UpF_Y+_9SS|nbcE?yrstXdo~b#D=pk)~LS^`|L!pIC9Za_{?am@P zb3mapOmAa)nCVxUKEw3>LZa@!QRqLiBt2Rn>35jE#Poatk%ovD*&~A!mN2bidL`2) zrcS0eFx|;?AJbcz-p%wV(z*uO#jHVFi++) zpXq9*n>GHin`s}@!%V-#^y^H&!}Lc?f6FvCUl!2Fw3X=rre9?G_e@`8s{Mk0{ElfF z&xHb}Hl__s*E8M1^pi~YGW`_OLrlNGw77^U{)j>v)2~XZ(Lb=q_nH2dX?n3tP|0)! z``^ekz_h8D=H;bNi2UV`Cuf-OoiPdn|97j??Zvc*q;@crW$gx`}{w0dz~EZ4$P61N+0>B3zR` zGcuFGTlUGIuFHlcax@|*<+;Vz)e=0=;|_Vr74&tj>1tWCvA6dS+9TkWmi9LJGtjTC z>kE4WUEZ!6y!{=$?){u3(BBsH`#k+JT2GJPi+?_kJM0Sv+I{;2q63i|!dkqc@VdUR z_}#v#ZC$_<>hD3!>Ett_ctf{(Lu(F&yS)J|%$Z&i)f?#b1p^|_jcd1gJ;6}djc&iM z>+)4dZ3d^C&NVecTPV2C=l5!tG$u9T)-@dUV`H{=2fcfPebZ%b4D^QGe!n-==Jwp; z-tPaH*`tWF9~W)E@DQqHX^5F3gSLBn!yK%o zgolE+`Y`Ukz<%!bq!XzHtA> zz`o!bkH_2FJJbIL&D+1R%Nq#$_WAhvxYph4^Rxs5z2T7C7YNG)$kn$GQ&l#>=Vkxk zfdj$7X7>SE&6ePyKseMtjYIymzTR-ixAzbphqhoM!?oUCPsrC3){LiQou}>4-W$B~ ziCcHT?enkc>IxYZUKa?54)um_^oDxT6w!#(iF#R2*-_|+%Li-0t{D?MHB(WOwoowa z^&}qX)Hoa4+PS||LpJ$5pota-z|9(RxTqaxs4mHgnPmM}fxMgG@? zeBMBpe|iKq2D*KFec_oeH2F4M;}36kYdmr@UVp7YkK2C(W`@XAKwo$|(@pK0x3`6S z0gtc8?N1E$rY`vuZR%>=*6S82H+3~JU1m@tXtQj%CfJEF2X0~}lz93qs`MS1-TY6-qt>KQ% z!Lacx8#Qh3b~lLHj{fN<}qfk8SetkXLyV8o_-U! zdiJ?`<)n9o4h39$`@`NIcR1_~xej>4A)kj3!xQql!(I{SlA(d*U?YQlzCf4jfcHQ! z)Gv}H{6o23Z?ccRwXj%A1c$utuBDC1;lj)14!hjO%OSa%UbhGfdHwFN?^drXxNl#t zH#{@_q03gV*Bf?u+@5Z47rFF{g{4Nr0^ZwPy@z_dp}qd#UYh>t3VD0{ZjaZ+{=WSI zclc09VqOc9Yp=W4yS&Ne6>A`JA=XX4aQC+MHPOGlQmNGS+=>df-?u;D3I|=izE69} z<-r@&)#cmo3-{`SMU~OtEl|p437Ji!zICznZ1JUoIa&s+0uq( z^$p7}FVR`rEG0ZP+n&spP3>Z>=?m;%9Mo%{t9aSM?{|G~3M3ylyr$Ecj8e`-m+zOX8{WC!Qvlxb)mHuxhuS#w zw1o(HoXOHZZJjGxwcw>JqDmq70!f4Xy}SusWLuUD${6HlhK zp5uU+S{08)I^(gi%8{7b86P^XoQ*}w;<2$^BQdpngYM6*@R! zJz9R4GanwiX(VcER7&-sZT4y?j4Toh(D>`JhDK^yw|K)-kz}P zn_sTnTs`tnM8#+?5e*{y7>cQ-!8J6n%|vwMTB5<@9_4Hr4Q%^g7r)`FskugW#>bB< zgA*%gGN$etndqg_b1jM}@qgE#yNHS>RyZdw^g2h;pbJZ!lW%#Pqca88q$#GQ~oR~wC6F+v2PTWAF=cZ`zjpMTG{#Omjy$1E0 z;>jUKVR7}yQljGV<1~1#<*&%9(w165t8?-~g>w=E96eI6RAPeV7NEeB&QWtZ9h_K! zVb`ihW~C%OHC8=>DLOQ^d*tHnHx7Ro>=>RJOCLO~x_-JY6bgo}wyj;a%?4i6=Igcj z0=I%0u-R?id?~+v@w8>lfSF{9bpj*M@hG?NF~Tu;1qI z@@ZW*U!XVab$8i<`)uIQ5WYB*rc0V;N^K!;_)sX|?Xu15vI#a9xg;3SeZlE;dj+Rz z3*PDt?ehn3v)$J14J0Mm)Nb<#zEum`d@^DCA+ajmcgXMWmodFv$$8f%*GaIV20O?V zm{GePcStnxvXx6>tu^mQwJK4?@L%7mq$F$C{l&^^qA!iwVtwcBTI&wG7iV6+L#AW= zzx9VmAHs*f*VgL|FV-?C*~`~!3k1V9x2>0X`sucROhYbhhbZMQwj;DLpzTW<*l@Qu zeGxiD-yD@bv?3AQGRhdLr>RM2h&( zf#MT|aKn8NJ-bS=YOkn76-4%zRH8zn))yspJj?zgDp3JZ>(i1tjwu(=9`^T}gy_7rTT;g=6Hz&lz1~D*A!=PDs78)_PLOR9 zviw%Fq>h&qS%DW7q70(eGm<(UR*0-b_5lvRLm^5dYVDKM(arwY44OsMx<^t+lOiin zrx2wRwax|Ah#bY7AfGeBc2gRW<3o}ah?7`^w0=emQOcv2Hm{;I>8Yh<^)eLex32x82=CBm0ZCVJQ#Qe z7<(9JFh0)sx19c8W{LI_{e(TTxB~yoxS4S|XJGV@0-V(13B*q$GS-h@B%(a-Vz^sn z*C*T}1M3GLwL-KkR*Z)GYzh`~Ncp*I_ohfoQ$98`qe@Y0%cl0E&kf{~5Wn;i0`OAW zD_`x?0e;uw-f*%wSIRPbLcTzFAGuN_${c<1O5;bf@nePYW4V6OTM_+Uol+LfT%eRi zZ(g93>3{b`QFOySO0M3#xM-SxC{0_oqPbo_u(-XjXP)d3W7*#`Pb~Y-VDU|qSoS|O zpJ+_~!Lv;T9Pm3{^}k!Ke`?7!Ri}9|Z>-TLu8?c`6Lz9B-95VqEB~teTAAw}p0mw! zWUQC$M04~zt+itDZ=YC9bdZSR%ZP?DW-k64iNs$G5pBgR)X!O$=smO3qNg8I(og<< z{TFlfudU8gO#?6M-&}1g-H63hWOrP_64W&CvPuIFVEugZrPW8$^&y8jI~H-p&FRj` zi42<5_q=1PG%FJPacass6miARWjQC`$Z%q#`oZH9>(a}oBFfo|x2F$ZY*7Y>A~o@2 zYEAsnNOgQDqJQVV$~7|$Y@5iS(J3p9nu(5>6&jq#qsheYBASdvcE=~IScJRc6BS|; z{K4@I=jg@T*9}ia6tUi$8Z(`}czfpX#fWKeyoM%^MQY*`Dm@wF;*P7;@y8-n@gcP; ze(L?o=2*lvV)l|Ic%8#p)4Wbht&GRiUEqaAht*y2I)z3BPG_9XxWqXr!b=2q5I2`G zE@Pa-IEQfo;{wL(kl%H?;&tmdLkAb&V7!v?O2%s#uaOwMf?Q3fzJDNreszMrnM$tXy_2 z4WiLmCC5*Oqljy?EPKM!;#LoS)sx@g;v(l zz_!@?mCb^SM0X#OoMrbc+1s+RyWxZYtOoOLS{_1*{s<~XP8#mvuZtceH)X{@|hroW@JS-shAMggk zHoHyASFX0z_s#SB`xe=-p#U+)w9l;vlJVlq>5Ra12(CoPO>F+4yUXSY9ys6*fT=;w zS9)dEeT!^~OpwJ)*NoRdG+wIMP7Z7yH!0ovU0bb|c%FD*sFKJ|)cT;L4ye}5A+oQ4dyD6+~BIWhJR&ZaI;g$evwJw2-J3r7k3LU>UZ6sP)4#K{dyC8Bqt3|8+?_ zzgb4)BC-#a5v?Gy&n+WrCbAco$%^Ec5!Dg3W=raLx0I*}YuHj*;cqg1xRmHqME1K& z#S+8rFD3F4*>{!7e0G!~AB|eKiy!1@=8Q@?gAc4S!#AxmqZh3*qo=Jhqa#*=a*@5& zDl^<*C7Msvx>iz0sg-CMk-cZOY)IQ|qK!oMkrJlGMAvCV_GbJ*3kzj|?-ocpR6w)} zEhvyZkk9__{{rB7FYdeVS`I$sF6Zx|x?fk$()J0@})gp8IriJK6B7aQM&chtuV!)xZX$Y(msTqo zzs>l6X36j=#%CE@tKb#{G%zr!F|kQkC!>ZTb#k0jGtrtC&pi9T#98Tm^a4Fj5jduWL(Sm5aU0k%OShFhPl5x zxdIPygk@=RPQ1#@)nm--80+X9#8-$`@rSO0)1Tq=<6PkDjJKFLezvUeNe&;cVeaof z_Av88eIHk#nZHuMM2%IVcRAe4@#iwWhVc@{R>pmduQe*jlXL^)$7-1S%YcVUi5C7G z8Ke;zJi#prQH^q1v<&VZ#-+?1-f5c2?RgoG8%#E2AqvquMh~P(ytXb^c1bx$cr!=h zKQqqe@Tc_WchzVm=`z`a*l{4DH@TQrPBp=)=5nf=8Nb5u|B>V0&G8@P{PysY;#IEJ z5l;WljCrY|(e0eTUnnbZlp`2RjjK7_#_Ja}AMG~QGvIE3jfKh{j&H1K!0#daZeG?@ zaQ@I-6qEIBj$q@d`4ngH3P1fn;1;jtfq9DYi;Nd3vH)W>v?yJ?3{9L|47x(o_$Nvd zV?GzlZ#Bt-h?-3^@eBIrAFa8fG{yI~@|~M-c2&Rn2i5wC-TB%RDH%c|I7x0m&!!|@ zl@dQECH}0Gq9NEw&hP)s#8=Z?*#!ybODW*qlnR)P@aVCKV%3zCpZ1IU*f*w%U3EE-TyyVo_yJTtztH| zF7+JGYvz`ASGzwL-mahXv_*5~E0*ZZ^ORhDPS;aeE$yyr{lUGP-1~j{kGh`FA8=bA z_TVB7sSzoq)XJOxb*}7M` z=6&<^FU-DX_73Q&6A5ofY}*zPtyT0NKHFGm1XZx;qJFOam8xs1`d9)Yq9et8DU|40 zN|Zk>lz4ZkSX9u!N}~GonL-Ie6byD_H4&8?LWz@gzUQpkn0i+7{@4<7PR1ZA;4Mlp zlpD#MIow;-+)d`pn5U|FNEPCWmp?OW;N{~HMeH_;Jt6gzkVZZ@q|O$5L^1V7u_GzM zS~zU1M23xZjKo^X#cypW!hsPEjC72|A~JAjjKf+utfgZlHpXG`>y6#du4OXv#UAgsceq*?rM(pN_KoG!fD5fxI*nCu}I~JLTj;|#(@zIjI@tn zgI9KIr!2IE!&=%$Vrmuq61%a(s{Rk3nWMCb{}J(j4F65)PW`FRTw!XFBqGU}Ad0Hz z-ibMr~cGuYPHzd&JlKH242QKVoWWIqqZ^i=J@c~PHZN>J@L%Z^24)P&eO818RCrLNNL=1(fQ*A4jNqW zn>!vDRtw|#L`U*X&Pg(@{^^tIwm9O=Q8M4wh}s5^M+)OHwKR@dcMSX9>do;txI(es z&gK|#0iMq0ZZjZSkoH4Wdrx zI4dbRu{NKISmp3UZW6GzMIEGfOCT4(l7B!6b_MA{O) zb6hQmYea*w$n5y3-r3@@Ozj}F$}Aq++1BQm=f>v4imb#jb!&VmvMnBK(H9>swak_h zquv|!Er(08N{EV2VT?UD>cPV$v$In+frr$sNcgqGi#Ht0;X^nXFp&Zny-b94lMjj=u6PwQ@l{fA^RA?h7po+9J5(i@Q@g)Pc6qm?opU*ztx8s~Qc_1g z`)5}PX+x`7Qb)W}>~Y!$DrH6el`P)qt|Y83Te~E6?5HHH=UTT*>S(Hz0-5YeDL;9= zLRREeNjvYTkm3Fc*^urE!QQuaN$S|Z{%b45X|z_Sq>i~2q+xfP{hYB^y)q4gC>9V6`jbU9HqQR@jw9S^eqk#eFcqSpH) zb@Y^LG9!Pv&{}HkmekS82{x3A&BE5Tk~-?xAHutGqE?%vjx_d%XBi9c%7}#Q4h@0q zu9T?tRY@IKV#9w#D-*kttxrqpc!&cYEEB3ytw$tv^s#@qjHraDwMSCNt}^-5IGI8i zh^J_xRMHojo?!YQ(>|sRkoF;glj&ThW~Lun2OoyUJ4iK(t0_I{C%u z=S+%2FZs&-WsO932!8NV7?)HCfSUE^zVcKVULo;xqP6IZbookoHl1ko$i%b>K05cjsY@{h+SexUW}FD1;jTI?d3(}Fk?UC0OMO3uV*|Uu|{!tC`5;u z`?GO`2ROkbHs(!4qm2KJ@vj&UG0vVNo6ygA5#uXau5c~mUvmB(0&66=MHH}~BXn_u ze#Q>Q_c5N$_&DSL<^oSLeva{TjK9qIhm3=aUk3)KU&%Fmn zBV%LI-Uh4^_03~R%b%D5f0acNzh*qZv;GugtS8|>AQ5<)C+$TRVVvgO6YRSqJjPoe z-{x=#;Nf<2_z8_Yj&K2n`#wkbfHTlJgF85WwIM+$kSY2&+*o6*CL^j8CS-hx&k0ktkj& z?ItI{p*Q`gC0!q|%*qHu|2ue_{?aU~zT)vb{dDHM2Qu??>+z>fzI8mNOiK~I`1pYw zSCZhsqfb75G5Uu(8d7=;Ef`&#ZDM%3)D6vwtsi9G?jBPJ0<+*Kq2}*My zEhy<>@hZF_EqFKA&~7$DpnMFsAzKIwM);Y6z7ZVslOaxcHJ>OeAuL!>Um#W@0JpF&ZHG4rJ3d(a%k|Grz#^BMf(LcQVoB7N;| z?Yd)C*2%ViEHYJJw`RMo+w1P~hHU$ShXP%-HpqHBVjH+`vF?7_-EtlLZSxM4wMK1w6|-_iKexHmFl+Ft*z7%FmP6Sk z5H_LUMs)Xc8jf}o*^gL+lARsfSvA;IvPhLSD7l-79Da)!U$L!KKxBW{ zEI26pOJ=d=vOj2+=?Ba*{T*hh`qn3@W4l>umNl7$vY_2&7VM#2dnZGz3hiey#G=lA zIz#HZonU-lhEz>^CtYSdkuG)P-jvhr^$HD zX=3?nhdqNTqFHvRCz|w}XXa?lDp3(u*78(7Wi+jFp}ui#!2gKe#s5&Wo{jUMu_KDO9oNE2)0;nGy@ihi+z#{@gRxZ0O=a42Op4 zFFm|NJBzhl(i>b!iWq{oU9$~HPuK3w8hKF<=WETew({zV<5b|$N$O?lilvSE+?Tc&oWV<#rLk~lqH7K+tMxN48l}{>P-h6W1&%P&Xol|-R6eWlz<`E6(_Sb5ZiiF^H;I*#G zf_X&tRi%Q9wHI57=IOux{gSdPiTr0~3#Pd9r4q?h50ntC)E$4YS{CC8gRkEC2kXsH zOgK>_H75p&#BQjFEGeQlmpj#!jOw46xjCP3$5BviFgK0##fOB1h(*07|Go-`?LfE5*_HjCJu zajWGjB0m_WtMohLRtt1j@B&z-KNA13@@f6xWKHcsUMhbb8}vl9m+`k4=j-2^tkITX z0j>}|$ZG__g22`btMe@6RDa-9wTx>y9QIt0ei1KcGZ3y4f$4_3h2w)+hHGd1vc!e7 zixaeQf=#;nPcG$)`tyIF@NrKCCH#LVB|AAN6m2xLSGls{vRcViQR4DUnw_=`V3suw3UD;AkC_h`Oi47UN$r{tlD_z@jqN82?FPjh3=UIx}F{J4XU&Lcw)2 zu4G)rcp>8-a)HYke~~flfxxX`d?RBl8<2muz#7pB_6T!?LySMmcmd-tF*XD<#~JVD z3jHJFBE~N;et|3S6UGt76To1b?CkLej_^A!Fr9bdzs@*^@hyyJGp=D=m$Yk-7GA@6 zJ68zrayScPPa%sfzQYxOc^o)H@)Kb^hr_?bc!CRr*&Mis8J}kCX8bDS62@;cHsml< zFtY=9J=Z9M^$OnO0*tn#=39F%+v3 zO>i`*g&=$_D`@QF_+5-~#0BvUwNQnteGR9-i>rADW2|jZ?WGc5E6jqy<6(|a&k2V3 z>CEGHJm-a30x;bDGO44(RMf#9hP{ThR( z-cy9nJ5CH6A$Rhp=h-~LQ$ueO&StCv3*_pru7s!{vHDwZqC{*5(708~S1^7CPmMJ? z{!pWe=vh^1)<0ie9DUBNQnqGgUA+C&@I{pdr^ZbBRIpr&RK<_0Rq@9nmGQ^b z%J|pMSM)uhRtPou;qyED-cl`3S}foH%7QyHzlyC^v7v}lzPuZHs-jCc0p)a<~5by&xAJHJvtv9}`nwROr3`l7ttXzq2&)%wNUTzz%dEd8O! zi=wxGR>{?`&dZ99U8k&%7OhuG^f!OHNGc*+qBXXB<;tbaE0#4v3|z8wd6Q&Q_GGSI zx6LJw`RUcqUSH_sVKzQu&OGrEt4xv?V;o8gh$_TK%m{gb`|*QZy?l7J;cLi+NAl!1 z3}+0c<-+z2h0=6ItcVCIA<5q`Oc(sY51)P*%#bJBdTvmP^T#usljl_DBu6Gv$!j{b-vY;FP0XkMsrA&4Ph+C8^QS+1qR=vH2%kckhenAO z+<&^Ik17GAIlS$e+^mM3>*bY?{+qFg9e6s)2&l}FOQj0#13#3`WnCZb2nyIDC3 zeitx|P@0M!E!T|irp!p=EAO-9Y0`r`s z=FZag2~-X{0Nf}G=0~1WLroTnK-7vSis;rXfeR+GX!OF=loc5zYW}&S)0I5xT$wr_ zs(2_xZ>AHr9*}mju7F015titMYb>{XTxOZ6naRW=vuOT^Ql>@dEH*jLWzggsDosvg zIVbVR7>~*ZUeipd&dC~uR!(FHIw`1yMyG0MRBW0coz(DLc|jHPU}eG&-IgKuSrYlD z(?R$Z)^R52w(%P0=u|}i?K-Q5DxgC%rgh^I*}1jZq~dPR7yl4Qk?zCC7RGQEht8Bg1sg@QIY?W(kej<%}9N&!dBweaY=ZI5ykR zgFN#_&9#@0SHbbb^H^US~K`|$+NPVo?C$(J-#L`67Gzp6C( zTRdxOqH`ywqTf2HltlO4s1#~%6w#y@%sJAy&3FclPGn5?Xrdt*axlx#&?0C5aAY?Y z;Qjb*G2OilZyzx=@n+(MHnxy9@Bkar>_XA>jK5If%#rqj;F(U7dd~}GjutvQoHOSqHXFwdjBI&*eL?gNdhZSapeg(F8-m^^y!j%}9;l z$7I}bl?KsQB5gXS6;H0^ZM?6} zzam{bU)}epS{*-crO7wv)98$jo+A$LCI;51+{7H&(M8MR8S1?o%H$I_m8Yy6QkAnfi5*ib;^*cV#-~y;Pm}RQf&3bb@l%VuC+_FZ z_x;ZPq;h=a8w@>SoWj1}*>BFV+-uHp_L~(F-}pqWd9prbe9sX#oeGfg+f!54Q)4wF zF*Jl*_c+E#clJ-*OZ{)%>+IJD?k?5-LQTqJdEA1eicHkdB#wxqLK8vif9HN@KX8`C z+5cA1*$;+&Ld|{>lWRiF5~sGs>21r*)7uk4G^l2cXpu3F6Zbm%FVu*qrC)SAz8t)` zkO`_q{KM(8VsG6qTd@|_&O|~*PH)&HfC($uDZtzK!W?DLcGu}uqzpJ@Mpa^IWGoVl zjI@}#GoEHUpq_?@z&!$j~%b*n=xUqS}{Zk>aO^3ge3*Z zLYA?bkw#w4VD>E`nkSz2i9BT`6s%=U<)9lMNu#E7jaL~_1< zjM(np4@HN*OoEr^P$&fBAJB{N_Vsu@VI$n;(GG<|TZ9qe-lP z*W9=c)}t>QxM^ei61;V*2xci`av0wwAH}iw3tiLp; zrisNEMd0RFtxLXaTbSvnz4y-lrb*rKz{$qcn*hi{+f7-AOsob z2#_*Bx?nh1KLT!I57_1b_VWO)V{8mEk|Nv~U>LXnHm1|PjOB!CnN~tH=9D2tF=o{( zoWPhP*d#!PHkQ(SLm&M?jW*M=&rFl)f6)j~!uHQ)4Y4QL`boBUs1|2DUlYUo|W zPPWTFZI6#!F4$5PCQG|-5n0LD)0W*0TSBSU+YB9#Wz(sosdqKByh(rUr&pKEJb))e zDa#uMZKboD8dfe(mZV7I?0WUH)zRWXWl?P#>zG0~1ZQ9jGyY6^LDiDz_+G_aj3^MT zyoy&V;-=9+^qqr>y^?okU|9wWi|*krh4n zd1aNBMWccRg(xCP-ht&HmI(Wir^=JI(D_9{wKRhYY7+ zO7NB+&vTAWwU9K~qrx(fIvgGO7bRaCinzqdGJ|UpYe@N#6@06)7BM)ZMObgZstniK zU_If-YtEH|YodW|u;GJmAQrZQElQ_@W~Hprh!;~`H$%5iES$~h^d9&rR96-tMFri) zM>gUbxsc_YT$oPpy_H4KE?g<%-Dz%*MQTRg7oS9@XaEWp3*XPL$kK-1uW3G)MWaLS zyPAawnhY8p&yp)rm@0xvBQu$^F2GN*WL>;{%`i@e!JOq3R{yJ|O&#>>#A=o=t)`XY zH^fCxOmn~DJB>J8`8tI(DXvM9HOPb+MaTpLB?c%fX@FWVKxxAlRb_DKWKHw2mYNZm zZaQB?lW#Kj2}4jrCtc0QT6p-FPr7vY8s$pL7{65*i;U@R!tXa)XmFy4Mv>vU49Qrm zT1ZqZ1DvCRgA>e-WPV#{rTBd(6`3s+g%dYOf!3v6GP6gT zP)|cNg!L#-xQQE_E42$-FqoEw#+03l*$ItQDd7^mfr#b;N=)ksq$#69u!Ul_X3%8a zdo|6%ALG77*r_WPm?w&{lr+-fF}aZ8w0~p<@A1Sz&BgO3r+oQt*yAz}UsO$r4tw-` zb)R8}>v6UmJgj0nPd<6ENTskQ3|qCZCJYl?5V%gPc81{qlt+3FL?f1ak=cc%$Ve1&i^y<}b270`#*SLbNc^Y4%`xvNM)(smD>D8G zXZq+z*5vztMNKYzLN-59qZBy_R>-h;JjEufCYCry6Kvdyqvhrjezpbow8S|IHqPKj z1oyO>`o&x+l18>fw?JY9RpkttoWe7^8jO&X7oTCaaC{EJos){N@g^mG$q$Bj5-sTN zfceSf{ziZ>zLnJHx1&cyAtV^0q%VgQAz}hTuFPW*l<^Y-59W#roGU-F%RlwM?Q(9( zgdEU*vr;N5WVG4{H=YRNu&wZCnWb4NbBIL7Gm0_9mu5ja6x$xn!&XMGXAs%`a!xmGkb4Fq?+Smf)+3SX*FFm1@?0LVYSr}+MU)^^; zOG-fT5_}_z4>;r{Enl)|6w5g@Su9_$vcU2Meq#C3GCZY9>x^=3N^}PpQRNQ(uK6{V zyLrXBK^z`n5Eh)OlXr7>MYmp~l)@e_+*;U_TQJUiFqFi^Iyl8OF^}?4wBbdi)XW>a zUE)wemgEA#LgM@-EO@Cf+{=0du+0U3*w6x(S!WjPuN`UvP{@CMmh^`mqFF@ZFeTCp z&1>ifOGQ!pfGXp`qA=o}W`%wmH2WmGJCq6F|7W= zbuoUJy9Ksc5#MMy_FBPy)-z`S9X2p;MyIwgzJoh1#F#r)qZoU<$bE-$k%2K_P#gv} z9PE@PL1`S;xMNBhYF)c-#;sO@89NZX)$202F(Z1bS4-S;b;-q7Mx^a-c@vk6FcTS! zr{LC@(KOQirOUArVOQ}LUH)-l`g2Xmlb2YcA8 zTb|6){U^#1M zvI=D=igS5lH_*_qGBl}-Oz;6tE*J(e%=&BLD(%|gsWHh&Exc#LJ%7wm6vg;qGJd2P zKhljKSqtyk@I!|QQGe)2W1<=q34iEFQ&py%-ozQ244i&duBMvG_uR8V@v3Pi#rR<| zeyGNew2rFWj;g$ls{D?sf{v=fj;f-Ls+x`}TSt|RI;v_rs^)Z5&F!d~*HJZ(I;xgm zHA_iP&rlSmS(4T>t``N|6TenbG_>dscV?`it7a)_%4b#-n^YOu#F0&=jx@C+ZB|EG zMn{^tBQ3KdEvq9fhkL?e^p>UA@F|h$RZg#(7<0aA8e6%q-cvU3gn^c6tQl;k-xl3%XR>>t-5{P|1mb=c0E z;r@T)lzLXDdd$R^YwGkw!MV&CE+zAsjb=sRWS5#g6{qHxg0)nSOK@t2ABR&4_?Y=;TR^nIt;~)taVrHHj#z#jXTQ?L7c>|54QwUK#oDTkDEFl_aWW?tr$;vv<(^0* z+C-E)gzFlJa*w1DbTo4Z(!|M|T%70HNR*2+exR_ouz_u+t|!WcI{bC8t(qn*1ZlbX zX~Nz|F1BA_Oy^acy*yGBD9kpy!K&m(9_QJ3Jjhl@jU{ImTPZd03N}J&tUH%*IIOP~kv;aTpiwLpI)ldq?1Y&iE?EBaCr92;BD=~0#|ek7 z0>*)ExcfN6e_(7FeEAmRNv_b-jG+LG^pGXM{X66D3ak;m$sS`I!7%>&?~KJ&FD9ZN zGrqtFc>aU&U0gvNc87a}EASh}f9CxE$oM+$(J5dY&Jq@0Ohg&XKoxKXnT)5nK&ZCE zJm`W2LPP>8=K(`*QhieE`c(^aIO8g4O#__$? zjCXMb*E2@Xp+T@(40k7o<4hRbBb>j>#D~)!;8_W~DR9^(Mg|8N4{(A{GsdMk2*lrgrcfxls5n<^04z~gC-(7^aP#yCcS@PB1|3qMx)Ho$$2 zCwmdPp}(|PbcFm@$SbtIu>TV10y~vQ5~=J zqnu$W7x*4yNTlHYiQ`Xj{DZPQO<0nKv!I4JXTcE~8TT<>#uYFwNV=XgG_Duw;0EB0 z2M5&y3?r+Qu&;2GD`ecH`CZ1a*8%rK?lHrn zwJ`Xg62&GsyOq22A&%e4JrZLK z`5)3lCm8N)MvpSqXOSjbz#iY`F^n_*8>5RE!_u*+FylGg;%>%RM@M+oV&nsd`_B*#qYZHDjUiyH z!9I#8fNS(sZeb~BaFG){#Nn$rKJKU!j^o3A1KfXb{1}J-l;hWN_$Y@%@+`i8B^;rT z6X13MQ6Wz7eNJ$O!#~djV&MS?b2x~PQ}l4(<{m5M9)l@21O4(+YMDgb1%Js^-rYg(-e8}&Dtb*%kLLGY z=E8Sm_7S(LBj_^sVZ-~qgu#E1JT^CnZBnZs(NBrYa+thb=$W1x>|w< zdfY~QzPUc>;(By;YtZBN`@;S50(SVc;41G>lE-x+pEuCuPx486o1T7m}-1OwB>CdZxj-PFE$dt1mC@c4S%{%P;a-X4z<*Ys#T zehl2LK1>W>U_XzH?6VtqN^uVc`cp^X@&k8Chp+4Pgo3wWV){HBx;5OfIT-eNG{$Wq z->vSj*C?^g8}bFaWJaRT#cLrc<94s-Pzb7%VN7k@#d!I;Y;0>cg4(;?jmws=^K|vP zW!&~|_foC7X{JwOV~WSJhQ^sO8j|3)q`VrJElxeM*wuvWD`7TC z&o3?2+iKICZx+$yukvW}zm`z{uQS9+xycJloc$kb$6~Bzq#nop_RK5M#%e|uKq*V* zy9HHgZ}Kf1ePUw_LTkl1hoidUI2-nsD#Gt2#d7aCt8?;=BIo3Jn2;n&>}MLPQP6b3 zF)neOi%&$N4mdLgaU(Rr`cn_J{U;l0(BG*o(|_a4d*;m>ly9lg9J^8xeRs2BiQctU zc{SSEq~tyG*f!-prTK7D4aL=-S@OnB=(s|e=ht&+5L#kr0TnnWp;w6mRbReQDOn=5 zJtsNty{rI;En9KKF_*Oz4Fj1`=XPao^n>k6iGE=sJ34u@QWy2@Qmoe+_lm~U>bUWH zIO2*g$dS#DMXKVbJXL+Dgt?a0pE79DoFfnY9yaOKhpIK~0LMI4eK-In4x@Og!0{Fz zW`CT#Gb=IStL!*krY*#4eL>h~tK04o)AjHTK(6?|VfBFWx@A z*DjxRqBOdOod<_z-B);mGjNjxQ`7ukh zjQ8n&uw@F7(SHya0~g*SFZovXpLU?gZwM_((r_PK1JQgrRdimt5zDK!$V4qUiWBz z)aF;pGkf;Adc7WSDf*VYs_4eGN>21WzhYfwc)LPgcbCf@c7?otci4BU*Cp>}CD(M) zL>zZlSIFDj8(n=ssns9MnR7*NI3!r9q`1C-FYMYE3LbC?+nW0G|1*0zIIf<4spgav zbzjKqC1%H52i(24c)OB|jeaqxlxouzJrr>5?GJl<+~Ke{lqqXDr5Fd|^T3l3Y5 z_?|=Rqb5$Y*std5SeN zp{Y5H{Ml55IgQmmg%a!7BO~U1UmU91cy*4?;j4++s=!2zb97=3tMBs3WL)H}k6%5n z4kjk@gr%0zH!^7QdE`yX9DX7AGK-=B${?oF*5POn6@qICBv}$_I`i^Zofb1A>%<0cyF7&fsUqsxKT`Zn@(}A97L7#F(MnnD5W%Uis&xGz#KCd(w>WsqSKDmab=BAa6HrulL z2Aj<$gB$AWmp3)pYz@mAo1)wM*vK9B#^DV6Ky8Ztg_l+v+rNg5J6N(R(0}n#Q-LvX z+yfJ)=+6%-tIJZnv7Lk``h+^I!YGWI;nw>!5?3xHt1v=Ti9ckMp`RUI8U21p$--kV zR%8}lY%2pVixs4e-oqvFIK7X@9?RR9ht6UdJcQQ+R&f?Ad0p}2k=-JWaod@3{krkG zzzR;pQ+LN}NiMc9zY+e)@hs=$vEy|1RHQ2Y=t(*YHAxs6In`1%a(;{krXuxW9a_pTbB4D#%$)6#1Jb%fQU`QQu^hwW2NQdCuyZ)7i@5-8g*Q?j zMckKwJvyjYz`e#8r)%Ma+BB3w82>mWzEF!+iJ-3m7n$+ss^Akh{A5wa8mja3CfA(iFTe1^+_|-aHfQ&m1f0xNfE&k?Y!xTkxQhYfby+2G@RX*cIIS zDX%A-I4~>xd)%R3udC}2#Ju~0J>Gy!*y{=$^8593k6qEY@3xRH>?PMek3ZNeUo7Gl zO7UWuIcZ#7Ufek!y=$FPtUvOj%o&!Aqk9x(o}T}+qG_=}>B-vJce0i96V|b`q>yLM z_9&l~LC$9JbBrZS$Y$&9%l6B(Y zF42omzI{|(wzM(2=&-WA06JiB#%JMOVc5O|_Zt}A_=%lWRhW%4LYOP0RcXTZDS96c z?;1F4T4AuDU6++#k$vM86J6zn}Ig~ u!;CsNaUqYRQ8>!MI2y$pxBM6mmjxmG9VJ?RL}|;BJ3Y)=MDIVMl>J}Xcy@>Y diff --git a/RootHelper/external/include/choma/CSBlob.h b/RootHelper/external/include/choma/CSBlob.h index f779929..0eee4d1 100644 --- a/RootHelper/external/include/choma/CSBlob.h +++ b/RootHelper/external/include/choma/CSBlob.h @@ -31,7 +31,7 @@ typedef struct __GenericBlob { } CS_GenericBlob; // CMS blob magic types -enum { +typedef enum { CSMAGIC_REQUIREMENT = 0xfade0c00, CSMAGIC_REQUIREMENTS = 0xfade0c01, CSMAGIC_CODEDIRECTORY = 0xfade0c02, @@ -44,7 +44,7 @@ enum { CSMAGIC_EMBEDDED_LAUNCH_CONSTRAINT = 0xfade8181, } CS_BlobMagic; -enum { +typedef enum { CSSLOT_CODEDIRECTORY = 0, CSSLOT_INFOSLOT = 1, CSSLOT_REQUIREMENTS = 2, @@ -90,8 +90,6 @@ CS_SuperBlob *macho_read_code_signature(MachO *macho); int macho_replace_code_signature(MachO *macho, CS_SuperBlob *superblob); -int update_load_commands(MachO *macho, CS_SuperBlob *superblob, uint64_t originalSize); - CS_DecodedBlob *csd_blob_init(uint32_t type, CS_GenericBlob *blobData); int csd_blob_read(CS_DecodedBlob *blob, uint64_t offset, size_t size, void *outBuf); int csd_blob_write(CS_DecodedBlob *blob, uint64_t offset, size_t size, const void *inBuf); @@ -104,6 +102,7 @@ uint32_t csd_blob_get_type(CS_DecodedBlob *blob); void csd_blob_set_type(CS_DecodedBlob *blob, uint32_t type); void csd_blob_free(CS_DecodedBlob *blob); +CS_DecodedSuperBlob *csd_superblob_init(void); CS_DecodedSuperBlob *csd_superblob_decode(CS_SuperBlob *superblob); CS_SuperBlob *csd_superblob_encode(CS_DecodedSuperBlob *decodedSuperblob); CS_DecodedBlob *csd_superblob_find_blob(CS_DecodedSuperBlob *superblob, uint32_t type, uint32_t *indexOut); diff --git a/RootHelper/external/include/choma/CodeDirectory.h b/RootHelper/external/include/choma/CodeDirectory.h index 66eb553..36cca20 100644 --- a/RootHelper/external/include/choma/CodeDirectory.h +++ b/RootHelper/external/include/choma/CodeDirectory.h @@ -12,7 +12,6 @@ #include "MachOLoadCommand.h" #include "MemoryStream.h" - // Code directory blob header typedef struct __CodeDirectory { uint32_t magic; @@ -26,12 +25,15 @@ typedef struct __CodeDirectory { uint32_t codeLimit; uint8_t hashSize; uint8_t hashType; - uint8_t spare1; + uint8_t platform; uint8_t pageSize; uint32_t spare2; + + /* Version 0x20100 */ uint32_t scatterOffset; uint32_t teamOffset; -} CS_CodeDirectory; +} CS_CodeDirectory +__attribute__ ((aligned(1))); enum CS_HashType { CS_HASHTYPE_SHA160_160 = 1, @@ -40,7 +42,7 @@ enum CS_HashType { CS_HASHTYPE_SHA384_384 = 4, }; -char *csd_code_directory_copy_identity(CS_DecodedBlob *codeDirBlob, uint32_t *offsetOut); +char *csd_code_directory_copy_identifier(CS_DecodedBlob *codeDirBlob, uint32_t *offsetOut); char *csd_code_directory_copy_team_id(CS_DecodedBlob *codeDirBlob, uint32_t *offsetOut); int csd_code_directory_set_team_id(CS_DecodedBlob *codeDirBlob, char *newTeamID); uint32_t csd_code_directory_get_flags(CS_DecodedBlob *codeDirBlob); diff --git a/RootHelper/external/include/choma/MachOByteOrder.h b/RootHelper/external/include/choma/MachOByteOrder.h index f1b0a7b..510df98 100644 --- a/RootHelper/external/include/choma/MachOByteOrder.h +++ b/RootHelper/external/include/choma/MachOByteOrder.h @@ -131,7 +131,7 @@ applier(cd, codeLimit); \ applier(cd, hashSize); \ applier(cd, hashType); \ - applier(cd, spare1); \ + applier(cd, platform); \ applier(cd, pageSize); \ applier(cd, spare2); \ applier(cd, scatterOffset); \ diff --git a/RootHelper/external/include/choma/MachOLoadCommand.h b/RootHelper/external/include/choma/MachOLoadCommand.h index d07ccbd..ae5514a 100644 --- a/RootHelper/external/include/choma/MachOLoadCommand.h +++ b/RootHelper/external/include/choma/MachOLoadCommand.h @@ -3,9 +3,9 @@ #include #include "MachO.h" -#include "CSBlob.h" #include "FileStream.h" #include "MachOByteOrder.h" +#include "CSBlob.h" // Convert load command to load command name char *load_command_to_string(int loadCommand); diff --git a/RootHelper/external/include/choma/MemoryStream.h b/RootHelper/external/include/choma/MemoryStream.h index b6326fb..ba00102 100644 --- a/RootHelper/external/include/choma/MemoryStream.h +++ b/RootHelper/external/include/choma/MemoryStream.h @@ -55,6 +55,6 @@ int memory_stream_expand(MemoryStream *stream, size_t expandAtStart, size_t expa void memory_stream_free(MemoryStream *stream); int memory_stream_copy_data(MemoryStream *originStream, uint64_t originOffset, MemoryStream *targetStream, uint64_t targetOffset, size_t size); -int memory_stream_find_memory(MemoryStream *stream, uint64_t searchOffset, size_t searchSize, void *bytes, void *mask, size_t nbytes, uint16_t alignment, uint64_t *foundOffsetOut); +int memory_stream_find_memory(MemoryStream *stream, uint64_t searchStartOffset, uint64_t searchEndOffset, void *bytes, void *mask, size_t nbytes, uint16_t alignment, uint64_t *foundOffsetOut); #endif // MEMORY_STREAM_H \ No newline at end of file diff --git a/RootHelper/external/include/choma/PatchFinder.h b/RootHelper/external/include/choma/PatchFinder.h index d15b0f4..84cc117 100644 --- a/RootHelper/external/include/choma/PatchFinder.h +++ b/RootHelper/external/include/choma/PatchFinder.h @@ -1,11 +1,16 @@ +#ifndef PATCHFINDER_H +#define PATCHFINDER_H + #include #include "MachO.h" -#define METRIC_TYPE_PATTERN 1 -#define METRIC_TYPE_STRING_XREF 2 -#define METRIC_TYPE_FUNCTION_XREF 3 +enum { + PF_METRIC_TYPE_PATTERN, + PF_METRIC_TYPE_STRING, + PF_METRIC_TYPE_XREF, +}; -typedef struct PFSection { +typedef struct s_PFSection { MachO *macho; uint64_t fileoff; uint64_t vmaddr; @@ -14,34 +19,57 @@ typedef struct PFSection { bool ownsCache; } PFSection; -PFSection *pf_section_init_from_macho(MachO *macho, const char *filesetEntryId, const char *segName, const char *sectName); -int pf_section_read_at_relative_offset(PFSection *section, uint64_t rel, size_t size, void *outBuf); -int pf_section_read_at_address(PFSection *section, uint64_t vmaddr, void *outBuf, size_t size); -uint32_t pf_section_read32(PFSection *section, uint64_t vmaddr); -int pf_section_set_cached(PFSection *section, bool cached); -void pf_section_free(PFSection *section); +PFSection *pfsec_init_from_macho(MachO *macho, const char *filesetEntryId, const char *segName, const char *sectName); +int pfsec_read_reloff(PFSection *section, uint64_t rel, size_t size, void *outBuf); +uint32_t pfsec_read32_reloff(PFSection *section, uint64_t rel); +int pfsec_read_at_address(PFSection *section, uint64_t vmaddr, void *outBuf, size_t size); +uint32_t pfsec_read32(PFSection *section, uint64_t vmaddr); +uint64_t pfsec_read64(PFSection *section, uint64_t vmaddr); +int pfsec_read_string(PFSection *section, uint64_t vmaddr, char **outString); +int pfsec_set_cached(PFSection *section, bool cached); +uint64_t pfsec_find_prev_inst(PFSection *section, uint64_t startAddr, uint32_t searchCount, uint32_t inst, uint32_t mask); +uint64_t pfsec_find_next_inst(PFSection *section, uint64_t startAddr, uint32_t searchCount, uint32_t inst, uint32_t mask); +uint64_t pfsec_find_function_start(PFSection *section, uint64_t midAddr); +void pfsec_free(PFSection *section); -typedef struct MetricShared { +typedef struct s_MetricShared { uint32_t type; } MetricShared; - -typedef enum { - BYTE_PATTERN_ALIGN_8_BIT, - BYTE_PATTERN_ALIGN_16_BIT, - BYTE_PATTERN_ALIGN_32_BIT, - BYTE_PATTERN_ALIGN_64_BIT, -} BytePatternAlignment; - -typedef struct BytePatternMetric { +typedef struct s_PFPatternMetric { MetricShared shared; void *bytes; void *mask; size_t nbytes; - BytePatternAlignment alignment; -} BytePatternMetric; + uint16_t alignment; +} PFPatternMetric; -BytePatternMetric *pf_create_byte_pattern_metric(void *bytes, void *mask, size_t nbytes, BytePatternAlignment alignment); -void pf_section_run_metric(PFSection *section, void *metric, void (^matchBlock)(uint64_t vmaddr, bool *stop)); +typedef struct s_PFStringMetric { + MetricShared shared; + + char *string; +} PFStringMetric; + +typedef enum { + XREF_TYPE_MASK_CALL = (1 << 0), + XREF_TYPE_MASK_REFERENCE = (1 << 1), + XREF_TYPE_MASK_ALL = (XREF_TYPE_MASK_CALL | XREF_TYPE_MASK_REFERENCE), +} PFXrefTypeMask; + +typedef struct s_PFXrefMetric { + MetricShared shared; + + uint64_t address; + PFXrefTypeMask typeMask; +} PFXrefMetric; + +PFPatternMetric *pfmetric_pattern_init(void *bytes, void *mask, size_t nbytes, uint16_t alignment); +PFStringMetric *pfmetric_string_init(const char *string); +PFXrefMetric *pfmetric_xref_init(uint64_t address, PFXrefTypeMask types); +void pfmetric_free(void *metric); + +void pfmetric_run_in_range(PFSection *section, uint64_t startAddr, uint64_t endAddr, void *metric, void (^matchBlock)(uint64_t vmaddr, bool *stop)); +void pfmetric_run(PFSection *section, void *metric, void (^matchBlock)(uint64_t vmaddr, bool *stop)); +#endif \ No newline at end of file diff --git a/RootHelper/external/include/choma/PatchFinder_arm64.h b/RootHelper/external/include/choma/PatchFinder_arm64.h new file mode 100644 index 0000000..c487bd6 --- /dev/null +++ b/RootHelper/external/include/choma/PatchFinder_arm64.h @@ -0,0 +1,33 @@ +#ifndef PATCHFINDER_ARM64_H +#define PATCHFINDER_ARM64_H + +#include "PatchFinder.h" + +typedef enum { + ARM64_XREF_TYPE_B = 0, + ARM64_XREF_TYPE_BL = 1, + ARM64_XREF_TYPE_ADR = 2, + ARM64_XREF_TYPE_ADRP_ADD = 3, + ARM64_XREF_TYPE_ADRP_LDR = 4, + ARM64_XREF_TYPE_ADRP_STR = 5, +} Arm64XrefType; + +typedef enum { + ARM64_XREF_TYPE_MASK_B = (1 << ARM64_XREF_TYPE_B), + ARM64_XREF_TYPE_MASK_BL = (1 << ARM64_XREF_TYPE_BL), + ARM64_XREF_TYPE_MASK_CALL = (ARM64_XREF_TYPE_MASK_B | ARM64_XREF_TYPE_MASK_BL), + + ARM64_XREF_TYPE_MASK_ADR = (1 << ARM64_XREF_TYPE_ADR), + ARM64_XREF_TYPE_MASK_ADRP_ADD = (1 << ARM64_XREF_TYPE_ADRP_ADD), + ARM64_XREF_TYPE_MASK_ADRP_LDR = (1 << ARM64_XREF_TYPE_ADRP_LDR), + ARM64_XREF_TYPE_MASK_ADRP_STR = (1 << ARM64_XREF_TYPE_ADRP_STR), + ARM64_XREF_TYPE_MASK_REFERENCE = (ARM64_XREF_TYPE_MASK_ADR | ARM64_XREF_TYPE_MASK_ADRP_ADD | ARM64_XREF_TYPE_MASK_ADRP_LDR | ARM64_XREF_TYPE_MASK_ADRP_STR), + + ARM64_XREF_TYPE_ALL = (ARM64_XREF_TYPE_MASK_CALL | ARM64_XREF_TYPE_MASK_REFERENCE), +} Arm64XrefTypeMask; + +uint64_t pfsec_arm64_resolve_adrp_ldr_str_add_reference(PFSection *section, uint64_t adrpAddr, uint64_t ldrStrAddAddr); +uint64_t pfsec_arm64_resolve_adrp_ldr_str_add_reference_auto(PFSection *section, uint64_t ldrStrAddAddr); +uint64_t pfsec_arm64_resolve_stub(PFSection *section, uint64_t stubAddr); +void pfsec_arm64_enumerate_xrefs(PFSection *section, Arm64XrefTypeMask types, void (^xrefBlock)(Arm64XrefType type, uint64_t source, uint64_t target, bool *stop)); +#endif \ No newline at end of file diff --git a/RootHelper/external/include/choma/SignOSSL.h b/RootHelper/external/include/choma/SignOSSL.h index 00afe5f..f1be620 100644 --- a/RootHelper/external/include/choma/SignOSSL.h +++ b/RootHelper/external/include/choma/SignOSSL.h @@ -1,6 +1,8 @@ #ifndef SIGN_OSSL_H #define SIGN_OSSL_H +#ifndef DISABLE_SIGNING + #include #include #include @@ -11,6 +13,8 @@ unsigned char *signWithRSA(unsigned char *inputData, size_t inputDataLength, unsigned char *key, size_t key_len, size_t *outputDataLength); +#endif + #endif // SIGN_OSSL_H // 0xA422 \ No newline at end of file diff --git a/RootHelper/external/include/choma/Util.h b/RootHelper/external/include/choma/Util.h index 4bbda41..e4ccf64 100644 --- a/RootHelper/external/include/choma/Util.h +++ b/RootHelper/external/include/choma/Util.h @@ -1,7 +1,34 @@ +#ifndef UTIL_H +#define UTIL_H + #include #include +#include +typedef struct s_optional_uint64 { + bool isSet; + uint64_t value; +} optional_uint64_t; +#define OPT_UINT64_IS_SET(x) (x.isSet) +#define OPT_UINT64_GET_VAL(x) (x.value) +#define OPT_UINT64_NONE (optional_uint64_t){.isSet = false, .value = 0} +#define OPT_UINT64(x) (optional_uint64_t){.isSet = true, .value = x} + + +typedef struct s_optional_bool { + bool isSet; + bool value; +} optional_bool; +#define OPT_BOOL_IS_SET(x) (x.isSet) +#define OPT_BOOL_GET_VAL(x) (x.value) +#define OPT_BOOL_NONE (optional_bool){.isSet = false, .value = false} +#define OPT_BOOL(x) (optional_bool){.isSet = true, .value = x} + +int64_t sxt64(int64_t value, uint8_t bits); int memcmp_masked(const void *str1, const void *str2, unsigned char* mask, size_t n); uint64_t align_to_size(int size, int alignment); int count_digits(int64_t num); -void print_hash(uint8_t *hash, size_t size); \ No newline at end of file +void print_hash(uint8_t *hash, size_t size); +void enumerate_range(uint64_t start, uint64_t end, uint16_t alignment, size_t nbytes, bool (^enumerator)(uint64_t cur)); + +#endif \ No newline at end of file diff --git a/RootHelper/external/include/choma/arm64.h b/RootHelper/external/include/choma/arm64.h new file mode 100644 index 0000000..9affc1d --- /dev/null +++ b/RootHelper/external/include/choma/arm64.h @@ -0,0 +1,94 @@ +#ifndef ARM64_H +#define ARM64_H + +#include "Util.h" + +typedef enum { + // registers + ARM64_REG_TYPE_X, + ARM64_REG_TYPE_W, + + // vector shit + ARM64_REG_TYPE_Q, + ARM64_REG_TYPE_D, + ARM64_REG_TYPE_S, + ARM64_REG_TYPE_H, + ARM64_REG_TYPE_B, +} arm64_register_type; + +enum { + ARM64_REG_MASK_ANY_FLAG = (1 << 0), + ARM64_REG_MASK_X_W = (1 << 1), + ARM64_REG_MASK_VECTOR = (1 << 2), + ARM64_REG_MASK_ALL = (ARM64_REG_MASK_X_W | ARM64_REG_MASK_VECTOR), + + ARM64_REG_MASK_ANY_X_W = (ARM64_REG_MASK_X_W | ARM64_REG_MASK_ANY_FLAG), + ARM64_REG_MASK_ANY_VECTOR = (ARM64_REG_MASK_VECTOR | ARM64_REG_MASK_ANY_FLAG), + ARM64_REG_MASK_ANY_ALL = (ARM64_REG_MASK_ALL | ARM64_REG_MASK_ANY_FLAG), +}; + +typedef enum { + LDR_STR_TYPE_ANY, // NOTE: "ANY" will inevitably also match STUR and LDUR instructions + LDR_STR_TYPE_POST_INDEX, + LDR_STR_TYPE_PRE_INDEX, + LDR_STR_TYPE_UNSIGNED, +} arm64_ldr_str_type; + +typedef struct s_arm64_register { + uint8_t mask; + arm64_register_type type; + uint8_t num; +} arm64_register; + +#define ARM64_REG(type_, num_) (arm64_register){.mask = ARM64_REG_MASK_ALL, .type = type_, .num = num_} +#define ARM64_REG_X(x) ARM64_REG(ARM64_REG_TYPE_X, x) +#define ARM64_REG_W(x) ARM64_REG(ARM64_REG_TYPE_W, x) +#define ARM64_REG_Q(x) ARM64_REG(ARM64_REG_TYPE_Q, x) +#define ARM64_REG_S(x) ARM64_REG(ARM64_REG_TYPE_S, x) +#define ARM64_REG_H(x) ARM64_REG(ARM64_REG_TYPE_H, x) +#define ARM64_REG_B(x) ARM64_REG(ARM64_REG_TYPE_B, x) +#define ARM64_REG_ANY (arm64_register){.mask = ARM64_REG_MASK_ANY_ALL, .type = 0, .num = 0} +#define ARM64_REG_ANY_X_W (arm64_register){.mask = ARM64_REG_MASK_ANY_X_W, .type = 0, .num = 0} +#define ARM64_REG_ANY_VECTOR (arm64_register){.mask = ARM64_REG_MASK_ANY_VECTOR, .type = 0, .num = 0} +#define ARM64_REG_GET_TYPE(x) (x.type) +#define ARM64_REG_IS_X(x) (x.type == ARM64_REG_TYPE_X) +#define ARM64_REG_IS_W(x) (x.type == ARM64_REG_TYPE_W) +#define ARM64_REG_IS_VECTOR(x) (x.type == ARM64_REG_TYPE_Q || x.type == ARM64_REG_TYPE_D || x.type == ARM64_REG_TYPE_S || x.type == ARM64_REG_TYPE_H || x.type == ARM64_REG_TYPE_B) +#define ARM64_REG_GET_NUM(x) (x.num & 0x1f) +#define ARM64_REG_IS_ANY(x) (x.mask == ARM64_REG_MASK_ANY_ALL) +#define ARM64_REG_IS_ANY_X_W(x) (x.mask == ARM64_REG_MASK_ANY_X_W) +#define ARM64_REG_IS_ANY_VECTOR(x) (x.mask == ARM64_REG_MASK_ANY_VECTOR) +uint8_t arm64_reg_type_get_width(arm64_register_type type); +const char *arm64_reg_type_get_string(arm64_register_type type); +const char *arm64_reg_get_type_string(arm64_register reg); + +#define ARM64_REG_NUM_SP 31 + +typedef struct s_arm64_cond { + bool isSet; + uint8_t value; +} arm64_cond; +#define ARM64_COND(x) (arm64_cond){.isSet = true, .value = x} +#define ARM64_COND_ANY (arm64_cond){.isSet = false, .value = 0} +#define ARM64_COND_GET_VAL(x) (x.value & 0xf) +#define ARM64_COND_IS_SET(x) x.isSet + +int arm64_gen_b_l(optional_bool optIsBl, optional_uint64_t optOrigin, optional_uint64_t optTarget, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_b_l(uint32_t inst, uint64_t origin, uint64_t *targetOut, bool *isBlOut); +int arm64_gen_b_c_cond(optional_bool optIsBc, optional_uint64_t optOrigin, optional_uint64_t optTarget, arm64_cond optCond, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_b_c_cond(uint32_t inst, uint64_t origin, uint64_t *targetOut, arm64_cond *condOut, bool *isBcOut); +int arm64_gen_adr_p(optional_bool optIsAdrp, optional_uint64_t optOrigin, optional_uint64_t optTarget, arm64_register reg, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_adr_p(uint32_t inst, uint64_t origin, uint64_t *targetOut, arm64_register *registerOut, bool *isAdrpOut); +int arm64_gen_mov_imm(char type, arm64_register destinationReg, optional_uint64_t optImm, optional_uint64_t optShift, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_mov_imm(uint32_t inst, arm64_register *destinationRegOut, uint64_t *immOut, uint64_t *shiftOut, char *typeOut); +int arm64_gen_add_imm(arm64_register destinationReg, arm64_register sourceReg, optional_uint64_t optImm, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_add_imm(uint32_t inst, arm64_register *destinationRegOut, arm64_register *sourceRegOut, uint16_t *immOut); +int arm64_gen_ldr_imm(char type, arm64_ldr_str_type instType, arm64_register destinationReg, arm64_register addrReg, optional_uint64_t optImm, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_ldr_imm(uint32_t inst, arm64_register *destinationReg, arm64_register *addrReg, uint64_t *immOut, char *typeOut, arm64_ldr_str_type *instTypeOut); +int arm64_gen_str_imm(char type, arm64_ldr_str_type instType, arm64_register sourceReg, arm64_register addrReg, optional_uint64_t optImm, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_str_imm(uint32_t inst, arm64_register *sourceRegOut, arm64_register *addrRegOut, uint64_t *immOut, char *typeOut, arm64_ldr_str_type *instTypeOut); +int arm64_gen_ldr_lit(arm64_register destinationReg, optional_uint64_t optImm, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_ldr_lit(uint32_t inst, arm64_register *destinationReg, int64_t *immOut); +int arm64_gen_cb_n_z(optional_bool isCbnz, arm64_register reg, optional_uint64_t optTarget, uint32_t *bytesOut, uint32_t *maskOut); +int arm64_dec_cb_n_z(uint32_t inst, uint64_t origin, bool *isCbnzOut, arm64_register *regOut, uint64_t *targetOut); +#endif \ No newline at end of file diff --git a/RootHelper/external/lib/libchoma.a b/RootHelper/external/lib/libchoma.a index 99c1d461119d6cf0b05643c5030be04aed43b52d..4ec7fc8dadc586eb7c81bb6ad2974c8298f6fd35 100644 GIT binary patch delta 41413 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 d?uYNvRl+~_627fX