.Net Reactor混淆致使匿名类处理出现的问题处理分析

.Net Reactor 是一款比较不错的混淆工具,比VS自带的那个好用不少,一直以来也陪伴着咱们的成长,虽然没有完美的混淆工具,不过也算仍是不错的,至少能在必定程度上对DLL进行必定的保护处理。数据库

不过最近客户反映咱们在混合框架删除操做的时候,没有如期的实现删除操做,因为混合框架是基于Web API / WCF这样的分布式开发方式,所以和普通跟踪的方式有所不一样,针对Web API的使用是比较普遍的在云端实现数据集中管理的一种方式,相对普通的调试来讲,难度增长了一些,须要在服务端(本篇主要是Web API操做)进行调试,以及在客户端界面进行联合调试处理。服务器

本篇随笔主要介绍如何在碰到基于分布式处理数据的接口的时候,对错误问题的分析和逐步缩小范围的方式进行排查,最终解决问题的分析处理过程。app

一、定位问题的发生

在咱们出现问题的时候,每每须要定位在那个部分出现了错误,首先咱们在客户端和服务端都须要进行跟踪调试,首先咱们须要在Web  API 层跟踪对应的控制器操做是否得到对应要删除记录的ID值。框架

咱们前面功能测试的时候,发现全部删除操做都出现了没法删除的问题,所以极可能是没有传递ID值,或者转换过程当中出现了问题。分布式

咱们服务器端的删除操做接口以下所示。工具

        /// <summary>
        /// 根据指定对象的ID,从数据库中删除指定对象(用于整型主键)
        /// </summary>
        /// <param name="key">指定对象的ID</param>
        /// <returns>执行成功返回<c>true</c>,不然为<c>false</c></returns>
        [HttpPost]
        public virtual CommonResult Delete(KeyInfo keyInfo, string token, string signature, string timestamp, string nonce, string appid)
        {
            //检查用户是否有权限,不然抛出MyDenyAccessException异常
            base.CheckAuthorized(AuthorizeKey.DeleteKey, token, signature, timestamp, nonce, appid);

            CommonResult result = new CommonResult();
            try
            {
                if (keyInfo != null)
                {
                    result.Success = baseBLL.Delete(keyInfo.id);
                }
            }
            catch (Exception ex)
            {
                LogTextHelper.Error(ex);//错误记录
                result.ErrorMessage = ex.Message;
            }
            return result;
        }

其中的KeyInfo类是咱们定义的一个实体类,定义代码以下所示。测试

    /// <summary>
    /// 用于删除的ID对象
    /// </summary>
    [Serializable]
    public class KeyInfo
    {
        /// <summary>
        /// ID主键
        /// </summary>public object id { get; set; }
    }

咱们在调试Web API控制器的时候,没法得到KeyInfo参数的值,以下界面所示。spa

 那么可能KeyInfo没法被反序列化,又或者是KeyInfo没有传递过来,咱们跟踪对应的接口,方向原本应该在客户端POST提交的ID信息,没法提交过来。代理

这个是针对客户端提交操做的抓包处理,原本想用Fiddler来抓取的,不过Fiddler好像没法直接抓取localhost的请求包体,经过代理设置没有处理成功,改用之前用的很顺手的 HttpAnalyzer,直接运行就能够抓取了,很是方便。调试

经过上面的操做,咱们发现数据没有提交到控制器里面,所以排除Web API控制器反序列化对象的时候丢掉值的可能,而是客户端根本没有提交数据过来

二、定位具体的值丢失位置

那么咱们回到对删除操做的统一处理方法里面看看,有Delete和Delete2操做相似,分别对应不一样类型处理。

 咱们发现这里的处理,是直接把ID传递过来构建一个匿名对象,而后序列化为JSON字符串提交给Web API控制器处理的。在界面上主要就是经过统一调用进行删除的,传递ID给对应接口进行处理的。

以权限系统模块,用户删除操做为例,它的界面端处理代码以下所示。

 以上代码我增长了一行用来记录是否得到ID的内容的,经过日志记录,能够看到有ID传递给接口处理了。

 这样看到,问题出如今接口的处理里面,也就是可能因为我对DLL采用了混淆操做,致使的匿名类解析出现了问题了。

咱们首先重写一下具体类的删除接口操做,跟踪一下问题。

 

  为了有效验证咱们的问题出如今这里,咱们对比勾选和取消了红色勾选,编译后的代码进行测试。

对比处理结果,咱们能够看到混淆先后,接口得到的数据不一样,所以能够知道是混淆致使匿名类处理出现了问题。

 因而,咱们对全部相关的DLL,取消对应的这个混淆选项,运行能够获得正确的结果。

 以上就是咱们对这个.Net Reactor混淆致使匿名类处理出现的问题处理分析,其中主要涉及到了客户端localhost地址的本地抓包处理,采用了比较方便易用的HttpAnalyzer来分析是否数据提交有问题,仍是数据解析出现问题,定位问题的边界,而后逐步对界面和接口部分进行分析。

因为对DLL混淆致使的错误问题,通常来讲不易推断,因此尽量多的列出可能影响的因素,逐一测试解决,慢慢缩小范围便可得到解决问题的办法。

相关文章
相关标签/搜索