summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build.bat8
-rw-r--r--src/events.c6
-rw-r--r--src/main.c3
-rw-r--r--src/module.c13
-rw-r--r--src/pdb.c3
5 files changed, 19 insertions, 14 deletions
diff --git a/build.bat b/build.bat
index 6b905af..24b1515 100644
--- a/build.bat
+++ b/build.bat
@@ -11,8 +11,8 @@ IF EXIST %BUILD_DIR% rmdir %BUILD_DIR%\ /S /Q
mkdir %BUILD_DIR%
-set MSVC=1
-set CLANG=0
+set MSVC=0
+set CLANG=1
set C_COMPILER=cl
set C_LINKER=link
if %MSVC% EQU 1 (
@@ -38,8 +38,11 @@ if %MSVC% EQU 1 (
set DEBUG_C_FLAGS=-DDEBUG -g -O0
set RELEASE_C_FLAGS=-DNDEBUG -O2
+ set DEBUG_L_FLAGS=/DEBUG
)
+set L_FLAGS=/WX /SUBSYSTEM:CONSOLE /NODEFAULTLIB /stack:0x100000,100000
+
if %RELEASE% EQU 0 (
set C_FLAGS=%DEBUG_C_FLAGS% %C_FLAGS%
set L_FLAGS=%DEBUG_L_FLAGS% %L_FLAGS%
@@ -50,7 +53,6 @@ if %RELEASE% EQU 0 (
)
-set L_FLAGS=/WX /SUBSYSTEM:CONSOLE /NODEFAULTLIB /stack:0x500000,500000 /DEBUG
set src=main utils events module parser pdb hashmap stack_walk disasm loader
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;