您可以使用如下代码获取进程上加载的模块的内存基地址:
ProcessModuleCollection pc = Process.GetCurrentProcess().Modules;
foreach(ProcessModule pm in pc)
{
Console.WriteLine("The moduleName is " + pm.ModuleName);
Console.WriteLine("The " + pm.ModuleName + "'s base address is: " + pm.BaseAddress);
}
不幸的是,这不适用于我的场景。我正在做的是创建一个新的独立的AppDomain(称为Temporal)并使用它从磁盘加载程序集。然后,我只执行加载的程序集中包含的一些函数。这将是包含所有这些逻辑的类的代码:
public class Loader : MarshalByRefObject
{
object CallInternal(string dll, string method, string[] parameters)
{
byte[] buffer = File.ReadAllBytes(dll);
Assembly a = Assembly.Load(buffer);
Type[] types = a.GetTypes();
MethodInfo m = null;
Type myType = null;
foreach (var type in types)
{
m = type.GetMethod(method);
if (m != null)
{
myType = type;
break;
}
}
if (m != null && myType != null)
{
var myInstance = Activator.CreateInstance(myType);
return m.Invoke(myInstance, new object[] { parameters });
}
else
{
return null;
}
}
public static object Call(string dll, string method, params string[] parameters)
{
AppDomain dom = AppDomain.CreateDomain("Temporal");
Loader ld = (Loader)dom.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Loader).FullName);
object result = ld.CallInternal(dll, typename, method, parameters);
return result;
}
问题是,有没有办法在不执行某种内存扫描的情况下获取已加载程序集的内存基地址?您从
ProcessModuleCollection
获得的 Process.GetCurrentProcess().Modules
未显示 AppDomain Temporal
中加载的程序集。允许不安全和非托管代码。
我找到了一种使用 Module.m_pData 的方法
用法查看:Jitex/src/Jitex/Utils/ModuleHelper.cs at 89e3faa23b1a38933c46915c6ad5b1c6964824dd · Hitmasu/Jitex