DotNetDetour
DotNetDetour copied to clipboard
可以支持.net core吗
如题,需要在.net core中使用,可以发布.net core nuget包吗?
同问,作者好像不在了?没有见到关于项目的任何回复
ä¸åºæå¤åºè¯¥æ¯ä¸æ¯æçãæ ¹æ®ä»åºå¨ææçæµè¿ä¸ªæå¼å§ä¸º.Net Framewrok设计çãç¶èï¼å¨dotnet/runtimeä»åºä¸ï¼RuntimeMethodHandle.Value
对åºçMonoMethod*
+8åèå并ä¸æ¯å½æ°å
¥å£å°åã
å¦ææ³è¦æ¯æéè¦æ¹åç®æ å°åï¼è·åValuePtr(MonoMethod*)
åï¼lookup_method(MonoMethod*)
è½è·åå°JitInfo*
,èlookup_methodéè¦æ ¹æ®code hashæ¥è¡¨ãéæ¾çæ¯lookup_method并ä¸æ¯export function
see https://github.com/dotnet/runtime/blob/main/src/mono/mono/mini/mini-runtime.c#L1908 å ¥å£æ¥æ¾ä»£ç see https://github.com/dotnet/runtime/blob/8aea53e25f1e78bfbc31f91c6342177eb548eaa5/src/mono/mono/metadata/jit-info.h#L200 JitInfoç»æä½
好å¨åç°äºä¸ä¸ªmono_jit_info_table_find(MonoDomain*,void*)
æ¹æ³ï¼å¯ä»¥éè¿ftnptrè·åjitInfoã第ä¸ä¸ªåæ°æ¥æ¶MonoDomainï¼ç´æ¥ä½¿ç¨AppDomain.CurrentDomainè¯å®æ¯ä¸è¡çï¼éè¦æ¿å°åºå±å¯¹è±¡çå°åï¼è¿å°±éè¦å¦å¤ä¸ä¸ªmono_domain_get
å½æ°ã
æç»ç代ç å¦ä¸ï¼å¯ä¾åèï¼
// Unity ç¼è¾å¨ç¯å¢
[DllImport("mono-2.0-bdwgc", EntryPoint = "mono_jit_info_table_find", CharSet = CharSet.Unicode)]
extern static IntPtr FindJitInfo(IntPtr ptrDomain, IntPtr ptrFunc);
[DllImport("mono-2.0-bdwgc", EntryPoint = "mono_domain_get", CharSet = CharSet.Unicode)]
extern static IntPtr GetDomain();
static unsafe void SetFunctionPtr(MethodInfo mi,nint addr)
{
RuntimeHelpers.PrepareMethod(mi.MethodHandle);
var monoDomain = GetDomain();
var funcPtr = mi.MethodHandle.GetFunctionPointer();
var jitInfoPtr = (int*)FindJitInfo(monoDomain, funcPtr).ToPointer();
jitInfoPtr += IntPtr.Size / 4 * 2;
*(nint*)jitInfoPtr = addr; // overwrite me!
}
æµè¯ä»£ç ï¼
public static void Test1()
{
Debug.Log("Test1");
}
public static void Test2()
{
Debug.Log("Test2");
}
[InitializeOnLoadMethod]
static void HookMethods()
{
var mi1 = ((Action)Test1).Method;
var mi2 = ((Action)Test2).Method;
RuntimeHelpers.PrepareMethod(mi1.MethodHandle);
RuntimeHelpers.PrepareMethod(mi2.MethodHandle);
SetFunctionPtr(mi1, mi2.MethodHandle.GetFunctionPointer());
Test1(); // output: Test2
}
纯C#ç¯å¢åçï¼éè¦å¤æä¸è¿è¡æ¶ç±»åï¼å¦ææ¯monoæ.net coreï¼å°±æ§è¡æ¤é»è¾ãéè¦æ ¹æ®å®é æ åµä¿®æ¹å ¥å£ç¹ã
btw, 可以参考MonoHook的实现,不修改入口,直接修改originMethod jit code。也是一个可行的方法。