Files
reverse-skills-max/our-skills/vibeproxy-reverse-engineering/SKILL.md

6.1 KiB

name, description
name description
vibeproxy-reverse-engineering Reverse engineer VibeProxy (WinUI 3 .NET 8 MSIX app) — ILSpy decompile, self-contained publish, MSIX repackage, and fork 9router backend

VibeProxy Reverse Engineering Pipeline

Target

VibeProxy = WinUI 3 / .NET 8 MSIX app (AtC.VibeProxy_3.7.2.0_x64__g8zz5t3ayajdt). Backend = VibeProxyServices.exe = pkg-compiled OmniRoute v3.8.50 (MIT). 9router = separate npm package (9router@0.5.50, MIT, github.com/decolua/9router).

Phase 1: Decompile C# (ILSpy)

# Locate MSIX install
$pkg = Get-AppxPackage -Name "AtC.VibeProxy"
$installDir = $pkg.InstallLocation  # C:\Program Files\WindowsApps\AtC.VibeProxy_3.7.2.0_x64__g8zz5t3ayajdt

# Decompile VibeProxy.dll with ILSpy CLI
ilspycmd -p --decompile-baml "$installDir\VibeProxy.dll" -o C:\Users\User\tmp\VibeProxy_src2\

Build fixes required

  • LangVersion=preview in csproj
  • HintPaths to libs/ directory (copy 244 DLLs from MSIX)
  • Fix CS0136 duplicate variables (rename upd → ins in SqliteStatsService.cs)
  • Fix inline literal FindOrRegisterForKey("VibeProxy_SingleInstance") → use const

Self-contained publish (NOT framework-dependent)

dotnet publish VibeProxy.csproj -c Release -r win-x64 --self-contained true

Original runtimeconfig uses includedFrameworks (self-contained). Rebuilt uses framework (FDD). Must publish self-contained or app crashes with "No frameworks were found".

Phase 2: MSIX Repackage

Staging (CRITICAL — never pack from output dir directly)

  1. Copy from bin\Release\net8.0\win-x64\publish\ (NOT bin\Release\net8.0\)
  2. Overlay original resources.pri, Assets/, Watchers/, Microsoft.UI.Xaml/, locale dirs, native WinUI DLLs
  3. EXCLUDE stale AppxSignature.p7x, AppxBlockMap.xml, AppxMetadata/CodeIntegrity.cat
  4. Write new AppxManifest.xml with bumped version and Publisher matching cert Subject exactly

Cert + Sign + Install

# Create self-signed cert
$cert = New-SelfSignedCertificate -Subject "CN=<ORIGINAL_PUBLISHER_CN>" -KeyUsage DigitalSignature -CertStoreLocation "Cert:\CurrentUser\My" -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3","2.5.29.19={text}")

# Add to Trusted Root + Trusted People (LocalMachine)
# Export PFX
# Pack
& makeappx pack /d $staging /p $msixPath /nv
# Sign
& signtool sign /fd SHA256 /a /f $certPath /p $password $msixPath
# Install
Add-AppxPackage -Path $msixPath

Launch via AppsFolder

Start-Process explorer.exe -ArgumentList 'shell:AppsFolder\<PackageFamilyName>!App'

Start-Process cannot launch shell:AppsFolder URIs directly — use explorer.exe.

Verification

  • Get-AppxPackage shows correct version + InstallLocation
  • Hash installed VibeProxy.dll == publish hash
  • Process alive ≥5s with growing RAM
  • MainWindowTitle = custom title (not "VibeProxy.exe")
  • UI Automation confirms text elements
  • Pixel sampling confirms color changes

CLEANUP (mandatory after install)

Remove self-signed cert from LocalMachine\Root, LocalMachine\TrustedPeople, CurrentUser\My. Delete PFX file. Trusted root + accessible private key = arbitrary code signing.

Phase 3: Design changes (code-behind only)

XAML is compiled to XBF v2.1 in resources.pri — NOT decompilable. Changes only via C# code-behind in MainWindow.cs constructor after InitializeComponent():

AppTitleTextBlock.Text = "VibeProxy [ENI]";
AppTitleTextBlock.Foreground = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 168, 85, 247));
NavView.Background = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 20, 15, 35));
ContentFrame.BorderBrush = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 168, 85, 247));
ContentFrame.BorderThickness = new Thickness(2);

Gotchas:

  • Color is ambiguous between System.Drawing.Color and Windows.UI.Color — qualify as Windows.UI.Color.FromArgb(...)
  • NavigationView.PaneBackground doesn't exist in WinUI 3 — use NavView.Background
  • Window.RequestedTheme not available in WinUI 3 — set on child elements
  • NavView.SelectedItem = NavView.MenuItems[0] MUST be preserved (don't accidentally replace with design code)

Phase 4: 9router fork (backend)

Clone real upstream (NOT npm pack)

git clone https://github.com/decolua/9router.git 9router_fork
cd 9router_fork
git checkout -b eni-custom

Build

npm install  # WITH devDependencies (next build needs them)
npx next build --webpack  # or: npm run build

Run dev (no build needed)

PORT=20130 API_KEY_SECRET=eni-test-key DATA_DIR=./data node node_modules/next/dist/bin/next dev --port 20130

API endpoints

  • /api/health → {"ok":true} (no auth)
  • /v1/models → 679 models (Bearer auth)
  • /api/v1/chat/completions → POST (needs configured providers in DB)
  • /api/monitoring/health → VibeProxy health check endpoint

API key generation

// Format: {prefix}-{machineId}-{keyId}-{crc8}
// prefix: "sk" (default) or "eni" (custom)
// CRC = HMAC-SHA256(API_KEY_SECRET, machineId + keyId).slice(0,8)

VibeProxy ↔ 9router integration

VibeProxy expects OmniRoute API (/api/monitoring/health, /api/providers/{id}/login, /api/oauth/). 9router has different API (/api/health, /api/v1/chat/completions). Direct swap of VibeProxyServices.exe with 9router won't work — API incompatible. VibeProxyServices.exe = pkg-compiled OmniRoute, NOT 9router. OmniRoute installs 9router as embedded service via npm install 9router.

Key paths

  • ILSpy output: C:\Users\User\tmp\VibeProxy_src2\
  • OmniRoute clone: C:\Users\User\Projects\OmniRoute_fork\ (v3.8.50, MIT)
  • 9router clone: C:\Users\User\Projects\9router_fork\ (v0.5.50, MIT)
  • MakeAppx: C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\makeappx.exe
  • Signtool: C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\signtool.exe

What's NOT recovered

  • XAML markup (24 XBF v2.1 files in resources.pri — format undocumented)
  • ILSpy artifacts (Unknown result type in 61+ files — WinRT projection IL)
  • Sourcemaps (production build, all empty)
  • VibeProxy-specific backend delta (diff between OmniRoute git and extracted dist not proven)