Skip to main content
Glama
FunctionNavigator.java4.22 kB
package com.ghidramcp.services; import ghidra.app.services.CodeViewerService; import ghidra.app.services.ProgramManager; import ghidra.framework.plugintool.PluginTool; import ghidra.program.model.address.Address; import ghidra.program.model.listing.Function; import ghidra.program.model.listing.Program; import ghidra.program.util.ProgramLocation; /** * Service for navigating and querying function information in Ghidra programs */ public class FunctionNavigator { private final PluginTool tool; public FunctionNavigator(PluginTool tool) { this.tool = tool; } /** * Get function information by address * @param addressStr Address as string * @return Function information or error message */ public String getFunctionByAddress(String addressStr) { Program program = getCurrentProgram(); if (program == null) return "No program loaded"; if (addressStr == null || addressStr.isEmpty()) return "Address is required"; try { Address addr = program.getAddressFactory().getAddress(addressStr); Function func = program.getFunctionManager().getFunctionAt(addr); if (func == null) return "No function found at address " + addressStr; return String.format("Function: %s at %s\nSignature: %s\nEntry: %s\nBody: %s - %s", func.getName(), func.getEntryPoint(), func.getSignature(), func.getEntryPoint(), func.getBody().getMinAddress(), func.getBody().getMaxAddress()); } catch (Exception e) { return "Error getting function: " + e.getMessage(); } } /** * Get the current address from the code viewer * @return Current address as string */ public String getCurrentAddress() { CodeViewerService service = tool.getService(CodeViewerService.class); if (service == null) return "Code viewer service not available"; ProgramLocation location = service.getCurrentLocation(); return (location != null) ? location.getAddress().toString() : "No current location"; } /** * Get the current function from the code viewer * @return Current function information or error message */ public String getCurrentFunction() { CodeViewerService service = tool.getService(CodeViewerService.class); if (service == null) return "Code viewer service not available"; ProgramLocation location = service.getCurrentLocation(); if (location == null) return "No current location"; Program program = getCurrentProgram(); if (program == null) return "No program loaded"; Function func = program.getFunctionManager().getFunctionContaining(location.getAddress()); if (func == null) return "No function at current location: " + location.getAddress(); return String.format("Function: %s at %s\nSignature: %s", func.getName(), func.getEntryPoint(), func.getSignature()); } /** * Get function at or containing an address * @param program The program to search in * @param addr The address to search * @return Function at or containing the address, or null */ public Function getFunctionForAddress(Program program, Address addr) { Function func = program.getFunctionManager().getFunctionAt(addr); if (func == null) { func = program.getFunctionManager().getFunctionContaining(addr); } return func; } /** * Convert a long address to an Address object * @param address Address as long * @return Address object */ public Address getAddressFromLong(long address) { Program program = getCurrentProgram(); String hexAddr = Long.toHexString(address); return program.getAddressFactory().getAddress(hexAddr); } /** * Get the currently active program * @return Current program or null */ public Program getCurrentProgram() { ProgramManager pm = tool.getService(ProgramManager.class); return pm != null ? pm.getCurrentProgram() : null; } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/HK47196/GhidraMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server