【问题标题】:C# - How to use anonymous types with Dotfuscator.Net?C# - 如何在 Dotfuscator.Net 中使用匿名类型?
【发布时间】:2017-03-26 11:29:53
【问题描述】:

我的 C# 应用程序中有这段代码:

JObject personJson = JObject.FromObject(
    new
    {
        name = "John Doe",
        age = 34,
        height = 1.78,
        weight = 79.34
    });

Console.WriteLine(person);

它会记录:

{
    "name": "John Doe",
    "age": 34,
    "height": 1.78,
    "weight": 79.34
}

Dotfuscator 将其混淆为:

Console.WriteLine((object) JObject.FromObject((object) new global::b<string, int, double, double>("John Doe", 34, 1.78, 79.34)));

然后输出是这样的:

{}

如何在 Dotfuscator 中使用匿名类而不出现此问题?

编辑:

完整代码:

public static class Example
{
    static void LogPerson()
    {
        JObject personJson = JObject.FromObject(
            new
            {
                name = "John Doe",
                age = 34,
                height = 1.78,
                weight = 79.34
            });
        Console.WriteLine(JSONObject);
    }
}

【问题讨论】:

    标签: c# obfuscation dotfuscator


    【解决方案1】:

    看起来 Dotfuscator 正在删除属性,即使您不希望它这样做。 (这样做是因为它通常是无害的,而且它使逆向工程变得更加困难。)您应该能够通过配置与CompilerGeneratedAttribute 匹配的排除规则来排除这些属性的重命名,从而防止它们被删除。这将防止匿名类上的所有此类属性被删除。

    这是一个可以执行此操作的项目文件(段)示例:

    <excludelist>
      <type name=".*" regex="true" excludetype="false">
        <customattribute name=".*CompilerGeneratedAttribute" regex="true" />
        <propertymember name=".*" regex="true" />
      </type>
    </excludelist>
    

    您可以通过Community Edition docsPro docs 中的GUI 了解如何执行此操作。

    完全披露:我为 PreEmptive Solutions 工作。

    【讨论】:

    • 谢谢!但是你能给我一个更具体的例子吗?我对 Dotfuscator 没有太多经验。
    • 查看Community Edition docs 以找到正确的屏幕。在该屏幕上,点击“添加类型”以添加类型规则,然后将其命名为 .*。右键单击树中的类型,然后单击“添加自定义属性”。将其命名为 .*CompilerGeneratedAttribute。再次右键单击该类型并单击“添加属性”并将其命名为.*。保存并构建。
    【解决方案2】:

    我看到没有人回复你的帖子,所以我想我会回应一些想法。你可能已经知道这些事情了,所以我提前道歉。

    首先,我从混淆代码中看到,JObject.FromObject 返回的对象被转换为object 类型。请记住,如果您将任何对象引用传递给Console.WriteLine 方法,则会调用该对象的默认ToString 方法。因此,在您的示例中调用了 Object.ToString() 方法。从Object.ToString()MSDN 文档中可以看出:

    Object.ToString 方法的默认实现返回对象类型的完全限定名称。

    我会说您使用匿名类型以一种我不知道的方式混淆了事情;但是你能为JObject 类型编写一个自定义的ToString 扩展方法吗?也许类似于:

    public static class Extensions
    {
        public static string ToJSONString(this JObject jo)
        {
            // You could step into this method in the VS debugger to
            // see what 'jo' looks like. You may have to use reflection
            // to get at the properties, but I've never tried it on an 
            // anonymous type. 
        }
    }
    

    然后您将调用Console.WriteLine(JSONObject.ToJSONString()); BTW,使用JSONObject 作为变量的名称让我感到困惑,因为它看起来像Type;你能改用jsonObject吗?

    我希望其他人可以进一步澄清一些事情。祝你好运!

    【讨论】:

    • JObject 不是匿名类型,ToString 是虚拟方法。问题是 dotFuscator 将匿名对象(从中构造 JObject)转换为一个通用的辅助泛型类,从而摆脱所有属性名称;反射不能帮助你 - 这就是 JObject.FromObject 首先使用的。
    • 感谢您的信息。我有一种预感,我的帖子可能会产生一些回应。我确实说过我正在涉足未知领域。您是说扩展方法行不通,您对 UUioP 有什么进一步的建议吗?
    • 恐怕除了 dotFuscator 的配置之外别无他法 - 遗憾的是,我不知道什么样的选项可以给你:)
    • @RETierney,感谢您回答我的问题,但问题不在于JObject.FromObject(),因为Console.WriteLine( new { name = "John Doe", age = 34, height = 1.78, weight = 79.34 }); 编译为Console.WriteLine((object) new global::b&lt;string, int, double, double&gt;("John Doe", 34, 1.78, 79.34));
    【解决方案3】:

    你/我可以使用动态对象,如下所示:

    dynamic person = new ExpandoObject();
    person.name = "John Doe";
    person.age = 34;
    person.height = 1.78;
    person.weight = 79.34;
    
    JObject personJson = JObject.FromObject(person);
    
    Console.WriteLine(personJson);
    

    当它被混淆时看起来很奇怪,但它确实有效。输出完全符合预期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      相关资源
      最近更新 更多