Skip to main content
Glama
0xhackerfren

Frida Game Hacking MCP

by 0xhackerfren

hook_function

Intercept and modify game functions by attaching JavaScript handlers to specific memory addresses for debugging or behavior alteration.

Instructions

Hook a function at the specified address.

Args:
    address: Address to hook (hex string)
    on_enter: JavaScript code for onEnter (has access to 'args' array)
    on_leave: JavaScript code for onLeave (has access to 'retval')
    description: Optional description

Returns:
    Hook status.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
addressYes
on_enterNo
on_leaveNo
descriptionNo

Implementation Reference

  • Core implementation of the hook_function MCP tool. Attaches a Frida Interceptor to the target address, injecting custom JavaScript for onEnter/onLeave callbacks. Manages hook state in the global FridaSession.
    def hook_function(address: str, on_enter: str = "", on_leave: str = "",
                      description: str = "") -> Dict[str, Any]:
        """
        Hook a function at the specified address.
        
        Args:
            address: Address to hook (hex string)
            on_enter: JavaScript code for onEnter (has access to 'args' array)
            on_leave: JavaScript code for onLeave (has access to 'retval')
            description: Optional description
        
        Returns:
            Hook status.
        """
        global _session
        
        if not _session.is_attached():
            return {"error": "Not attached. Use attach() first."}
        
        if address in _session.hooks:
            return {"error": f"Hook exists at {address}. Use unhook_function() first."}
        
        try:
            addr = int(address, 16) if address.startswith("0x") else int(address)
            
            # Use empty statement if no code provided (comment would break JS syntax)
            on_enter_code = on_enter.strip() if on_enter else ""
            on_leave_code = on_leave.strip() if on_leave else ""
            
            script_code = f"""
            Interceptor.attach(ptr("{hex(addr)}"), {{
                onEnter: function(args) {{ {on_enter_code} }},
                onLeave: function(retval) {{ {on_leave_code} }}
            }});
            send("Hook installed");
            """
            
            def on_message(message, data):
                if message['type'] == 'error':
                    logger.error(f"Hook error: {message}")
            
            script = _session.session.create_script(script_code)
            script.on('message', on_message)
            script.load()
            
            _session.hooks[address] = HookInfo(
                address=address, script=script, hook_type="intercept",
                description=description or f"Hook at {address}"
            )
            
            return {"success": True, "address": address, "message": f"Hook installed at {address}"}
        
        except Exception as e:
            return {"error": f"Failed to install hook: {str(e)}"}
  • MCP tool registration via FastMCP decorator @mcp.tool(), which auto-generates schema from signature/docstring and registers the handler.
    @mcp.tool()
  • Dataclass used to store information about active hooks, referenced in the hook_function handler.
    class HookInfo:
        """Information about an active hook."""
        address: str
        script: Any
        hook_type: str
        description: str = ""
  • Global session manager that stores hooks dictionary used by hook_function.
    class FridaSession:
        """Manages Frida session state."""
        
        def __init__(self):
            self.device: Optional[Any] = None
            self.session: Optional[Any] = None
            self.pid: Optional[int] = None
            self.process_name: Optional[str] = None
            self.spawned: bool = False
            self.scan_state: ScanState = ScanState()
            self.hooks: Dict[str, HookInfo] = {}
            self.breakpoints: Dict[str, Any] = {}
            self.custom_scripts: Dict[str, Any] = {}
        
        def is_attached(self) -> bool:
            return self.session is not None and not self.session.is_detached
        
        def reset(self):
            self.session = None
            self.pid = None
            self.process_name = None
            self.spawned = False
            self.scan_state = ScanState()
            self.hooks.clear()
            self.breakpoints.clear()
            self.custom_scripts.clear()

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/0xhackerfren/frida-game-hacking-mcp'

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