<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Projects on shonk.sh</title>
    <link>https://www.shonk.sh/projects/</link>
    <description>Recent content in Projects on shonk.sh</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language><atom:link href="https://www.shonk.sh/projects/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>memshonk</title>
      <link>https://www.shonk.sh/projects/memshonk/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.shonk.sh/projects/memshonk/</guid>
      
      <description>&lt;img class=&#34;project-art&#34;
       src=&#34;https://www.shonk.sh/img/projects/memshonk_hu_7bbaa5e31551c271.webp&#34;
       width=&#34;900&#34; height=&#34;421&#34;
       loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
&lt;p&gt;memshonk is an experimental command-line debugger companion that tries to fill
the functionality gaps between debuggers. Think of it as a cross between &lt;code&gt;gdb&lt;/code&gt;,
&lt;code&gt;rizin&lt;/code&gt;, and Cheat Engine. It is not meant to replace a debugger, but to sit
alongside one.&lt;/p&gt;
&lt;p&gt;memshonk is in early development. There are bugs and missing functionality.&lt;/p&gt;
&lt;h2 id=&#34;inspiration&#34;&gt;Inspiration&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;The gap you kept running into: what your debugger couldn&amp;rsquo;t do that sent you
reaching for a second tool.&lt;/em&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>oki</title>
      <link>https://www.shonk.sh/projects/oki/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.shonk.sh/projects/oki/</guid>
      
      <description>&lt;img class=&#34;project-art&#34;
       src=&#34;https://www.shonk.sh/img/projects/oki_hu_9379ca44d82b1b6e.webp&#34;
       width=&#34;900&#34; height=&#34;444&#34;
       loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
&lt;p&gt;oki applies &lt;code&gt;pledge(2)&lt;/code&gt; and &lt;code&gt;unveil(2)&lt;/code&gt; restrictions to a target program on
OpenBSD, reducing the blast radius of a security vulnerability in that program.&lt;/p&gt;
&lt;h2 id=&#34;inspiration&#34;&gt;Inspiration&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Why you built oki: the program you wanted to contain, and what made wrapping
pledge and unveil from the outside the right approach.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;Calling pledge on a program restricts the set of system calls it is allowed to
make. Each set of permitted calls is a &lt;em&gt;promise&lt;/em&gt;, and promises can be combined.
If the program makes a call outside its promises, the kernel terminates it
immediately and delivers a core file if it can.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>blaj</title>
      <link>https://www.shonk.sh/projects/blaj/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.shonk.sh/projects/blaj/</guid>
      
      <description>&lt;img class=&#34;project-art&#34;
       src=&#34;https://www.shonk.sh/img/projects/blaj_hu_9e19d27a7e543a7c.webp&#34;
       width=&#34;900&#34; height=&#34;417&#34;
       loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
&lt;p&gt;blaj is a tool for creating a programmable trainer for speedrunning games. It
saves and restores chunks of a game&amp;rsquo;s memory on a keypress, and can write data
to a designated memory location the same way.&lt;/p&gt;
&lt;h2 id=&#34;inspiration&#34;&gt;Inspiration&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Why you built blaj: the practice loop that was too slow, the skip you kept
having to reset the whole level to attempt.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;Once a useful piece of game state is located with a memory scanner like
&lt;a href=&#34;https://www.cheatengine.org/&#34;&gt;Cheat Engine&lt;/a&gt;, blaj can save that region and
restore it later, teleporting the player back to a particular spot, for
example. That turns &amp;ldquo;reset and replay the level&amp;rdquo; into a single keypress, so
a skip can be drilled consistently instead of once every few minutes.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>example-memp-loader</title>
      <link>https://www.shonk.sh/projects/example-memp-loader/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.shonk.sh/projects/example-memp-loader/</guid>
      
      <description>&lt;img class=&#34;project-art&#34;
       src=&#34;https://www.shonk.sh/img/projects/example-memp-loader_hu_7246923f1a1d1525.webp&#34;
       width=&#34;900&#34; height=&#34;417&#34;
       loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
