diff options
| -rw-r--r-- | build.bat | 8 | ||||
| -rw-r--r-- | compile_flags.txt | 13 | ||||
| -rw-r--r-- | include/events.h | 19 | ||||
| -rw-r--r-- | include/module.h | 19 | ||||
| -rw-r--r-- | include/parser.h | 4 | ||||
| -rw-r--r-- | include/pdb.h | 1 | ||||
| -rw-r--r-- | include/utils.h | 23 | ||||
| -rw-r--r-- | src/events.c | 15 | ||||
| -rw-r--r-- | src/main.c | 31 | ||||
| -rw-r--r-- | src/module.c | 9 | ||||
| -rw-r--r-- | src/parser.c | 13 | ||||
| -rw-r--r-- | src/pdb.c | 5 | ||||
| -rw-r--r-- | src/utils.c | 20 |
13 files changed, 144 insertions, 36 deletions
@@ -33,13 +33,17 @@ if "%release%"=="0" ( set L_FLAGS=/DEBUG %L_FLAGS% ) +set src=main utils events module parser pdb :: DBG :: Compile -cl /Fd:%BUILD_DIR%\main.pdb %C_FLAGS% src\main.c +(for %%s in (%src%) do ( + call set OBJS=%%OBJS%% %BUILD_DIR%\%%s.obj + cl /Fd:%BUILD_DIR%\%%s.pdb %C_FLAGS% src\%%s.c +)) :: Link -link %L_FLAGS% /OUT:%BUILD_DIR%\main.exe %BUILD_DIR%\main.obj kernel32.lib +link %L_FLAGS% /OUT:%BUILD_DIR%\main.exe %OBJS% kernel32.lib :: Test program set SRC_FILE=test diff --git a/compile_flags.txt b/compile_flags.txt new file mode 100644 index 0000000..f2f8d3d --- /dev/null +++ b/compile_flags.txt @@ -0,0 +1,13 @@ +-W4 +-WX +-GS- +-GR- +-Gs1000000000 +-Fo:%BUILD_DIR%\ +-I +include/ +-I +src/ +-std:c17 +-c +-TC diff --git a/include/events.h b/include/events.h new file mode 100644 index 0000000..65131c6 --- /dev/null +++ b/include/events.h @@ -0,0 +1,19 @@ +#pragma once + +extern void handle_create_process(); + +extern void handle_create_thread(); + +extern void handle_exception(); + +extern void handle_exit_process(); + +extern void handle_exit_thread(); + +extern void handle_load_dll(); + +extern void handle_unload_dll(); + +extern void handle_output_debug_string(); + +extern void handle_rip(); diff --git a/include/module.h b/include/module.h new file mode 100644 index 0000000..8a1858f --- /dev/null +++ b/include/module.h @@ -0,0 +1,19 @@ +#pragma once + +#include <Windows.h> + +#include "types.h" + +struct module { + void* base_addr; + IMAGE_DOS_HEADER dos_header; + IMAGE_NT_HEADERS64 nt_header; + u8 name[256U]; +}; + +extern struct module modules[64U]; +extern u64 modules_list; + +extern u8 add_module(); + +extern void remove_module(u8 index); diff --git a/include/parser.h b/include/parser.h new file mode 100644 index 0000000..1f93aac --- /dev/null +++ b/include/parser.h @@ -0,0 +1,4 @@ +#pragma once + +#include "types.h" +extern u8 interpreter(const char* str_cmd, size_t str_cmd_len); diff --git a/include/pdb.h b/include/pdb.h new file mode 100644 index 0000000..eee19ae --- /dev/null +++ b/include/pdb.h @@ -0,0 +1 @@ +extern void open_pdb(const char* pdb_path); diff --git a/include/utils.h b/include/utils.h new file mode 100644 index 0000000..738ba9f --- /dev/null +++ b/include/utils.h @@ -0,0 +1,23 @@ +#pragma once + +#include "types.h" + +#if defined (_DEBUG) +#define assert(x) if (!(x)) __debugbreak(); +#else +#define assert(x) (x) +#endif + +void print(const char* format, ...); + +u8 is_alpha(char c); + +u8 is_decimal_digit(char c); + +u8 is_hexadecimal_digit(char c); + +void u64toa(u64 number, char* str, u32 base); + +u64 atou64(const char* str, u32 len); + +u8 read_memory(const void* addr, void* buffer, size_t size); diff --git a/src/events.c b/src/events.c index 61cc9dd..7ab5b53 100644 --- a/src/events.c +++ b/src/events.c @@ -1,4 +1,15 @@ -void read_name_uni(const void* name_addr, const char* name, size_t name_size) { +#include <Windows.h> + +#include "types.h" +#include "utils.h" +#include "module.h" +#include "pdb.h" + +u8 expect_single_step = FALSE; + +extern DEBUG_EVENT dbg_event; + +static void read_name_uni(const void* name_addr, const char* name, size_t name_size) { u8* addr = NULL; if (!read_memory(name_addr, (void*)&addr, 8U)) { print("%s %u\n", "Loading DLL : error reading dll name : ", GetLastError()); @@ -143,6 +154,8 @@ void handle_create_thread() { } void handle_exception() { + extern DWORD continue_status; + print("%s : ", "ExceptionDebugEvent"); if (dbg_event.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_SINGLE_STEP && expect_single_step) { @@ -4,29 +4,18 @@ #include "types.h" -#include "utils.c" +#include "utils.h" +#include "events.h" +#include "parser.h" -static HANDLE h_input = NULL; -static HANDLE h_output = NULL; -static u8 is_open = TRUE; -static u8 process_commands = TRUE; -static u8 expect_single_step = FALSE; -static DWORD continue_status = DBG_EXCEPTION_NOT_HANDLED; -static DEBUG_EVENT dbg_event; -static PROCESS_INFORMATION proc_info = { 0 }; +u8 is_open = TRUE; +u8 process_commands = TRUE; -/* Read debugged process memory at address */ -u8 read_memory(const void* addr, void* buffer, size_t size) { - size_t b_read = 0U; - HRESULT hr = ReadProcessMemory(proc_info.hProcess, addr, buffer, size, &b_read); - - return hr > 0 && b_read == size; -} - -#include "module.c" -#include "parser.c" -#include "pdb.c" -#include "events.c" +HANDLE h_input = NULL; +HANDLE h_output = NULL; +DEBUG_EVENT dbg_event; +PROCESS_INFORMATION proc_info = { 0 }; +DWORD continue_status = DBG_EXCEPTION_NOT_HANDLED; void dbg_loop() { while(is_open) { diff --git a/src/module.c b/src/module.c index 8188665..fde93fe 100644 --- a/src/module.c +++ b/src/module.c @@ -1,9 +1,6 @@ -struct module { - void* base_addr; - IMAGE_DOS_HEADER dos_header; - IMAGE_NT_HEADERS64 nt_header; - u8 name[256U]; -}; +#include "module.h" + +#include "utils.h" struct module modules[64U] = { 0U }; u64 modules_list = ~0ULL; diff --git a/src/parser.c b/src/parser.c index 5ec6b0d..86f9563 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1,3 +1,12 @@ +#include <Windows.h> + +#include "types.h" +#include "utils.h" +#include "module.h" + +extern u8 expect_single_step; +extern DWORD continue_status; + enum TOKEN_TYPE { // Commands TOKEN_CONTINUE, @@ -183,6 +192,10 @@ u64 eval_number(const struct ast_node* node) { } void run(struct ast_node* root) { + extern DEBUG_EVENT dbg_event; + extern u8 process_commands; + extern u8 is_open; + struct ast_node cur_node = root[0]; CONTEXT ctx = { .ContextFlags = CONTEXT_ALL, @@ -1,5 +1,10 @@ +#include <Windows.h> +#include <strsafe.h> #include "cvinfo.h" +#include "types.h" +#include "utils.h" + enum STREAM_INDEX { OLD_DIRECTORY, PDB, diff --git a/src/utils.c b/src/utils.c index de719e9..440b9fb 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,9 +1,7 @@ -#if defined (_DEBUG) -#define assert(x) if (!(x)) __debugbreak(); -#else -#define assert(x) (x) -#endif -void print(const char* format, ...); +#include "utils.h" + +#include <Windows.h> +#include <strsafe.h> u8 is_alpha(char c) { return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'); @@ -155,3 +153,13 @@ void print(const char* format, ...) { StringCchLengthA(formatted_str, sizeof(formatted_str), &length); SUCCEEDED(WriteFile(standard_err, formatted_str, (DWORD)length, NULL, NULL)); } + +/* Read debugged process memory at address */ +u8 read_memory(const void* addr, void* buffer, size_t size) { + extern PROCESS_INFORMATION proc_info; + + size_t b_read = 0U; + HRESULT hr = ReadProcessMemory(proc_info.hProcess, addr, buffer, size, &b_read); + + return hr > 0 && b_read == size; +} |
