diff --git a/AssemblyData/AssemblyData.csproj b/AssemblyData/AssemblyData.csproj index 552ed0ef..f34df5c0 100644 --- a/AssemblyData/AssemblyData.csproj +++ b/AssemblyData/AssemblyData.csproj @@ -41,10 +41,13 @@ + + + diff --git a/AssemblyData/AssemblyService.cs b/AssemblyData/AssemblyService.cs index d272deeb..74798b51 100644 --- a/AssemblyData/AssemblyService.cs +++ b/AssemblyData/AssemblyService.cs @@ -35,6 +35,9 @@ namespace AssemblyData { case AssemblyServiceType.MethodDecrypter: return new MethodDecrypterService(); + case AssemblyServiceType.Generic: + return new GenericService(); + default: throw new ArgumentException("Invalid assembly service type"); } @@ -48,6 +51,9 @@ namespace AssemblyData { case AssemblyServiceType.MethodDecrypter: return typeof(MethodDecrypterService); + case AssemblyServiceType.Generic: + return typeof(GenericService); + default: throw new ArgumentException("Invalid assembly service type"); } @@ -56,7 +62,7 @@ namespace AssemblyData { public void DoNothing() { } - public void Exit() { + public virtual void Exit() { exitEvent.Set(); } diff --git a/AssemblyData/GenericService.cs b/AssemblyData/GenericService.cs new file mode 100644 index 00000000..16e8ad2e --- /dev/null +++ b/AssemblyData/GenericService.cs @@ -0,0 +1,69 @@ +/* + Copyright (C) 2011-2013 de4dot@gmail.com + + This file is part of de4dot. + + de4dot is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + de4dot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with de4dot. If not, see . +*/ + +using System; +using System.Reflection; + +namespace AssemblyData { + class GenericService : AssemblyService, IGenericService { + Assembly userServiceAssembly; + IUserGenericService userGenericService; + + public override void Exit() { + if (userGenericService != null) + userGenericService.Dispose(); + userGenericService = null; + base.Exit(); + } + + public void LoadUserService(string asmPath, Type createServiceType, object createMethodArgs) { + userServiceAssembly = Assembly.LoadFile(asmPath); + var createServiceMethod = GetCreateUserServiceMethod(createServiceType); + userGenericService = createServiceMethod.Invoke(null, null) as IUserGenericService; + if (userGenericService == null) + throw new ApplicationException("create-service-method failed to create user service"); + } + + MethodInfo GetCreateUserServiceMethod(Type createServiceType) { + if (createServiceType == null) + throw new ApplicationException(string.Format("Create-service-type is null")); + foreach (var method in createServiceType.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) { + if (method.GetCustomAttributes(typeof(CreateUserGenericServiceAttribute), false).Length > 0) + return method; + } + throw new ApplicationException(string.Format("Failed to find create-service-method. Type token: Type: {0}", createServiceType)); + } + + void CheckUserService() { + if (userGenericService == null) + throw new ApplicationException("LoadUserService() hasn't been called yet."); + } + + public void LoadAssembly(string filename) { + CheckUserService(); + LoadAssemblyInternal(filename); + userGenericService.AssemblyLoaded(assembly); + } + + public object SendMessage(int msg, object[] args) { + CheckUserService(); + return userGenericService.HandleMessage(msg, args); + } + } +} diff --git a/AssemblyData/IAssemblyService.cs b/AssemblyData/IAssemblyService.cs index 3a0dc700..b0e1da67 100644 --- a/AssemblyData/IAssemblyService.cs +++ b/AssemblyData/IAssemblyService.cs @@ -21,6 +21,7 @@ namespace AssemblyData { public enum AssemblyServiceType { StringDecrypter, MethodDecrypter, + Generic, } public interface IAssemblyService { diff --git a/AssemblyData/IGenericService.cs b/AssemblyData/IGenericService.cs new file mode 100644 index 00000000..017f9c28 --- /dev/null +++ b/AssemblyData/IGenericService.cs @@ -0,0 +1,31 @@ +/* + Copyright (C) 2011-2013 de4dot@gmail.com + + This file is part of de4dot. + + de4dot is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + de4dot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with de4dot. If not, see . +*/ + +using System; + +namespace AssemblyData { + public class CreateUserGenericServiceAttribute : Attribute { + } + + public interface IGenericService : IAssemblyService { + void LoadUserService(string asmPath, Type createServiceType, object createMethodArgs); + void LoadAssembly(string filename); + object SendMessage(int msg, object[] args); + } +} diff --git a/AssemblyData/IUserGenericService.cs b/AssemblyData/IUserGenericService.cs new file mode 100644 index 00000000..635ae7f6 --- /dev/null +++ b/AssemblyData/IUserGenericService.cs @@ -0,0 +1,28 @@ +/* + Copyright (C) 2011-2013 de4dot@gmail.com + + This file is part of de4dot. + + de4dot is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + de4dot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with de4dot. If not, see . +*/ + +using System; +using System.Reflection; + +namespace AssemblyData { + public interface IUserGenericService : IDisposable { + void AssemblyLoaded(Assembly assembly); + object HandleMessage(int msg, object[] args); + } +} diff --git a/de4dot.code/AssemblyClient/AssemblyClient.cs b/de4dot.code/AssemblyClient/AssemblyClient.cs index 1693a269..b6a01103 100644 --- a/de4dot.code/AssemblyClient/AssemblyClient.cs +++ b/de4dot.code/AssemblyClient/AssemblyClient.cs @@ -43,6 +43,10 @@ namespace de4dot.code.AssemblyClient { get { return (IMethodDecrypterService)service; } } + public IGenericService GenericService { + get { return (IGenericService)service; } + } + public AssemblyClient(IAssemblyServerLoader loader) { this.loader = loader; } diff --git a/de4dot.code/AssemblyClient/IAssemblyClient.cs b/de4dot.code/AssemblyClient/IAssemblyClient.cs index 8477806c..1b7a2547 100644 --- a/de4dot.code/AssemblyClient/IAssemblyClient.cs +++ b/de4dot.code/AssemblyClient/IAssemblyClient.cs @@ -25,6 +25,7 @@ namespace de4dot.code.AssemblyClient { IAssemblyService Service { get; } IStringDecrypterService StringDecrypterService { get; } IMethodDecrypterService MethodDecrypterService { get; } + IGenericService GenericService { get; } void Connect(); void WaitConnected(); }