From 0379f7634200c35682adb53a6653d441849903ae Mon Sep 17 00:00:00 2001 From: ladevieq Date: Thu, 9 Jul 2026 00:58:20 +0200 Subject: Fixed compilation Add disasm to compiled files Removed dependency to strsafe Detect SIB and displacement bytes correctly --- src/utils.c | 193 +++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 151 insertions(+), 42 deletions(-) (limited to 'src/utils.c') diff --git a/src/utils.c b/src/utils.c index 27dab87..729b74d 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,7 +1,6 @@ #include "utils.h" #include -#include u8 is_alpha(char c) { return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'); @@ -15,6 +14,31 @@ u8 is_hexadecimal_digit(char c) { return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F'); } + +// TODO: Improve basic functions perfs +// max_size: str allocated size +size_t str_len(const char* str, size_t max_size) { + const char* c = str; + size_t count = 0U; + while (*c != '\0' && count < max_size) { + c++; + count++; + } + return count; +} + +void str_cat(char* out, const char* str, size_t c_str) { + char* cur_out = out; + const char* cur_str = str; + u32 index = 0U; + while(index < c_str) { + *cur_out = *cur_str; + cur_out++; + cur_str++; + index++; + } +} + void u64toa(u64 number, char* str, u32 base) { static char codes[16U] = { '0', @@ -37,9 +61,8 @@ void u64toa(u64 number, char* str, u32 base) { u32 remainder = 0U; u32 size = 0U; - if (number == 0) { + if (number == 0U) { str[0U] = codes[0U]; - return; } for(; number != 0U; size++) { @@ -95,74 +118,162 @@ void print(const char* format, ...) { va_list args; va_start(args, format); char formatted_str[4096U] = { 0 }; - STRSAFE_LPSTR cur_char = formatted_str; + char* cur_char = formatted_str; const char* cur_fmt = format; while(*cur_fmt != '\0') { if(*cur_fmt == '%') { cur_fmt++; - const char* num_start = cur_fmt; - u8 num_len = 0U; u64 fill_count = 0U; - while (is_decimal_digit(*cur_fmt)) { + + // padding length + if (*cur_fmt == '.') { cur_fmt++; - num_len++; - } - if (num_len > 0U) { - fill_count = atou64(num_start, num_len); + const char* num_start = cur_fmt; + u8 num_len = 0U; + + while (is_decimal_digit(*cur_fmt)) { + cur_fmt++; + num_len++; + } + + if (num_len > 0U) { + fill_count = atou64(num_start, num_len); + } } + // TODO: length modifiers + + // conversion specifiers if (*cur_fmt == 's') { const char* str = va_arg(args, const char*); if(str != NULL) { - size_t length = 0U; - StringCchLengthA(str, sizeof(formatted_str), &length); + size_t length = str_len(str, sizeof(formatted_str)); i64 relative_fill_count = fill_count - length; - if (relative_fill_count > 0) { + if (relative_fill_count > 1) { fill_chars((u8*)cur_char, ' ', (u32)relative_fill_count); cur_char += relative_fill_count; } - StringCchCatA(cur_char, length + 1U, str); + str_cat(cur_char, str, length); cur_char += length; } } else if(*cur_fmt == 'c') { char c = va_arg(args, char); if (fill_count > 1U) { fill_chars((u8*)cur_char, ' ', (u32)fill_count - 1U); - cur_char += fill_count - 1U; + cur_char += fill_count; } - StringCchCatA(cur_char, 1U, &c); - cur_char += 1U; - } else if (*cur_fmt == 'x' && is_alpha(cur_fmt[1])) { - u32 base = 16U; - cur_fmt++; + *cur_char = c; + cur_char++; + } else if (*cur_fmt == 'x') { + u64 number = va_arg(args, u64); + u32 str_len = 0; - if(*cur_fmt == 'b') { - u8 number = va_arg(args, u8); - u64toa((u64)number, cur_char, base); - size_t length = 0U; - StringCchLengthA(formatted_str, sizeof(formatted_str), &length); - cur_char = formatted_str + length; - } else if(*cur_fmt == 'u') { - u64 number = va_arg(args, u64); - u64toa(number, cur_char, base); - size_t length = 0U; - StringCchLengthA(formatted_str, sizeof(formatted_str), &length); - cur_char = formatted_str + length; + if (number > 0xfffffffffffffff) { + str_len = 16U; + } else if (number > 0xffffffffffffff) { + str_len = 15U; + } else if (number > 0xfffffffffffff) { + str_len = 14U; + } else if (number > 0xffffffffffff) { + str_len = 13U; + } else if (number > 0xfffffffffff) { + str_len = 12U; + } else if (number > 0xffffffffff) { + str_len = 11U; + } else if (number > 0xfffffffff) { + str_len = 10U; + } else if (number > 0xffffffff) { + str_len = 9U; + } else if (number > 0xfffffff) { + str_len = 8U; + } else if (number > 0xffffff) { + str_len = 7U; + } else if (number > 0xfffff) { + str_len = 6U; + } else if (number > 0xffff) { + str_len = 5U; + } else if (number > 0xfff) { + str_len = 4U; + } else if (number > 0xff) { + str_len = 3U; + } else if (number > 0xf) { + str_len = 2U; } + + i64 relative_fill_count = fill_count - str_len; + if (relative_fill_count > 1) { + fill_chars((u8*)cur_char, '0', (u32)relative_fill_count); + cur_char += fill_count; + } + u64toa(number, cur_char, 16U); + + cur_char += str_len; } else if(*cur_fmt == 'b') { u8 number = va_arg(args, u8); + u32 str_len = 8U - __lzcnt(number); + + i64 relative_fill_count = fill_count - str_len; + if (relative_fill_count > 1) { + fill_chars((u8*)cur_char, '0', (u32)relative_fill_count); + cur_char += fill_count; + } + u64toa((u64)number, cur_char, 10U); - size_t length = 0U; - StringCchLengthA(formatted_str, sizeof(formatted_str), &length); - cur_char = formatted_str + length; + cur_char += str_len; } else if(*cur_fmt == 'u') { u64 number = va_arg(args, u64); + u32 str_len = 1U; + + if (number > 9999999999999999999U) { + str_len = 20U; + } else if (number > 999999999999999999U) { + str_len = 19U; + } else if (number > 99999999999999999U) { + str_len = 18U; + } else if (number > 9999999999999999U) { + str_len = 17U; + } else if (number > 999999999999999U) { + str_len = 16U; + } else if (number > 99999999999999U) { + str_len = 15U; + } else if (number > 9999999999999U) { + str_len = 14U; + } else if (number > 999999999999U) { + str_len = 13U; + } else if (number > 99999999999U) { + str_len = 12U; + } else if (number > 9999999999U) { + str_len = 11U; + } else if (number > 999999999U) { + str_len = 10U; + } else if (number > 99999999U) { + str_len = 9U; + } else if (number > 9999999U) { + str_len = 8U; + } else if (number > 999999U) { + str_len = 7U; + } else if (number > 99999U) { + str_len = 6U; + } else if (number > 9999U) { + str_len = 5U; + } else if (number > 999U) { + str_len = 4U; + } else if (number > 99U) { + str_len = 3U; + } else if (number > 9U) { + str_len = 2U; + } + + i64 relative_fill_count = fill_count - str_len; + if (relative_fill_count > 1U) { + fill_chars((u8*)cur_char, '0', (u32)relative_fill_count); + cur_char += fill_count; + } + u64toa(number, cur_char, 10U); - size_t length = 0U; - StringCchLengthA(formatted_str, sizeof(formatted_str), &length); - cur_char = formatted_str + length; + cur_char += str_len; } } else { *cur_char = *cur_fmt; @@ -173,9 +284,7 @@ void print(const char* format, ...) { va_end(args); HANDLE standard_err = GetStdHandle(STD_ERROR_HANDLE); - size_t length = 0U; - StringCchLengthA(formatted_str, sizeof(formatted_str), &length); - SUCCEEDED(WriteFile(standard_err, formatted_str, (DWORD)length, NULL, NULL)); + SUCCEEDED(WriteFile(standard_err, formatted_str, (u32)(cur_char - formatted_str), NULL, NULL)); } /* Read debugged process memory at address */ -- cgit v1.3