<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Ghidra on tsvinc</title>
		<link>https://tsvinc.dev/tags/ghidra/</link>
		<description>Recent content in Ghidra on tsvinc</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Mon, 26 Oct 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://tsvinc.dev/tags/ghidra/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>My guard read the tool&#39;s name, never its arguments</title>
				<link>https://tsvinc.dev/posts/guard-judged-tools-by-name/</link>
				<pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/guard-judged-tools-by-name/</guid>
				<description>&lt;p&gt;&lt;em&gt;Builds on &lt;a href=&#34;https://tsvinc.dev/posts/guard-missed-bash-lc/&#34;&gt;My guard blocked bash -c. Models write bash -lc.&lt;/a&gt;, which explains the guard and what it hard-denies.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Every rename asked. Every comment asked. Every retyped variable stopped the agent and waited for me to click, and the binary it was all about never changed once. That was my guard&#39;s Ghidra policy doing exactly what I had written.&lt;/p&gt;&#xA;&lt;p&gt;My agent-config templates give six terminal coding agents a Ghidra MCP server for reverse engineering, off by default and available on demand: pyghidra-mcp 0.2.7, GhidraMCP 2.0 or ReVa 7.3.1. The same guard that hard-denies destructive shell commands also decides about these tools, and its Ghidra policy was cautious: an allowlist of read verbs (&lt;code&gt;get_&lt;/code&gt;, &lt;code&gt;list_&lt;/code&gt;, &lt;code&gt;decompile_&lt;/code&gt; and a few more), a deny for deleting a binary, and a question for everything else.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The fix was in five agents. The sixth never called it.</title>
				<link>https://tsvinc.dev/posts/sixth-agent-never-called-the-guard/</link>
				<pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/sixth-agent-never-called-the-guard/</guid>
				<description>&lt;p&gt;&lt;em&gt;Follows &lt;a href=&#34;https://tsvinc.dev/posts/guard-judged-tools-by-name/&#34;&gt;My guard read the tool&#39;s name, never its arguments&lt;/a&gt;, which introduced the fix this post tests.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;The last post ended with a fix I was pleased with. My guard used to decide about Ghidra MCP tools by their name alone; now &lt;code&gt;ghidraCheck(rules, tool, input, cwd)&lt;/code&gt; runs the guard&#39;s read rules over every path-like argument first, so an agent that asks Ghidra to import &lt;code&gt;~/.ssh/id_ed25519&lt;/code&gt; into its project gets refused. Both guard implementations, TypeScript and Python, had cases for it. One agent, Claude Code, had been probed against a fake MCP server. The post said the pi and omp extensions, the OpenCode plugin and the Hermes and Claude Code hook &amp;quot;all go through it&amp;quot;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>HTC Desire Z GPS: the Ghidra fix that landed 235 km away</title>
				<link>https://tsvinc.dev/posts/60kb-gps-fix/</link>
				<pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/60kb-gps-fix/</guid>
				<description>&lt;p&gt;For one night, this looked like the best result of the whole project. My HTC Desire Z, the 2010 Android slider that by then had its camera button wired to a waypoint logger, had spent hours by a window failing to find itself. Then I opened its 60 KB GPS library in Ghidra, found a switch that throws away &amp;quot;intermediate&amp;quot; positions, turned the switch on and rebooted. Two seconds after I pressed the camera button, a coordinate landed in the waypoint file. Six decimal places. Accuracy: zero metres.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
