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();
}