Skip to content
This repository has been archived by the owner on Oct 16, 2024. It is now read-only.

Commit

Permalink
Hiding assemblies from IReflectionManager
Browse files Browse the repository at this point in the history
  • Loading branch information
misandrie committed May 28, 2024
1 parent ff13911 commit bdb49db
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 1 deletion.
3 changes: 2 additions & 1 deletion Marsey/Stealthsey/Hidesey.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ public static void Disperse()
/// </summary>
public static void PostLoad()
{
Veil.Patch();
HWID.Force();
DiscordRPC.Patch();

Expand Down Expand Up @@ -184,7 +185,7 @@ public static void HidePatch(Assembly marsey)
}

/// <summary>
/// Undermines system functions, hides what doesnt belong from view
/// Undermines system functions, hides what doesn't belong from view
/// </summary>
/// <exception cref="HideseyException">Thrown if ThrowOnFail is true and any of the patches fails to apply</exception>
private static void Perjurize()
Expand Down
58 changes: 58 additions & 0 deletions Marsey/Stealthsey/Veil.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
using System.Reflection;
using HarmonyLib;
using JetBrains.Annotations;
using Marsey.Handbreak;
using Marsey.Misc;

namespace Marsey.Stealthsey;

/// <summary>
/// Hide extra assemblies from IReflectionManager
/// </summary>
internal static class Veil
{
private static List<string?> HiddenAssemblies = [];

internal static void Patch()
{
Type? CRM = Helpers.TypeFromQualifiedName("Robust.Shared.Reflection.ReflectionManager");
if (CRM == null) return;

MarseyLogger.Log(MarseyLogger.LogType.DEBG, "Veil", "Patching.");

MethodInfo AsmGetter = AccessTools.PropertyGetter(CRM, "Assemblies");
MethodInfo Prefix = AccessTools.Method(typeof(Veil), "Prefix");
Manual.Patch(AsmGetter, Prefix, HarmonyPatchType.Prefix);
}

[UsedImplicitly]
private static bool Prefix(ref IReadOnlyList<Assembly> __result, object __instance)
{
List<Assembly>? originalAssemblies = Traverse.Create(__instance).Field("assemblies").GetValue<List<Assembly>>();
if (originalAssemblies == null)
{
__result = new List<Assembly>().AsReadOnly();
return false;
}

// Filter out assemblies whose names are in HiddenAssemblies
List<Assembly> veiledAssemblies = originalAssemblies
.Where(asm =>
{
string? value = asm.GetName().Name;
return value != null && !HiddenAssemblies.Contains(value);
})
.ToList();

MarseyLogger.Log(MarseyLogger.LogType.TRCE, "Veil", $"Hidden {HiddenAssemblies.Count} assemblies.");
// Return the filtered list as a read-only list
__result = veiledAssemblies.AsReadOnly();
return false;
}

public static void Hide(Assembly asm)
{
string? name = asm.GetName().Name;
if (name != null) HiddenAssemblies.Add(name);
}
}
3 changes: 3 additions & 0 deletions Marsey/Subversion/Subverse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ private static void Postfix(object __instance)
Assembly subverterAssembly = Assembly.LoadFrom(path);
MarseyLogger.Log(MarseyLogger.LogType.DEBG, "Subversion", $"Sideloading {path}");
AssemblyFieldHandler.InitLogger(subverterAssembly, subverterAssembly.FullName);

// Stealthsey methods
Veil.Hide(subverterAssembly);
Sedition.InitSedition(subverterAssembly, subverterAssembly.FullName);

loadGameAssemblyMethod.Invoke(__instance, new object[] { subverterAssembly });
Expand Down

0 comments on commit bdb49db

Please sign in to comment.