2017-08-01 66 views
0

IM:執行外部代碼(與結構域)內使用該代碼從外部執行代碼

public class Launcher : MarshalByRefObject 
{ 
    public static void Start(byte[] Exe, string Checksum) 
    { 
     string[] args = { IP, id, Checksum }; 
     Console.WriteLine("::Invokeing with: " + IP + ", " + id + ", " + Checksum); 
     var ps = new PermissionSet(PermissionState.Unrestricted); 
     var setup = new AppDomainSetup(); 
     setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; 
     var ev = new Evidence(); 
     var appDomain = AppDomain.CreateDomain("Sandbox", 
      ev, 
      setup, 
      ps); 
     var program = (Launcher)appDomain.CreateInstanceAndUnwrap(
      typeof(Launcher).Assembly.FullName, 
      typeof(Launcher).FullName); 
     program.Execute(Exe, args); 
     AppDomain.Unload(appDomain); 
    } 

    public void Execute(byte[] bytes, object[] args) 
    { 
     var assembly = Assembly.Load(bytes); 
     var main = assembly.EntryPoint; 
     main.Invoke(null, new object[] { args }); 
    } 
} 

事情是,該即時通訊與該執行代碼,也使用此代碼然而即時得到此錯誤:

System.InvalidCastException: Kan transparentproxy niet converteren naar type Launcher. bij Embassy.Program.Launcher.Start(Byte[] Exe, String Checksum)

任何人都可以幫我, PS如果你不知道這個問題,那麼沒有任何不妥之處。

first excecuting works, second fails

回答

0

很顯然,如果你重寫功能,並把外部DLL是這樣的:

public class Launcher : MarshalByRefObject 
{ 
    public void Start(byte[] Exe, string[] args) 
    { 
     PermissionSet ps = new PermissionSet(PermissionState.Unrestricted); 
     AppDomainSetup setup = new AppDomainSetup(); 
     setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; 
     Evidence ev = new Evidence(); 
     AppDomain appDomain = AppDomain.CreateDomain("Sandbox", 
      ev, 
      setup, 
      ps); 
     Launcher program = (Launcher)appDomain.CreateInstanceAndUnwrap(
      typeof(Launcher).Assembly.FullName, 
      typeof(Launcher).FullName); 
     program.Execute(Exe, new object[] { args }); 
     AppDomain.Unload(appDomain); 
    } 
    public void Execute(byte[] bytes, object[] args) 
    { 
     Assembly assembly = Assembly.Load(bytes); 
     MethodInfo main = assembly.EntryPoint; 
     main.Invoke(null, args); 
    } 
} 

,並用新的發射器()調用它開始( '源',新的[] {「ARGS。 「});你會得到想要的結果。