From ba07d7cf9430ab95f6f1f886079f60a3dcf345d1 Mon Sep 17 00:00:00 2001 From: ladevieq Date: Fri, 17 Jul 2026 13:30:47 +0200 Subject: Fix stack walk find_function search Fix string stack asserts --- src/events.c | 6 ++++-- src/main.c | 3 ++- src/module.c | 13 ++++++------- src/pdb.c | 3 ++- 4 files changed, 14 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/events.c b/src/events.c index 8c0f8ad..85e68c2 100644 --- a/src/events.c +++ b/src/events.c @@ -268,6 +268,7 @@ u8 expect_single_step = FALSE; extern DEBUG_EVENT dbg_event; extern u8* string_stack_base; extern u8* string_stack_current; +extern const u32 string_stack_size; const char* dummy_name = "Function_dummy_name"; @@ -394,10 +395,11 @@ void load_symbols(const void* base_addr, struct module* module) { for (; name_index < export_dir.NumberOfNames; name_index++) { if (ordinals[name_index] == i) { // TODO: Add string management code - assert(string_stack_current - 16U * 4096U < string_stack_base); void* name_address = (void*)((u64)module->base_addr + names_address[name_index]); read_memory(name_address, name, 256U); length = str_len((const char*)name); + + assert(string_stack_current - (string_stack_current + length) < string_stack_size); break; } } @@ -685,7 +687,7 @@ void handle_output_debug_string(void) { OUTPUT_DEBUG_STRING_INFO dbg_str_event = dbg_event.u.DebugString; char* str_addr = dbg_str_event.lpDebugStringData; size_t str_size = (size_t)dbg_str_event.nDebugStringLength; - // assert(str_size > 1024U); + assert(str_size > 1024U * sizeof(u16)); u16 dbg_str[1024U] = { 0U }; if (!read_memory(str_addr, dbg_str, str_size)) { print("%s %u\n", "OutputDebugStringDebugEvent : error reading debug string : ", GetLastError()); diff --git a/src/main.c b/src/main.c index 3ad1e9f..e31fe4d 100644 --- a/src/main.c +++ b/src/main.c @@ -439,6 +439,7 @@ u32 continue_status = DBG_EXCEPTION_NOT_HANDLED; // TODO: Perfect hashing table ? u8* string_stack_base = NULL; u8* string_stack_current = NULL; +const u32 string_stack_size = 64U * 4096U; void dbg_loop(void) { while(is_open) { @@ -494,7 +495,7 @@ extern void load_funcs(void); int mainCRTStartup(void) { load_funcs(); - string_stack_current = string_stack_base = VirtualAlloc(NULL, 4096U * 64U, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + string_stack_current = string_stack_base = VirtualAlloc(NULL, string_stack_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); STARTUPINFOA startup_info = { 0 }; startup_info.cb = sizeof(startup_info); diff --git a/src/module.c b/src/module.c index 13f0a8d..d549704 100644 --- a/src/module.c +++ b/src/module.c @@ -5,14 +5,13 @@ extern unsigned char _BitScanForward64(unsigned long *_Index, uint64_t _Mask); struct module modules[64U] = { 0U }; -// u64 modules_list = ~0ULL; // TODO: Check if modules_list is supposed to be filled with one's ? -u64 modules_list = 0ULL; // TODO: Filled modules_list with zeroes since we assert during the first call to add_module, see comment above +u64 modules_list = ~0ULL; // u64 module_symbols u8 add_module(void) { // struct module* add_module() { - assert(!modules_list); + assert(modules_list); u32 module_index = 0U; _BitScanForward64((unsigned long*)&module_index, modules_list); modules_list ^= (u64)(0x1 << module_index); @@ -45,12 +44,12 @@ u32 find_function(struct module* module, u64 rip_offset) { } u32 min = 0U, max = module->functions_count - 1U; - while(min != max) { + while((max - min) > 1U) { u32 mid = (min + max) / 2U; - if (module->functions_start[mid] < rip_offset) { - min = mid + 1U; + if (rip_offset < module->functions_start[mid]) { + max = mid; } else { - max = mid - 1U; + min = mid; } } diff --git a/src/pdb.c b/src/pdb.c index 1057f63..6960706 100644 --- a/src/pdb.c +++ b/src/pdb.c @@ -197,6 +197,7 @@ enum STREAM_INDEX { extern u8* string_stack_base; extern u8* string_stack_current; +extern const u32 string_stack_size; void open_pdb(const i8* pdb_path, struct module* module) { void* pdb_file = CreateFileA(pdb_path, GENERIC_READ | FILE_READ_ATTRIBUTES, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); @@ -379,8 +380,8 @@ void open_pdb(const i8* pdb_path, struct module* module) { struct PROCSYM32* proc = (struct PROCSYM32*)cur_sym; print("PROC32 SYMBOL %s\n", proc->name); // TODO: Add string management code - assert(string_stack_current - 16U * 4096U < string_stack_base); size_t length = str_len((const char*)proc->name); + assert(string_stack_current - (string_stack_current + length) < string_stack_size); str_cat((char*)string_stack_current, (const char*)proc->name, length); string_stack_current[length] = '\0'; u32 start_address = proc->off + module->nt_header.OptionalHeader.BaseOfCode; -- cgit v1.3