&lt;p&gt;memp loader (&lt;strong&gt;me&lt;/strong&gt;dge &lt;strong&gt;mu&lt;/strong&gt;ltiplayer loader) is a DLL written in Rust that
loads the &lt;a href=&#34;https://github.com/LucasOe/mmultiplayer&#34;&gt;Mirror&amp;rsquo;s Edge multiplayer mod&lt;/a&gt;
into the game at startup.&lt;/p&gt;
&lt;h2 id=&#34;inspiration&#34;&gt;Inspiration&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Why a loader was needed: what wasn&amp;rsquo;t working about getting the mod into the
game the usual way.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;The loader gets into the game through phantom DLL hijacking. Mirror&amp;rsquo;s Edge tries
to load &lt;code&gt;AgPerfMon.dll&lt;/code&gt;, a DLL that isn&amp;rsquo;t actually present on the system. Because
nothing satisfies that name, a DLL placed in the search order under it gets
loaded instead, so this project builds itself as &lt;code&gt;AgPerfMon.dll&lt;/code&gt; and the game
loads it without being asked to.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>steps-boi</title>
      <link>https://www.shonk.sh/projects/steps-boi/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.shonk.sh/projects/steps-boi/</guid>
      
      <description>&lt;img class=&#34;project-art&#34;
       src=&#34;https://www.shonk.sh/img/projects/steps-boi_hu_bbb0d74a45b1f2d1.webp&#34;
       width=&#34;900&#34; height=&#34;417&#34;
       loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
&lt;p&gt;steps boi is a Discord bot that sums the steps logged by a community in a
Discord channel.&lt;/p&gt;
&lt;h2 id=&#34;inspiration&#34;&gt;Inspiration&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;The step challenge this was built for, and why a bot beat a spreadsheet.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;Someone posts their steps as a message:&lt;/p&gt;
&lt;div class=&#34;codeblock&#34;&gt;
    &lt;div class=&#34;code-body&#34;&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;!steps 12234&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Reacting to that message with a 👍 counts it, and the bot prints an updated
progress bar as steps accumulate. Submissions above a threshold, 5,000 steps
for example, earn a star.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>wgui</title>
      <link>https://www.shonk.sh/projects/wgui/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.shonk.sh/projects/wgui/</guid>
      
      <description>&lt;img class=&#34;project-art&#34;
       src=&#34;https://www.shonk.sh/img/projects/wgui_hu_859befea1238a907.webp&#34;
       width=&#34;900&#34; height=&#34;441&#34;
       loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
&lt;p&gt;wgui is a simple graphical user interface for
&lt;a href=&#34;https://github.com/stephen-fox/wgu&#34;&gt;wgu&lt;/a&gt; that helps you manage and control
WireGuard VPN tunnels.&lt;/p&gt;
&lt;h2 id=&#34;inspiration&#34;&gt;Inspiration&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Why you built wgui: what editing wgu configurations by hand was like, and the
point at which it wanted a window of its own.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;wgu creates WireGuard tunnels without needing superuser privileges. wgui puts a
window in front of it, so tunnels can be created, saved, edited, and switched
between without hand-editing configuration files or remembering command lines.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>rizin-tools</title>
      <link>https://www.shonk.sh/projects/rizin-tools/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.shonk.sh/projects/rizin-tools/</guid>
      
      <description>&lt;img class=&#34;project-art&#34;
       src=&#34;https://www.shonk.sh/img/projects/rizin-tools_hu_5b776bf95819142b.webp&#34;
       width=&#34;900&#34; height=&#34;417&#34;
       loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
&lt;p&gt;A collection of tools for working with the &lt;a href=&#34;https://rizin.re/&#34;&gt;rizin&lt;/a&gt;
disassembler and debugger. Each tool lives in its own directory with its own
README.&lt;/p&gt;
&lt;h2 id=&#34;my-contributions&#34;&gt;My contributions&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Which tools you worked on and what you added. This repo is
&lt;a href=&#34;https://github.com/stephen-fox/rizin-tools&#34;&gt;stephen-fox&amp;rsquo;s&lt;/a&gt;, so this section is
the one worth writing first.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;the-tools&#34;&gt;The tools&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;library-exports&lt;/strong&gt;: generates a list of a library&amp;rsquo;s exported symbols and
their signatures. Useful for developing a proxy library.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;rz-ctx&lt;/strong&gt;: an experimental utility that captures rizin&amp;rsquo;s analysis in JSON
objects with documented schemas, so analysis data can be committed to source
control and consumed by other tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;rz-mcp&lt;/strong&gt;: an experimental MCP server for use with AI tools. Must be
sandboxed, since code injection is possible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;rz-paths&lt;/strong&gt;: finds code paths between a child symbol and a parent symbol
using rizin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vstack&lt;/strong&gt;: visualizes the stack variables of a function based on rizin&amp;rsquo;s
&lt;code&gt;afi&lt;/code&gt; output. 64-bit programs only.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-i-learned&#34;&gt;What I learned&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;What working on rizin&amp;rsquo;s output taught you about static analysis, or about
building tooling on top of someone else&amp;rsquo;s analysis engine.&lt;/em&gt;&lt;/p&gt;</description>
      
    </item>
    
  </channel>
</rss>
