diff --git a/api/debuggerapi.h b/api/debuggerapi.h index 913d220a..fc23d425 100644 --- a/api/debuggerapi.h +++ b/api/debuggerapi.h @@ -628,6 +628,8 @@ namespace BinaryNinjaDebuggerAPI { std::vector GetProcessList(); + std::uint32_t GetActivePID(); + std::vector GetThreads(); DebugThread GetActiveThread(); void SetActiveThread(const DebugThread& thread); diff --git a/api/debuggercontroller.cpp b/api/debuggercontroller.cpp index beffb6d1..644565bf 100644 --- a/api/debuggercontroller.cpp +++ b/api/debuggercontroller.cpp @@ -164,6 +164,12 @@ std::vector DebuggerController::GetProcessList() } +std::uint32_t DebuggerController::GetActivePID() +{ + return BNDebuggerGetActivePID(m_object); +} + + std::vector DebuggerController::GetThreads() { size_t count; diff --git a/api/ffi.h b/api/ffi.h index 2b5a14c9..1f20dc86 100644 --- a/api/ffi.h +++ b/api/ffi.h @@ -474,6 +474,8 @@ extern "C" DEBUGGER_FFI_API BNDebugProcess* BNDebuggerGetProcessList(BNDebuggerController* controller, size_t* count); DEBUGGER_FFI_API void BNDebuggerFreeProcessList(BNDebugProcess* processes, size_t count); + DEBUGGER_FFI_API uint32_t BNDebuggerGetActivePID(BNDebuggerController* controller); + DEBUGGER_FFI_API BNDebugThread* BNDebuggerGetThreads(BNDebuggerController* controller, size_t* count); DEBUGGER_FFI_API void BNDebuggerFreeThreads(BNDebugThread* threads, size_t count); diff --git a/api/python/debuggercontroller.py b/api/python/debuggercontroller.py index 75d9d28c..7058144b 100644 --- a/api/python/debuggercontroller.py +++ b/api/python/debuggercontroller.py @@ -1794,6 +1794,17 @@ def pid_attach(self) -> int: def pid_attach(self, pid: int) -> None: dbgcore.BNDebuggerSetPIDAttach(self.handle, pid) + @property + def active_pid(self) -> int: + """ + The PID of the process currently being debugged. (read-only) + + This returns the PID of the currently attached or running process. + + :return: the PID of the active process, or 0 if no process is active or the PID is unavailable + """ + return dbgcore.BNDebuggerGetActivePID(self.handle) + @property def executable_path(self) -> str: """ diff --git a/core/adapters/corelliumadapter.cpp b/core/adapters/corelliumadapter.cpp index 7dff36aa..5d7f0b65 100644 --- a/core/adapters/corelliumadapter.cpp +++ b/core/adapters/corelliumadapter.cpp @@ -227,6 +227,7 @@ bool CorelliumAdapter::Connect(const std::string& server, std::uint32_t port) const auto reply = this->m_rspConnector->TransmitAndReceive(RspData("?")); auto map = RspConnector::PacketToUnorderedMap(reply); this->m_lastActiveThreadId = map["thread"]; + this->m_processPid = map["thread"]; m_isTargetRunning = false; Ref settings = Settings::Instance(); @@ -1030,6 +1031,12 @@ std::vector CorelliumAdapter::GetProcessList() } +std::uint32_t CorelliumAdapter::GetActivePID() +{ + return m_processPid; +} + + bool CorelliumAdapter::SuspendThread(std::uint32_t tid) { return false; diff --git a/core/adapters/corelliumadapter.h b/core/adapters/corelliumadapter.h index 805b8783..5d6e2b8b 100644 --- a/core/adapters/corelliumadapter.h +++ b/core/adapters/corelliumadapter.h @@ -48,6 +48,7 @@ namespace BinaryNinjaDebugger std::vector m_debugBreakpoints{}; std::uint32_t m_lastActiveThreadId{}; + std::uint32_t m_processPid{}; uint8_t m_exitCode{}; std::string GetGDBServerPath(); @@ -120,6 +121,7 @@ namespace BinaryNinjaDebugger std::string InvokeBackendCommand(const std::string& command) override; std::string RunMonitorCommand(const std::string& command); uint64_t GetInstructionOffset() override; + std::uint32_t GetActivePID() override; DebugStopReason ResponseHandler(); diff --git a/core/adapters/dbgengadapter.cpp b/core/adapters/dbgengadapter.cpp index f58635f9..e31fbbb6 100644 --- a/core/adapters/dbgengadapter.cpp +++ b/core/adapters/dbgengadapter.cpp @@ -1506,6 +1506,20 @@ uint64_t DbgEngAdapter::GetStackPointer() return stackPointer; } + +std::uint32_t DbgEngAdapter::GetActivePID() +{ + if (!m_debugSystemObjects) + return 0; + + ULONG pid {}; + if (m_debugSystemObjects->GetCurrentProcessSystemId(&pid) != S_OK) + return 0; + + return pid; +} + + unsigned long DbgEngEventCallbacks::AddRef() { return 1; diff --git a/core/adapters/dbgengadapter.h b/core/adapters/dbgengadapter.h index 6e7f1eaf..88b4fd24 100644 --- a/core/adapters/dbgengadapter.h +++ b/core/adapters/dbgengadapter.h @@ -228,6 +228,7 @@ namespace BinaryNinjaDebugger { std::string InvokeBackendCommand(const std::string& command) override; uint64_t GetInstructionOffset() override; uint64_t GetStackPointer() override; + std::uint32_t GetActivePID() override; bool SupportFeature(DebugAdapterCapacity feature) override; diff --git a/core/adapters/esrevenadapter.cpp b/core/adapters/esrevenadapter.cpp index 5b5cd7de..b1500fb1 100644 --- a/core/adapters/esrevenadapter.cpp +++ b/core/adapters/esrevenadapter.cpp @@ -259,6 +259,7 @@ bool EsrevenAdapter::Connect(const std::string& server, std::uint32_t port) const auto reply = this->m_rspConnector->TransmitAndReceive(RspData("?")); auto map = RspConnector::PacketToUnorderedMap(reply); this->m_lastActiveThreadId = map["thread"]; + this->m_processPid = map["thread"]; m_isTargetRunning = false; if (Settings::Instance()->Get("debugger.stopAtEntryPoint") && m_hasEntryFunction) @@ -1199,6 +1200,13 @@ uint64_t EsrevenAdapter::GetStackPointer() return value; } + +std::uint32_t EsrevenAdapter::GetActivePID() +{ + return m_processPid; +} + + DebugStopReason EsrevenAdapter::StopReason() { return this->m_lastStopReason; diff --git a/core/adapters/esrevenadapter.h b/core/adapters/esrevenadapter.h index d2f10845..04a5d314 100644 --- a/core/adapters/esrevenadapter.h +++ b/core/adapters/esrevenadapter.h @@ -61,6 +61,7 @@ namespace BinaryNinjaDebugger std::optional> m_moduleCache{}; std::uint32_t m_lastActiveThreadId{}; + std::uint32_t m_processPid{}; uint8_t m_exitCode{}; std::string GetGDBServerPath(); @@ -145,6 +146,7 @@ namespace BinaryNinjaDebugger std::string RunMonitorCommand(const std::string& command); uint64_t GetInstructionOffset() override; uint64_t GetStackPointer() override; + std::uint32_t GetActivePID() override; DebugStopReason ResponseHandler(bool notifyStopped = true); diff --git a/core/adapters/gdbadapter.cpp b/core/adapters/gdbadapter.cpp index 63fc57ef..3fa95316 100644 --- a/core/adapters/gdbadapter.cpp +++ b/core/adapters/gdbadapter.cpp @@ -259,6 +259,7 @@ bool GdbAdapter::Connect(const std::string& server, std::uint32_t port) const auto reply = this->m_rspConnector->TransmitAndReceive(RspData("?")); auto map = RspConnector::PacketToUnorderedMap(reply); this->m_lastActiveThreadId = map["thread"]; + this->m_processPid = map["thread"]; m_isTargetRunning = false; if (Settings::Instance()->Get("debugger.stopAtEntryPoint") && m_hasEntryFunction) @@ -1247,6 +1248,13 @@ uint64_t GdbAdapter::GetStackPointer() return value; } + +std::uint32_t GdbAdapter::GetActivePID() +{ + return m_processPid; +} + + DebugStopReason GdbAdapter::StopReason() { return this->m_lastStopReason; diff --git a/core/adapters/gdbadapter.h b/core/adapters/gdbadapter.h index ebcd2e0f..ed25167a 100644 --- a/core/adapters/gdbadapter.h +++ b/core/adapters/gdbadapter.h @@ -61,6 +61,7 @@ namespace BinaryNinjaDebugger std::optional> m_moduleCache{}; std::uint32_t m_lastActiveThreadId{}; + std::uint32_t m_processPid{}; uint8_t m_exitCode{}; std::string GetGDBServerPath(); @@ -145,6 +146,7 @@ namespace BinaryNinjaDebugger std::string RunMonitorCommand(const std::string& command); uint64_t GetInstructionOffset() override; uint64_t GetStackPointer() override; + std::uint32_t GetActivePID() override; DebugStopReason ResponseHandler(bool notifyStopped = true); diff --git a/core/adapters/lldbadapter.cpp b/core/adapters/lldbadapter.cpp index a2b79dfb..16336414 100644 --- a/core/adapters/lldbadapter.cpp +++ b/core/adapters/lldbadapter.cpp @@ -752,6 +752,15 @@ std::vector LldbAdapter::GetProcessList() } +std::uint32_t LldbAdapter::GetActivePID() +{ + if (!m_process.IsValid()) + return 0; + + return m_process.GetProcessID(); +} + + std::vector LldbAdapter::GetThreadList() { size_t threadCount = m_process.GetNumThreads(); diff --git a/core/adapters/lldbadapter.h b/core/adapters/lldbadapter.h index e1f42984..b974cf57 100644 --- a/core/adapters/lldbadapter.h +++ b/core/adapters/lldbadapter.h @@ -68,6 +68,8 @@ namespace BinaryNinjaDebugger { std::vector GetProcessList() override; + std::uint32_t GetActivePID() override; + std::vector GetThreadList() override; DebugThread GetActiveThread() const override; diff --git a/core/adapters/lldbcoredumpadapter.cpp b/core/adapters/lldbcoredumpadapter.cpp index 589ef382..2c37e409 100644 --- a/core/adapters/lldbcoredumpadapter.cpp +++ b/core/adapters/lldbcoredumpadapter.cpp @@ -1236,3 +1236,12 @@ void LldbCoreDumpAdapter::GenerateDefaultAdapterSettings(BinaryView* data) if (scope != SettingsResourceScope) adapterSettings->Set("common.inputFile", data->GetFile()->GetOriginalFilename(), data, SettingsResourceScope); } + + +std::uint32_t LldbCoreDumpAdapter::GetActivePID() +{ + if (!m_process.IsValid()) + return 0; + + return m_process.GetProcessID(); +} diff --git a/core/adapters/lldbcoredumpadapter.h b/core/adapters/lldbcoredumpadapter.h index 109f3c80..1989c13a 100644 --- a/core/adapters/lldbcoredumpadapter.h +++ b/core/adapters/lldbcoredumpadapter.h @@ -117,6 +117,7 @@ namespace BinaryNinjaDebugger { uint64_t GetInstructionOffset() override; uint64_t GetStackPointer() override; + std::uint32_t GetActivePID() override; bool SupportFeature(DebugAdapterCapacity feature) override; diff --git a/core/debugadapter.h b/core/debugadapter.h index 5849d544..04055c21 100644 --- a/core/debugadapter.h +++ b/core/debugadapter.h @@ -238,6 +238,8 @@ namespace BinaryNinjaDebugger { virtual std::vector GetProcessList() = 0; + virtual std::uint32_t GetActivePID() = 0; + virtual std::vector GetThreadList() = 0; virtual DebugThread GetActiveThread() const = 0; diff --git a/core/debuggercontroller.cpp b/core/debuggercontroller.cpp index af1c6df7..6e74b663 100644 --- a/core/debuggercontroller.cpp +++ b/core/debuggercontroller.cpp @@ -2107,6 +2107,14 @@ uint32_t DebuggerController::GetExitCode() } +uint32_t DebuggerController::GetActivePID() +{ + if (!m_adapter) + return 0; + return m_adapter->GetActivePID(); +} + + void DebuggerController::WriteStdIn(const std::string message) { if (m_adapter && m_state->IsRunning()) diff --git a/core/debuggercontroller.h b/core/debuggercontroller.h index 0c67f025..d2b31867 100644 --- a/core/debuggercontroller.h +++ b/core/debuggercontroller.h @@ -339,6 +339,7 @@ namespace BinaryNinjaDebugger { DebuggerFileAccessor* GetMemoryAccessor() const { return m_accessor; } uint32_t GetExitCode(); + uint32_t GetActivePID(); void WriteStdIn(const std::string message); diff --git a/core/ffi.cpp b/core/ffi.cpp index 035db429..0b59285a 100644 --- a/core/ffi.cpp +++ b/core/ffi.cpp @@ -209,6 +209,12 @@ void BNDebuggerFreeProcessList(BNDebugProcess* processes, size_t count) } +uint32_t BNDebuggerGetActivePID(BNDebuggerController* controller) +{ + return controller->object->GetActivePID(); +} + + BNDebugThread* BNDebuggerGetThreads(BNDebuggerController* controller, size_t* size) { std::vector threads = controller->object->GetAllThreads();