From 7b6964eb1bcf30a0ae7ed3391adce30565b262b4 Mon Sep 17 00:00:00 2001 From: ladevieq Date: Sun, 12 Jul 2026 00:47:54 +0200 Subject: Load functions by hand --- src/main.c | 330 +++++++++++++++++++++++++++++++------------------------------ 1 file changed, 167 insertions(+), 163 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index dd84cea..3ad1e9f 100644 --- a/src/main.c +++ b/src/main.c @@ -4,6 +4,8 @@ #include "events.h" #include "parser.h" +#include "win_funcs.h" + // ======================= // ====== windows.h ====== // ======================= @@ -120,98 +122,98 @@ typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE; // Exception record definition. // -typedef struct _EXCEPTION_RECORD { - u32 ExceptionCode; - u32 ExceptionFlags; - struct _EXCEPTION_RECORD *ExceptionRecord; - void* ExceptionAddress; - u32 NumberParameters; - u64* ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; - } EXCEPTION_RECORD; - -typedef EXCEPTION_RECORD *PEXCEPTION_RECORD; - -typedef struct _EXCEPTION_DEBUG_INFO { - EXCEPTION_RECORD ExceptionRecord; - u32 dwFirstChance; -} EXCEPTION_DEBUG_INFO, *LPEXCEPTION_DEBUG_INFO; - -typedef struct _CREATE_THREAD_DEBUG_INFO { - void* hThread; - void* lpThreadLocalBase; - LPTHREAD_START_ROUTINE lpStartAddress; -} CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO; - -typedef struct _CREATE_PROCESS_DEBUG_INFO { - void* hFile; - void* hProcess; - void* hThread; - void* lpBaseOfImage; - u32 dwDebugInfoFileOffset; - u32 nDebugInfoSize; - void* lpThreadLocalBase; - LPTHREAD_START_ROUTINE lpStartAddress; - void* lpImageName; - u16 fUnicode; -} CREATE_PROCESS_DEBUG_INFO, *LPCREATE_PROCESS_DEBUG_INFO; - -typedef struct _EXIT_THREAD_DEBUG_INFO { - u32 dwExitCode; -} EXIT_THREAD_DEBUG_INFO, *LPEXIT_THREAD_DEBUG_INFO; - -typedef struct _EXIT_PROCESS_DEBUG_INFO { - u32 dwExitCode; -} EXIT_PROCESS_DEBUG_INFO, *LPEXIT_PROCESS_DEBUG_INFO; - -typedef struct _LOAD_DLL_DEBUG_INFO { - void* hFile; - void* lpBaseOfDll; - u32 dwDebugInfoFileOffset; - u32 nDebugInfoSize; - void* lpImageName; - u16 fUnicode; -} LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO; - -typedef struct _UNLOAD_DLL_DEBUG_INFO { - void* lpBaseOfDll; -} UNLOAD_DLL_DEBUG_INFO, *LPUNLOAD_DLL_DEBUG_INFO; - -typedef struct _OUTPUT_DEBUG_STRING_INFO { - char* lpDebugStringData; - u16 fUnicode; - u16 nDebugStringLength; -} OUTPUT_DEBUG_STRING_INFO, *LPOUTPUT_DEBUG_STRING_INFO; - -typedef struct _RIP_INFO { - u32 dwError; - u32 dwType; -} RIP_INFO, *LPRIP_INFO; - -typedef struct _DEBUG_EVENT { - u32 dwDebugEventCode; - u32 dwProcessId; - u32 dwThreadId; - union { - EXCEPTION_DEBUG_INFO Exception; - CREATE_THREAD_DEBUG_INFO CreateThread; - CREATE_PROCESS_DEBUG_INFO CreateProcessInfo; - EXIT_THREAD_DEBUG_INFO ExitThread; - EXIT_PROCESS_DEBUG_INFO ExitProcess; - LOAD_DLL_DEBUG_INFO LoadDll; - UNLOAD_DLL_DEBUG_INFO UnloadDll; - OUTPUT_DEBUG_STRING_INFO DebugString; - RIP_INFO RipInfo; - } u; -} DEBUG_EVENT, *LPDEBUG_EVENT; - -extern i32 WaitForDebugEventEx(LPDEBUG_EVENT lpDebugEvent, u32 dwMilliseconds); - -typedef struct _PROCESS_INFORMATION { - void* hProcess; - void* hThread; - u32 dwProcessId; - u32 dwThreadId; -} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION; +// typedef struct _EXCEPTION_RECORD { +// u32 ExceptionCode; +// u32 ExceptionFlags; +// struct _EXCEPTION_RECORD *ExceptionRecord; +// void* ExceptionAddress; +// u32 NumberParameters; +// u64* ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; +// } EXCEPTION_RECORD; +// +// typedef EXCEPTION_RECORD *PEXCEPTION_RECORD; +// +// typedef struct _EXCEPTION_DEBUG_INFO { +// EXCEPTION_RECORD ExceptionRecord; +// u32 dwFirstChance; +// } EXCEPTION_DEBUG_INFO, *LPEXCEPTION_DEBUG_INFO; +// +// typedef struct _CREATE_THREAD_DEBUG_INFO { +// void* hThread; +// void* lpThreadLocalBase; +// LPTHREAD_START_ROUTINE lpStartAddress; +// } CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO; +// +// typedef struct _CREATE_PROCESS_DEBUG_INFO { +// void* hFile; +// void* hProcess; +// void* hThread; +// void* lpBaseOfImage; +// u32 dwDebugInfoFileOffset; +// u32 nDebugInfoSize; +// void* lpThreadLocalBase; +// LPTHREAD_START_ROUTINE lpStartAddress; +// void* lpImageName; +// u16 fUnicode; +// } CREATE_PROCESS_DEBUG_INFO, *LPCREATE_PROCESS_DEBUG_INFO; +// +// typedef struct _EXIT_THREAD_DEBUG_INFO { +// u32 dwExitCode; +// } EXIT_THREAD_DEBUG_INFO, *LPEXIT_THREAD_DEBUG_INFO; +// +// typedef struct _EXIT_PROCESS_DEBUG_INFO { +// u32 dwExitCode; +// } EXIT_PROCESS_DEBUG_INFO, *LPEXIT_PROCESS_DEBUG_INFO; +// +// typedef struct _LOAD_DLL_DEBUG_INFO { +// void* hFile; +// void* lpBaseOfDll; +// u32 dwDebugInfoFileOffset; +// u32 nDebugInfoSize; +// void* lpImageName; +// u16 fUnicode; +// } LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO; +// +// typedef struct _UNLOAD_DLL_DEBUG_INFO { +// void* lpBaseOfDll; +// } UNLOAD_DLL_DEBUG_INFO, *LPUNLOAD_DLL_DEBUG_INFO; +// +// typedef struct _OUTPUT_DEBUG_STRING_INFO { +// char* lpDebugStringData; +// u16 fUnicode; +// u16 nDebugStringLength; +// } OUTPUT_DEBUG_STRING_INFO, *LPOUTPUT_DEBUG_STRING_INFO; +// +// typedef struct _RIP_INFO { +// u32 dwError; +// u32 dwType; +// } RIP_INFO, *LPRIP_INFO; +// +// typedef struct _DEBUG_EVENT { +// u32 dwDebugEventCode; +// u32 dwProcessId; +// u32 dwThreadId; +// union { +// EXCEPTION_DEBUG_INFO Exception; +// CREATE_THREAD_DEBUG_INFO CreateThread; +// CREATE_PROCESS_DEBUG_INFO CreateProcessInfo; +// EXIT_THREAD_DEBUG_INFO ExitThread; +// EXIT_PROCESS_DEBUG_INFO ExitProcess; +// LOAD_DLL_DEBUG_INFO LoadDll; +// UNLOAD_DLL_DEBUG_INFO UnloadDll; +// OUTPUT_DEBUG_STRING_INFO DebugString; +// RIP_INFO RipInfo; +// } u; +// } DEBUG_EVENT, *LPDEBUG_EVENT; + +// extern i32 WaitForDebugEventEx(LPDEBUG_EVENT lpDebugEvent, u32 dwMilliseconds); + +// typedef struct _PROCESS_INFORMATION { +// void* hProcess; +// void* hThread; +// u32 dwProcessId; +// u32 dwThreadId; +// } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION; #define PAGE_NOACCESS 0x01 #define PAGE_READONLY 0x02 @@ -270,41 +272,41 @@ typedef struct _PROCESS_INFORMATION { #define MEM_EXTENDED_PARAMETER_EC_CODE 0x00000040 #define MEM_EXTENDED_PARAMETER_NUMA_NODE_MANDATORY MINLONG64 -extern void* VirtualAlloc(void* lpAddress, size_t dwSize, u32 flAllocationType, u32 flProtect); -extern i32 VirtualFree(void* lpAddress, size_t dwSize, u32 dwFreeType); +// extern void* VirtualAlloc(void* lpAddress, u64 dwSize, u32 flAllocationType, u32 flProtect); +// extern i32 VirtualFree(void* lpAddress, size_t dwSize, u32 dwFreeType); #define STD_INPUT_HANDLE ((u32)-10) #define STD_OUTPUT_HANDLE ((u32)-11) #define STD_ERROR_HANDLE ((u32)-12) -extern void* GetStdHandle(u32 nStdHandle); - -typedef struct _STARTUPINFOA { - u32 cb; - i8* lpReserved; - i8* lpDesktop; - i8* lpTitle; - u32 dwX; - u32 dwY; - u32 dwXSize; - u32 dwYSize; - u32 dwXCountChars; - u32 dwYCountChars; - u32 dwFillAttribute; - u32 dwFlags; - u16 wShowWindow; - u16 cbReserved2; - u8* lpReserved2; - void* hStdInput; - void* hStdOutput; - void* hStdError; -} STARTUPINFOA, *LPSTARTUPINFOA; - -typedef struct _SECURITY_ATTRIBUTES { - u32 nLength; - void* lpSecurityDescriptor; - i32 bInheritHandle; -} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; +// extern void* GetStdHandle(u32 nStdHandle); + +// typedef struct _STARTUPINFOA { +// u32 cb; +// i8* lpReserved; +// i8* lpDesktop; +// i8* lpTitle; +// u32 dwX; +// u32 dwY; +// u32 dwXSize; +// u32 dwYSize; +// u32 dwXCountChars; +// u32 dwYCountChars; +// u32 dwFillAttribute; +// u32 dwFlags; +// u16 wShowWindow; +// u16 cbReserved2; +// u8* lpReserved2; +// void* hStdInput; +// void* hStdOutput; +// void* hStdError; +// } STARTUPINFOA, *LPSTARTUPINFOA; +// +// typedef struct _SECURITY_ATTRIBUTES { +// u32 nLength; +// void* lpSecurityDescriptor; +// i32 bInheritHandle; +// } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; // // Process dwCreationFlag values @@ -355,20 +357,20 @@ typedef struct _SECURITY_ATTRIBUTES { //#define CREATE_SUSPENDED 0x00000004 -extern i32 CreateProcessA( - const i8* lpApplicationName, - i8* lpCommandLine, - LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - i32 bInheritHandles, - u32 dwCreationFlags, - void* lpEnvironment, - const i8* lpCurrentDirectory, - LPSTARTUPINFOA lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation -); - -extern i32 TerminateProcess(void* hProcess, u32 uExitCode); +// extern i32 CreateProcessA( +// const i8* lpApplicationName, +// i8* lpCommandLine, +// LPSECURITY_ATTRIBUTES lpProcessAttributes, +// LPSECURITY_ATTRIBUTES lpThreadAttributes, +// i32 bInheritHandles, +// u32 dwCreationFlags, +// void* lpEnvironment, +// const i8* lpCurrentDirectory, +// LPSTARTUPINFOA lpStartupInfo, +// LPPROCESS_INFORMATION lpProcessInformation +// ); +// +// extern i32 TerminateProcess(void* hProcess, u32 uExitCode); // // Input Mode flags: @@ -395,36 +397,36 @@ extern i32 TerminateProcess(void* hProcess, u32 uExitCode); #define DISABLE_NEWLINE_AUTO_RETURN 0x0008 #define ENABLE_LVB_GRID_WORLDWIDE 0x0010 -extern i32 SetConsoleMode(void* hConsoleHandle, u32 dwMode); - -typedef struct _CONSOLE_READCONSOLE_CONTROL { - u32 nLength; - u32 nInitialChars; - u32 dwCtrlWakeupMask; - u32 dwControlKeyState; -} CONSOLE_READCONSOLE_CONTROL, *PCONSOLE_READCONSOLE_CONTROL; - -extern i32 ReadConsoleA( - void* hConsoleInput, - void* lpBuffer, - u32 nNumberOfCharsToRead, - u32* lpNumberOfCharsRead, - PCONSOLE_READCONSOLE_CONTROL pInputControl - ); - -extern i32 WriteConsoleA( - void* hConsoleOutput, - const void* lpBuffer, - u32 nNumberOfCharsToWrite, - u32* lpNumberOfCharsWritten, - void* lpReserved - ); +// extern i32 SetConsoleMode(void* hConsoleHandle, u32 dwMode); + +// typedef struct _CONSOLE_READCONSOLE_CONTROL { +// u32 nLength; +// u32 nInitialChars; +// u32 dwCtrlWakeupMask; +// u32 dwControlKeyState; +// } CONSOLE_READCONSOLE_CONTROL, *PCONSOLE_READCONSOLE_CONTROL; + +// extern i32 ReadConsoleA( +// void* hConsoleInput, +// void* lpBuffer, +// u32 nNumberOfCharsToRead, +// u32* lpNumberOfCharsRead, +// PCONSOLE_READCONSOLE_CONTROL pInputControl +// ); +// +// extern i32 WriteConsoleA( +// void* hConsoleOutput, +// const void* lpBuffer, +// u32 nNumberOfCharsToWrite, +// u32* lpNumberOfCharsWritten, +// void* lpReserved +// ); // ======================== // ====== !windows.h ====== // ======================== -extern u32 _fltused = TRUE; +u32 _fltused = TRUE; u8 is_open = TRUE; u8 process_commands = TRUE; @@ -438,7 +440,7 @@ u32 continue_status = DBG_EXCEPTION_NOT_HANDLED; u8* string_stack_base = NULL; u8* string_stack_current = NULL; -void dbg_loop() { +void dbg_loop(void) { while(is_open) { WaitForDebugEventEx(&dbg_event, INFINITE); @@ -488,7 +490,9 @@ void dbg_loop() { } } -int mainCRTStartup() { +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); -- cgit v1.3