C# - 如何使用Dotfuscator.Net的匿名类型?

时间:2016-11-12 09:28:48

标签: c# obfuscation dotfuscator

我在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
}

Dotfuscater对此进行了混淆:

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

3 个答案:

答案 0 :(得分:1)

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

首先,我从混淆的代码中看到,-(CLLocationCoordinate2D) getLocation{ CLLocationCoordinate2D coordinate; CLLocationManager *locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; if ([CLLocationManager locationServicesEnabled]) { locationManager.desiredAccuracy = kCLLocationAccuracyBest; locationManager.distanceFilter = kCLDistanceFilterNone; [locationManager startUpdatingLocation]; [locationManager startUpdatingLocation]; CLLocation *location = [locationManager location]; coordinate = [location coordinate]; } else { coordinate.latitude = 0.0; coordinate.longitude = 0.0; } return coordinate; } 中返回的对象被强制转换为JObject.FromObject类型。请记住,如果您将任何对象引用传递给object方法,则将调用该对象的默认Console.WriteLine方法。因此,在您的示例中调用ToString方法。从Object.ToString()的{​​{1}}文档中可以看出:

  

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

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

JObject

然后你会调用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. } } BTW,使用Console.WriteLine(JSONObject.ToJSONString());作为变量的名称会让我感到困惑,因为它看起来像JSONObject;您可以使用Type吗?

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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工作。