I have such piece of code:
namespace NetHacking
{
interface IPlugin
{
void Execute(PluginData data);
}
public class PluginData
{
private readonly string ConstString = "Const data";
public void Print()
{
Console.WriteLine(ConstString);
}
}
[StructLayout(LayoutKind.Explicit)]
class ExternalPlugin : IPlugin
{
internal class PluginHack
{
public string Text;
}
[FieldOffset(0)]
private PluginData _original;
[FieldOffset(0)]
private PluginHack _hack;
public void Execute(PluginData data)
{
_original = data;
_hack.Text = "Hacking .NET";
}
}
class Program
{
static void Main(string[] args)
{
try
{
var data = new PluginData();
var plugin = CreatePlugin();
plugin.Execute(data);
data.Print();
}
catch (Exception)
{
Console.WriteLine("Error!");
}
Console.WriteLine("End");
Console.Read();
}
private static IPlugin CreatePlugin()
{
return new ExternalPlugin();
}
}}
In the example above PluginData data contains readonly string ConstString string. In theory PluginData passed to Execute method in IPlugin should be used to initialize plugin. Unfortunately ExternalPlugin can overriding ConstString externally.
Is there a way to protect against that ?