• 使用 .NET Reactor 混淆C#程序后,调用ToJson()出现Newtonsoft.Json.JsonSerializationException


    使用 .NET Reactor 混淆 C#程序,出现Newtonsoft.Json.JsonSerializationException
    具体问题如下:

    Newtonsoft.Json.JsonSerializationException: A member with the name ' ' already exists on 'Test.AuthCode'. Use the JsonPropertyAttribute to specify another name.
       在 Newtonsoft.Json.Serialization.JsonPropertyCollection.AddProperty(JsonProperty property)
       在 Newtonsoft.Json.Serialization.DefaultContractResolver.CreateConstructorParameters(ConstructorInfo constructor, JsonPropertyCollection memberProperties)
       在 Newtonsoft.Json.Serialization.DefaultContractResolver.CreateObjectContract(Type objectType)
       在 Newtonsoft.Json.Serialization.DefaultContractResolver.CreateContract(Type objectType)
       在 System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
       在 Newtonsoft.Json.Utilities.ThreadSafeStore`2.Get(TKey key)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    背景:
    1.代码中Config类同AuthCode类相似,他们的实例都有调用ToJson()方法,但Config的实例调用ToJson()方法无误。

    解决该问题我使用了“dnSpy”逆向工具

    起初我一直在“修改混淆模式 -> 运行程序 -> 报错”这个循环往复,以为是 .NET Reactor 工具的问题。我在这种方式下调试了一天,一直到下午下班,还是没有调试出来。然后,我想反正解决不了,要不先去吃饭,放松下,在放松的工程中总会有拓开的想法,感觉思维进胡同了。后面我就吃饭去了。就在吃饭的时候我想到了一个办法:
    将出错位置的代码拷贝到程序起始位置去运行,看看是否报错,如果仍然报错,就拷贝AuthCode类为AuthCode2。然后来逐渐删减里面的代码,直到出现运行正常时候,就定位到具体错误代码行。

    最后我按照该方法,果然定位到问题行。原来是AuthCode2的构造函数的访问权限应该为public。
    原代码为:

    private AuthCode2() { }
    
    • 1

    改为:

    public AuthCode2() { }
    
    • 1

    那为什么Config类中构造函数为:

    private Config() { }
    
    • 1

    却能正常运行呢? ***目前该问题还不得而知。***但可以知道的是 .NET Reactor 混淆等功能跟原程序中类、方法、属性、字段的访问权限有关系,并且影响其保护输出的exe的结果。

    以上虽仍有问题未解决,但“适当放松->拓展思维”的这个Debug的方法确实很好的,这也印证了我在以前的一片随想“解决技术难题思路” 中提到的 排除法, 控制变量法

    补充:

    在下午调试的时候最终定位的位置如图:
    dnSpy调试混淆后程序的最后定位点及报错点
    如图,程序时运行到此处由于 变量parameters 中存储的属性名有两个 " "(string类型) 和一个0(int类型)。这个现象让我想起了AuthCode的另有一个三参数的构造函数,如下:

    public AuthCode(string account, string computerUniqueID, int usableMonthNumber){}
    
    • 1

    而Config却只有一个 private权限的无参构造函数。我在想问题是否就出在了构造函数。

  • 相关阅读:
    计算机毕业设计ssm大学生课外学习系统m65wl系统+程序+源码+lw+远程部署
    Hbase(二)进阶
    Java8 中新增的 Stream 流操作
    【论文阅读】多模态模型CoCa
    用于独立系统应用的光伏MPPT铅酸电池充电控制器建模(Simulink实现)
    Vue2.0+AntvX6—边 Edge
    【LeetCode-中等题】39. 组合总和
    h5输入框遮挡问题
    vue学习之v-if/v-else/v-else-if
    上海亚商投顾:沪指震荡调整 两市成交金额跌破6000亿
  • 原文地址:https://blog.csdn.net/ReturningProdigal/article/details/125451493