summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build.bat8
-rw-r--r--compile_flags.txt13
-rw-r--r--include/events.h19
-rw-r--r--include/module.h19
-rw-r--r--include/parser.h4
-rw-r--r--include/pdb.h1
-rw-r--r--include/utils.h23
-rw-r--r--src/events.c15
-rw-r--r--src/main.c31
-rw-r--r--src/module.c9
-rw-r--r--src/parser.c13
-rw-r--r--src/pdb.c5
-rw-r--r--src/utils.c20
13 files changed, 144 insertions, 36 deletions
diff --git a/build.bat b/build.bat
index 57d60ee..45538f1 100644
--- a/build.bat
+++ b/build.bat
@@ -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) {
diff --git a/src/main.c b/src/main.c
index e71b1b7..a747cb6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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,
diff --git a/src/pdb.c b/src/pdb.c
index f646a85..e99f0e3 100644
--- a/src/pdb.c
+++ b/src/pdb.c
@@ -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;
+}