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

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

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

1、定位问题的发生

在我们出现问题的时候,往往需要定位在那个部分出现了错误,首先我们在客户端和服务端都需要进行跟踪调试,首先我们需要在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参数的值,如下界面所示。

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

这个是针对客户端提交操作的抓包处理,本来想用Fiddler来抓取的,不过Fiddler好像无法直接抓取localhost的请求包体,通过代理设置没有处理成功,改用以前用的很顺手的 HttpAnalyzer,直接运行就可以抓取了,非常方便。

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

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

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

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

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

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

这样看到,问题出现在接口的处理里面,也就是可能由于我对DLL采用了混淆操作,导致的匿名类解析出现了问题了。

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

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

对比处理结果,我们可以看到混淆前后,接口获得的数据不同,因此可以知道是混淆导致匿名类处理出现了问题。

于是,我们对所有相关的DLL,取消对应的这个混淆选项,运行可以得到正确的结果。

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

由于对DLL混淆导致的错误问题,一般来说不易推断,所以尽可能多的列出可能影响的因素,逐一测试解决,慢慢缩小范围即可获得解决问题的办法。

.Net Reactor混淆导致匿名类处理出现的问题处理分析的更多相关文章

  1. Linq之隐式类型、自动属性、初始化器、匿名类

    目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...

  2. Java通过匿名类来实现回调函数

    在C语言中,函数名可以当做函数指针传递给形参从而实现回调 void f1() { printf("f1()\n"); } void f2() { printf("f2() ...

  3. [转]c#匿名类

    首先让我们看一个例子, 假设我们并没有Person类, 并且我们关心的属性只有Name和Age. 下面的代码演示了我们如何在没有声明类型的情况下来构建一个对象的: 1: var tom = new { ...

  4. Java之匿名类讲解

    参考https://blog.csdn.net/jiaotuwoaini/article/details/51542059 匿名类,正如名字一样在java中没有名字标识的类,当然了编译后还是会安排一个 ...

  5. 2019.12.12 Java的多线程&匿名类

    Java基础(深入了解概念为主) 匿名类 定义 Java匿名类很像局部或内联系,只是没有明细.我们可以利用匿名类,同时定义并实例化一个类.只有局部类仅被使用一次时才应该这么做. 匿名类不能有显式定义的 ...

  6. Java入门教程十(抽象类接口内部类匿名类)

    抽象类(abstract) 一个类只定义了一个为所有子类共享的一般形式,至于细节则交给每一个子类去实现,这种类没有任何具体的实例,只具有一些抽象的概念,那么这样的类称为抽象类. 在面向对象领域,抽象类 ...

  7. 浅谈Java的匿名类

    在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码 ...

  8. Second Day: 关于Button监听事件的三种方法(匿名类、外部类、继承接口)

    第一种:通过匿名类实现对Button事件的监听 首先在XML文件中拖入一个Button按钮,并设好ID,其次在主文件.java中进行控件初始化(Private声明),随后通过SetOnClickLis ...

  9. 学习笔记:因为java匿名类学习到接口的一些小用法

    在看CometD的示例代码时发现了许多有意思的代码,但说实话看别人的代码确实是件很累的事情,所以就看到这个知识点做一下记录吧.   先看一段代码: 代码1   这段代码中有一个new的操作,而且是在方 ...

随机推荐

  1. Go语言学习——如何实现一个过滤器

    1.过滤器使用场景 做业务的时候我们经常要使用过滤器或者拦截器(听这口音就是从Java过来的).常见的场景如一个HTTP请求,需要经过鉴权过滤器.白名单校验过滤.参数验证过滤器等重重关卡最终拿到数据. ...

  2. Python中绘制场景热力图

    我们在做诸如人群密集度等可视化的时候,可能会考虑使用热力图,在Python中能很方便地绘制热力图. 下面以识别图片中的行人,并绘制热力图为例进行讲解. 步骤1:首先识别图像中的人,得到bounding ...

  3. Python之变量的创建过程

    Python之变量的创建过程 一.变量创建过程 首先,当我们定义了一个变量name = 'Kwan'的时候,在内存中其实是做了这样一件事: 程序开辟了一块内存空间,将'Kwan'存储进去,再让变量名n ...

  4. .NET平台下,钉钉微应用开发之:工作消息通知

    首先看下官方文档,为我们提供了POST请求地址,和几个必传参数的列表以及参数示例,写的都挺详细的. 无奈提供的SDK请求示例是JAVA的,而我用的是.NET的,所以还是摸了一些坑出来,其实也就是不同平 ...

  5. (五十四)c#Winform自定义控件-仪表盘

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  6. macOS平台下Qt应用程序菜单翻译及调整

    一.翻译 在macOS平台上,系统会为应用程序菜单添加一些额外的菜单项.先来看一些典型的例子: 这个是Qt Creator的菜单,系统为应用程序菜单添加了一些桌面显示操作相关的菜单项: 这个是Qt D ...

  7. spring-cloud-kubernetes与k8s的configmap

    本文是<spring-cloud-kubernetes实战系列>的第六篇,主要内容是在kubernetes上部署一个java web应用,该应用使用了spring-cloud-kubern ...

  8. CF - 1106 E Lunar New Year and Red Envelopes DP

    题目传送门 题解: 首先要处理出每个时间点会选择哪一个线段. 对于这个问题,可以用multiset去维护信息. 当时间线开始的时候,往mutiset里面插入这个信息,当时间线结束的时候,删除这个信息. ...

  9. watch命令的监控结果输出到文件

    watch命令是为命令行输出设计的工具,其结果包含很多不可打印的字符,所以输出重定向到文件中很不方便,比如这样做的话有很多乱码: (watch -n 60 <mycommand> ) &g ...

  10. Spring Boot2 系列教程(四)理解Spring Boot 配置文件 application.properties

    在 Spring Boot 中,配置文件有两种不同的格式,一个是 properties ,另一个是 yaml . 虽然 properties 文件比较常见,但是相对于 properties 而言,ya ...