summaryrefslogtreecommitdiffhomepage
path: root/dev/LibDebugger/POSIXMachContract.h
diff options
context:
space:
mode:
authorAmlal <amlal@nekernel.org>2025-04-25 13:14:01 +0200
committerAmlal <amlal@nekernel.org>2025-04-25 13:14:01 +0200
commit20042235d1f53ae428aa154e64afdbae5d8d91ad (patch)
tree6ea42d1b30505a57301f8ff2916c78ce94ff6eaf /dev/LibDebugger/POSIXMachContract.h
parent0561a8d0a6ae7588309a6e3513bbfeeef5f0aa15 (diff)
meta: update .clang-format, format codebase.
Signed-off-by: Amlal <amlal@nekernel.org>
Diffstat (limited to 'dev/LibDebugger/POSIXMachContract.h')
-rw-r--r--dev/LibDebugger/POSIXMachContract.h203
1 files changed, 95 insertions, 108 deletions
diff --git a/dev/LibDebugger/POSIXMachContract.h b/dev/LibDebugger/POSIXMachContract.h
index fbfe928..5904cd2 100644
--- a/dev/LibDebugger/POSIXMachContract.h
+++ b/dev/LibDebugger/POSIXMachContract.h
@@ -1,5 +1,5 @@
/***
- (C) 2025 Amlal El Mahrouss
+ (C) 2025 Amlal El Mahrouss
*/
#pragma once
@@ -9,163 +9,150 @@
/// @file POSIXMachContract.h
/// @brief POSIX Mach debugger.
-#include <LibDebugger/DebuggerContract.h>
#include <LibCompiler/Defines.h>
+#include <LibDebugger/DebuggerContract.h>
+#include <stdint.h>
#include <sys/ptrace.h>
#include <sys/types.h>
-#include <sys/wait.h>
#include <sys/user.h>
+#include <sys/wait.h>
#include <unistd.h>
-#include <stdint.h>
#include <filesystem>
#include <iostream>
+#include <dlfcn.h>
+#include <mach-o/dyld.h>
#include <mach/mach.h>
#include <mach/mach_error.h>
#include <signal.h>
-#include <mach-o/dyld.h>
-#include <dlfcn.h>
-LC_IMPORT_C kern_return_t mach_vm_write(
- vm_map_t target_task,
- mach_vm_address_t address,
- vm_offset_t data,
- mach_msg_type_number_t dataCnt);
+LC_IMPORT_C kern_return_t mach_vm_write(vm_map_t target_task, mach_vm_address_t address,
+ vm_offset_t data, mach_msg_type_number_t dataCnt);
-LC_IMPORT_C kern_return_t mach_vm_protect(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, boolean_t set_maximum, vm_prot_t new_protection);
+LC_IMPORT_C kern_return_t mach_vm_protect(vm_map_t target_task, mach_vm_address_t address,
+ mach_vm_size_t size, boolean_t set_maximum,
+ vm_prot_t new_protection);
-#define PTRACE_ATTACH PT_ATTACHEXC
-#define PTRACE_DETACH PT_DETACH
+#define PTRACE_ATTACH PT_ATTACHEXC
+#define PTRACE_DETACH PT_DETACH
#define PTRACE_POKETEXT PT_WRITE_I
-#define PTRACE_CONT PT_CONTINUE
+#define PTRACE_CONT PT_CONTINUE
#define PTRACE_PEEKTEXT PT_READ_I
-namespace LibDebugger::POSIX
-{
- /// \brief POSIXMachContract engine interface class in C++
- /// \author Amlal El Mahrouss
- class POSIXMachContract : public DebuggerContract
- {
- public:
- explicit POSIXMachContract() = default;
- ~POSIXMachContract() override = default;
+namespace LibDebugger::POSIX {
+/// \brief POSIXMachContract engine interface class in C++
+/// \author Amlal El Mahrouss
+class POSIXMachContract : public DebuggerContract {
+ public:
+ explicit POSIXMachContract() = default;
+ ~POSIXMachContract() override = default;
- public:
- POSIXMachContract& operator=(const POSIXMachContract&) = default;
- POSIXMachContract(const POSIXMachContract&) = default;
+ public:
+ POSIXMachContract& operator=(const POSIXMachContract&) = default;
+ POSIXMachContract(const POSIXMachContract&) = default;
- public:
- BOOL Attach(std::string path, std::string argv, ProcessID& pid) noexcept override
- {
- pid = fork();
+ public:
+ BOOL Attach(std::string path, std::string argv, ProcessID& pid) noexcept override {
+ pid = fork();
- if (pid == 0)
- {
- if (argv.empty())
- {
- ptrace(PT_TRACE_ME, 0, nullptr, 0);
- kill(getpid(), SIGSTOP);
- }
+ if (pid == 0) {
+ if (argv.empty()) {
+ ptrace(PT_TRACE_ME, 0, nullptr, 0);
+ kill(getpid(), SIGSTOP);
+ }
- std::vector<char*> argv_arr;
+ std::vector<char*> argv_arr;
- argv_arr.push_back(const_cast<char*>(path.c_str()));
- argv_arr.push_back(const_cast<char*>(argv.c_str()));
- argv_arr.push_back(nullptr);
+ argv_arr.push_back(const_cast<char*>(path.c_str()));
+ argv_arr.push_back(const_cast<char*>(argv.c_str()));
+ argv_arr.push_back(nullptr);
- execv(path.c_str(), argv_arr.data());
+ execv(path.c_str(), argv_arr.data());
- _exit(1);
- }
+ _exit(1);
+ }
- m_path = path;
- m_pid = pid;
+ m_path = path;
+ m_pid = pid;
- pid = this->m_pid;
+ pid = this->m_pid;
- return true;
- }
+ return true;
+ }
- void SetPath(std::string path) noexcept
- {
- if (path.empty())
- {
- return;
- }
+ void SetPath(std::string path) noexcept {
+ if (path.empty()) {
+ return;
+ }
- m_path = path;
- }
+ m_path = path;
+ }
- BOOL Breakpoint(std::string symbol) noexcept override
- {
- if (!m_path.empty() && std::filesystem::exists(m_path) && std::filesystem::is_regular_file(m_path))
- {
- auto handle = dlopen(m_path.c_str(), RTLD_LAZY);
+ BOOL Breakpoint(std::string symbol) noexcept override {
+ if (!m_path.empty() && std::filesystem::exists(m_path) &&
+ std::filesystem::is_regular_file(m_path)) {
+ auto handle = dlopen(m_path.c_str(), RTLD_LAZY);
- if (handle == nullptr)
- {
- return false;
- }
+ if (handle == nullptr) {
+ return false;
+ }
- auto addr = dlsym(handle, symbol.c_str());
+ auto addr = dlsym(handle, symbol.c_str());
- if (addr == nullptr)
- {
- return false;
- }
+ if (addr == nullptr) {
+ return false;
+ }
- task_read_t task;
- task_for_pid(mach_task_self(), m_pid, &task);
+ task_read_t task;
+ task_for_pid(mach_task_self(), m_pid, &task);
- uint32_t brk_inst = 0xD43E0000;
+ uint32_t brk_inst = 0xD43E0000;
- mach_vm_protect(task, (mach_vm_address_t)addr, sizeof(uint32_t), false, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE);
- mach_vm_write(task, (mach_vm_address_t)addr, (vm_offset_t)&brk_inst, sizeof(addr));
+ mach_vm_protect(task, (mach_vm_address_t) addr, sizeof(uint32_t), false,
+ VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE);
+ mach_vm_write(task, (mach_vm_address_t) addr, (vm_offset_t) &brk_inst, sizeof(addr));
- return true;
- }
+ return true;
+ }
- return false;
- }
+ return false;
+ }
- BOOL Break() noexcept override
- {
- task_read_t task;
- task_for_pid(mach_task_self(), m_pid, &task);
+ BOOL Break() noexcept override {
+ task_read_t task;
+ task_for_pid(mach_task_self(), m_pid, &task);
- kern_return_t ret = task_suspend(task);
+ kern_return_t ret = task_suspend(task);
- return ret == KERN_SUCCESS;
- }
+ return ret == KERN_SUCCESS;
+ }
- BOOL Continue() noexcept override
- {
- task_read_t task;
- task_for_pid(mach_task_self(), m_pid, &task);
+ BOOL Continue() noexcept override {
+ task_read_t task;
+ task_for_pid(mach_task_self(), m_pid, &task);
- kern_return_t ret = task_resume(task);
+ kern_return_t ret = task_resume(task);
- return ret == KERN_SUCCESS;
- }
+ return ret == KERN_SUCCESS;
+ }
- BOOL Detach() noexcept override
- {
- this->Continue();
+ BOOL Detach() noexcept override {
+ this->Continue();
- task_read_t task;
- task_for_pid(mach_task_self(), m_pid, &task);
+ task_read_t task;
+ task_for_pid(mach_task_self(), m_pid, &task);
- kern_return_t kr = mach_port_deallocate(mach_task_self(), task);
+ kern_return_t kr = mach_port_deallocate(mach_task_self(), task);
- return kr = KERN_SUCCESS;
- }
+ return kr = KERN_SUCCESS;
+ }
- private:
- ProcessID m_pid{0};
- std::string m_path;
- };
-} // namespace LibDebugger::POSIX
+ private:
+ ProcessID m_pid{0};
+ std::string m_path;
+};
+} // namespace LibDebugger::POSIX
#endif