From a60dbea3195b6a98f0909218a144e33e41a6edc6 Mon Sep 17 00:00:00 2001 From: Koen Van Bastelaere Date: Sun, 5 May 2024 21:04:32 +0200 Subject: [PATCH 1/2] Added c string functions --- xzre.h | 36 ++++++++++++++++++++++++++++++++++++ xzre.lds.in | 6 +++--- xzre_code/c_memmove.c | 26 ++++++++++++++++++++++++++ xzre_code/c_strlen.c | 15 +++++++++++++++ xzre_code/c_strnlen.c | 16 ++++++++++++++++ 5 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 xzre_code/c_memmove.c create mode 100644 xzre_code/c_strlen.c create mode 100644 xzre_code/c_strnlen.c diff --git a/xzre.h b/xzre.h index 3634122..c0db0dc 100644 --- a/xzre.h +++ b/xzre.h @@ -3833,6 +3833,42 @@ extern BOOL sshd_find_sensitive_data( imported_funcs_t *funcs, global_context_t *ctx); + +/** + * @brief returns length of c string + * + * @param str pointer to c string + * @return ssize_t length of c string + */ +extern ssize_t c_strlen( + char *str +); + +/** + * @brief returns length of c string with a maximum length + * + * @param str pointer to c string + * @param max_len maximum length of c string + * @return ssize_t length of c string + */ +extern ssize_t c_strnlen( + char *str, + size_t max_len +); + +/** + * @brief copies memory + * + * @param dest destination buffer + * @param src source buffer + * @param cnt number of bytes to copy + */ +extern void c_memmove( + char *dest, + char *src, + size_t cnt +); + /** * @brief counts the number of times the IFUNC resolver is called * diff --git a/xzre.lds.in b/xzre.lds.in index d0058ab..d7efc8b 100644 --- a/xzre.lds.in +++ b/xzre.lds.in @@ -43,7 +43,7 @@ SECTIONS_BEGIN() /* 0000000000001870 */ DEFSYM(elf_symbol_get, .text.crc_inia) DEFSYM_START(.text.crc64_generia) /* 0000000000001AF0 */ DEFSYM2(elf_symbol_get_addr, 0) - /* 0000000000001B20 */ DEFSYM2(c_memmove, 0x1B20 - 0x1AF0) // FIXME: prototype + /* 0000000000001B20 */ DEFSYM2(c_memmove, 0x1B20 - 0x1AF0) DEFSYM_END(.text.crc64_generia) /* 0000000000001B70 */ DEFSYM(fake_lzma_alloc, .text.init_pric_tabla) /* 0000000000001B80 */ DEFSYM(elf_find_rela_reloc, .text.stream_encoder_updata) // FIXME: prototype @@ -106,8 +106,8 @@ SECTIONS_BEGIN() /* 0000000000005820 */ DEFSYM(backdoor_setup, .text.microlzma_encoder_inia) /* 0000000000006F20 */ DEFSYM(backdoor_init_stage2, .text.lzma_validate_chaia) DEFSYM_START(.text.parse_optiona) - /* 0000000000007020 */ DEFSYM2(c_strlen, 0) // FIXME: prototype - /* 0000000000007040 */ DEFSYM2(c_strnlen, 0x7040 - 0x7020) // FIXME: prototype + /* 0000000000007020 */ DEFSYM2(c_strlen, 0) + /* 0000000000007040 */ DEFSYM2(c_strnlen, 0x7040 - 0x7020) DEFSYM_END(.text.parse_optiona) /* 0000000000007070 */ DEFSYM(fd_read, .text.auto_decoder_inia) DEFSYM_START(.text.bt_find_funa) diff --git a/xzre_code/c_memmove.c b/xzre_code/c_memmove.c new file mode 100644 index 0000000..fc45199 --- /dev/null +++ b/xzre_code/c_memmove.c @@ -0,0 +1,26 @@ +/** + * Copyright (C) 2024 Koen Van Bastelaere + **/ +#include "xzre.h" + +void c_memmove(char *dest, char *src, size_t cnt) { + if ((src < dest) && (dest < (src + cnt))) { + size_t curr = cnt - 1; + if (cnt != 0) { + do { + *(dest + curr) = *(src + curr); + --curr; + } while (curr != -1); + return; + } + } else { + if (cnt == 0) + return; + size_t curr = 0; + do { + *(dest + curr) = *(src + curr); + ++curr; + } while (cnt != curr); + } + return; +} diff --git a/xzre_code/c_strlen.c b/xzre_code/c_strlen.c new file mode 100644 index 0000000..5a2dc3b --- /dev/null +++ b/xzre_code/c_strlen.c @@ -0,0 +1,15 @@ +/** + * Copyright (C) 2024 Koen Van Bastelaere + **/ +#include "xzre.h" + +ssize_t c_strlen(char *str) { + if (*str != '\0') { + ssize_t len = 0; + do { + ++len; + } while (*(str + len) != '\0'); + return len; + } + return 0; +} diff --git a/xzre_code/c_strnlen.c b/xzre_code/c_strnlen.c new file mode 100644 index 0000000..94bd34a --- /dev/null +++ b/xzre_code/c_strnlen.c @@ -0,0 +1,16 @@ +/** + * Copyright (C) 2024 Koen Van Bastelaere + **/ +#include "xzre.h" + +ssize_t c_strnlen(char *str, size_t max_len) { + ssize_t len = 0; + if (max_len == 0) + return max_len; + do { + if (*(str + len) == '\0') + return len; + ++len; + } while (max_len != len); + return max_len; +} From c10da935918b1bcdaa504fd6e9479e249dd59fe5 Mon Sep 17 00:00:00 2001 From: koenatdatix Date: Mon, 6 May 2024 13:37:49 +0200 Subject: [PATCH 2/2] c_ files added to CMakeLists.txt --- xzre_code/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xzre_code/CMakeLists.txt b/xzre_code/CMakeLists.txt index 7392cd5..1ece792 100644 --- a/xzre_code/CMakeLists.txt +++ b/xzre_code/CMakeLists.txt @@ -15,6 +15,9 @@ add_library(xzre_code secret_data_get_decrypted.c sha256.c sshd_patch_variables.c + c_memmove.c + c_strlen.c + c_strnlen.c ) target_compile_options(xzre_code PRIVATE -Os -fomit-frame-pointer