如何在我自己的 class 中使用由 ConfuserEx 混淆的 GetMethod?

How to use GetMethod in my own class obfuscated by ConfuserEx?

我有自己的 DLL,我使用 ConfuserEx 保护它。 在 ConfuserEx 中,我使用 "rename" 保护:

<protection id="rename">
    <argument name="mode" value="unicode" />
    <argument name="renEnum" value="true" />        
</protection>    

这当然可以保护 DLL 不被查看代码,但是我的 class(我已将其作为 DLL 的一部分保护)使用:

MethodInfo mi = typeof(MyClass).GetMethod(nameof(MyStaticMethod), BindingFlags.Static | BindingFlags.NonPublic);

问题就在这里开始了,因为连我自己的代码都找不到并使用我的(受ConfuserEx保护)方法。我使用 GetMethod 来调用:Delegate.CreateDelegate。我该怎么做才能解决这个问题?

我仍然不确定为什么你不能不经过反射就直接创建你需要的委托,但如果你真的需要 来获得 MethodInfo,尝试做这样的事情:

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        Thingy t = DoStuff;
        var mi = t.Method;
    }
    private delegate void Thingy(object sender, EventArgs e);
    private static void DoStuff(object sender, EventArgs e)
    {

    }
}

也就是说,使用您自己在本地定义的与其他委托定义相匹配的委托,直接在您的代码中创建它的一个实例,然后从该实例中提取 MethodInfo

此代码将使用方法标记来识别 DoStuff 而不是其名称,因此应该可以毫无问题地进行混淆。

我通过在 GetMethod 和目标方法之间应用额外的 "bridge delegate" 解决了这个问题。然后,我使用 BridgeDelegate.Method.Name 而不是 nameof (MyStaticMethod)。我检查并正常工作。

示例解决方案:

internal static class MyClass
{
    private delegate void ExecuteObfuscatedMethod(string value);
    private static ExecuteObfuscatedMethod Bridge; //This is my "bridge"

    internal static void CaptureExternalDelegate(object source)
    {
        //Using a "bridge" instead of the direct method name
        MethodInfo mi = typeof(MyClass).GetMethod(Bridge.Method.Name, BindingFlags.Static | BindingFlags.NonPublic);

        //Less interesting code
        PropertyInfo p = source.GetType().GetProperty("SomePrivateDelegate", BindingFlags.NonPublic | BindingFlags.Instance);
        Delegate del = Delegate.CreateDelegate(p.PropertyType, mi) as Delegate;
        Delegate original = p.GetValue(source) as Delegate;
        Delegate combined = Delegate.Combine(original, del);
        p.SetValue(property, combined);
    }

    static MyClass()
    {
        Bridge += MyStaticMethod;
    }

    //This is the method whose name can not be retrieved by nameof () after applying ConfuserEx
    private static void MyStaticMethod(string value)
    {
        //I am testing the method's name after calling it.
        var st = new StackTrace();
        var sf = st.GetFrame(0);
        var currentMethodName = sf.GetMethod();
        throw new Exception("The method name is: " + currentMethodName); //You can see that the method has evoked and you can even see its new name
    }
}