Skip to content

Analysis: Experimental Switch Recovery - #598

Draft
gompoc wants to merge 1 commit into
SamboyCoding:developmentfrom
gompoc:gompoc-switch.0
Draft

Analysis: Experimental Switch Recovery#598
gompoc wants to merge 1 commit into
SamboyCoding:developmentfrom
gompoc:gompoc-switch.0

Conversation

@gompoc

@gompoc gompoc commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Experimental jump table recovery. Not ready for merge quite yet.
Currently it only detects and recovers x86 msvc style cases.

TODO list:

  • Clean things up
  • Arm64 support
  • Make it more robust, there are edge cases it won't catch
  • Tests

Example:

private static void LongSwitch(int option)
{
	Console.WriteLine("Invalid instruction: 135 Invalid \"Jump target not found in method: 0x1803A0B91\"");
}
private static void LongSwitch(int option)
{
	//IL_0414: Expected O, but got I4
	//IL_00d6: Expected I4, but got O
	object obj = option - 1;
	if ((nint)obj <= 49)
	{
		switch ((int)obj)
		{
		default:
			Console.WriteLine("Case 1 selected");
			break;
		case 1:
			Console.WriteLine("Case 2 selected");
			break;
		case 2:
			Console.WriteLine("Case 3 selected");
			break;
		case 3:
			Console.WriteLine("Case 4 selected");
			break;
		case 4:
			Console.WriteLine("Case 5 selected");
			break;
		case 5:
			Console.WriteLine("Case 6 selected");
			break;
		case 6:
			Console.WriteLine("Case 7 selected");
			break;
		case 7:
			Console.WriteLine("Case 8 selected");
			break;
		case 8:
			Console.WriteLine("Case 9 selected");
			break;
		case 9:
			Console.WriteLine("Case 10 selected");
			break;
		case 10:
			Console.WriteLine("Case 11 selected");
			break;
		case 11:
			Console.WriteLine("Case 12 selected");
			break;
		case 12:
			Console.WriteLine("Case 13 selected");
			break;
		case 13:
			Console.WriteLine("Case 14 selected");
			break;
		case 14:
			Console.WriteLine("Case 15 selected");
			break;
		case 15:
			Console.WriteLine("Case 16 selected");
			break;
		case 16:
			Console.WriteLine("Case 17 selected");
			break;
		case 17:
			Console.WriteLine("Case 18 selected");
			break;
		case 18:
			Console.WriteLine("Case 19 selected");
			break;
		case 19:
			Console.WriteLine("Case 20 selected");
			break;
		case 20:
			Console.WriteLine("Case 21 selected");
			break;
		case 21:
			Console.WriteLine("Case 22 selected");
			break;
		case 22:
			Console.WriteLine("Case 23 selected");
			break;
		case 23:
			Console.WriteLine("Case 24 selected");
			break;
		case 24:
			Console.WriteLine("Case 25 selected");
			break;
		case 25:
			Console.WriteLine("Case 26 selected");
			break;
		case 26:
			Console.WriteLine("Case 27 selected");
			break;
		case 27:
			Console.WriteLine("Case 28 selected");
			break;
		case 28:
			Console.WriteLine("Case 29 selected");
			break;
		case 29:
			Console.WriteLine("Case 30 selected");
			break;
		case 30:
			Console.WriteLine("Case 31 selected");
			break;
		case 31:
			Console.WriteLine("Case 32 selected");
			break;
		case 32:
			Console.WriteLine("Case 33 selected");
			break;
		case 33:
			Console.WriteLine("Case 34 selected");
			break;
		case 34:
			Console.WriteLine("Case 35 selected");
			break;
		case 35:
			Console.WriteLine("Case 36 selected");
			break;
		case 36:
			Console.WriteLine("Case 37 selected");
			break;
		case 37:
			Console.WriteLine("Case 38 selected");
			break;
		case 38:
			Console.WriteLine("Case 39 selected");
			break;
		case 39:
			Console.WriteLine("Case 40 selected");
			break;
		case 40:
			Console.WriteLine("Case 41 selected");
			break;
		case 41:
			Console.WriteLine("Case 42 selected");
			break;
		case 42:
			Console.WriteLine("Case 43 selected");
			break;
		case 43:
			Console.WriteLine("Case 44 selected");
			break;
		case 44:
			Console.WriteLine("Case 45 selected");
			break;
		case 45:
			Console.WriteLine("Case 46 selected");
			break;
		case 46:
			Console.WriteLine("Case 47 selected");
			break;
		case 47:
			Console.WriteLine("Case 48 selected");
			break;
		case 48:
			Console.WriteLine("Case 49 selected");
			break;
		case 49:
			Console.WriteLine("Case 50 selected");
			break;
		}
	}
	else
	{
		Console.WriteLine("Invalid option");
	}
}

@gompoc
gompoc marked this pull request as draft August 8, 2026 10:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant