C#之反编译之路(二)

先阅读C#之反编译之路(一)可以增加文章连续性
阅读C#之反编译之路(一)

如何快速定位代码位置

用一个小小的例子举例,用户反馈新能源车牌号无法录入,燃油车牌正常,查看日志报如下错误
在这里插入图片描述
拿到关键字车牌号长度错误直接反编译代码
打开dnSpy.exe→加载项目→Ctrl+F打开搜索框→输入关键字
在这里插入图片描述
由于是逐个文件进行反编译的,所有它并不能全局搜索,所以右上角是红色,这时候我们从资源文件开始,按键盘的向下键逐个文件向下查找(特别是完全不了解项目结构,非自己维护的代码等,不错过任何一个文件)
在这里插入图片描述
查找到关键字后,红色会变为黑色
在这里插入图片描述
很明显,最初的车牌号都为7位,并没有新能源车辆(新能源车牌号长度为8位),所以开发者添加了7位数的长度限制,我们只需要去掉该代码即可
右击→编辑方法→删掉圈中部分→编译→文件→全部保存,重新启动发现问题已经解决
在这里插入图片描述

修改接口调用

老系统用户登录后,要调用第三方系统接口,通过接口的返回值,判断是否能够登录系统,以及弹框提示等
通过对项目结构的分析,找到了登录方法
在这里插入图片描述
右键→编辑方法,添加如下的http post请求代码

//新接口请求
				 var request = (HttpWebRequest)WebRequest.Create("http://localhost:5184/getAuth");
				 request.Method = "POST";
				 request.ContentType = "application/json;charset=UTF-8";//ContentType
				byte[] byteData = Encoding.UTF8.GetBytes(jsonParam);
				int length = byteData.Length;
				request.ContentLength = length;
				Stream writer = request.GetRequestStream();
				writer.Write(byteData, 0, length);
				writer.Close();
				var response = (HttpWebResponse)request.GetResponse();
				var responseString = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8")).ReadToEnd();

在这里插入图片描述
这个时候代码会大量报错,因为我们并没有添加引用,你可以从其他项目(自己不报错的项目F12进去就能看到)或网上找到相关的代码命名空间(下图1),如果项目没有用到的依赖,则手动添加依赖,再引用,如下图(下图2)
图1

图2
添加如下引用之后,代码已经能够正常运行,并且我们打上了日志,还从日志文件中拿到了返回值

using System.IO;
using System.Net;
using System.Text;
using Newtonsoft.Json;

在这里插入图片描述
在这里插入图片描述
接下来我们要通过返回值来判断是否终止用户操作,只有当isAuth为true时,用户能直接登录,否则,如果message有信息,则弹框提示用户
这里我们直接使用JObject来接收值,省去添加返回值类的操作

			if(string.IsNullOrEmpty(responseString)){
				JObject jobj = JObject.Parse(responseString);
                if (jobj.HasValues) {
                    if ((int)jobj["code"] == 200 && jobj["data"] != null && jobj["data"]["isAuth"] != null && (bool)jobj["data"]["isAuth"] == true) {
                        //鉴权通过
						this.SystemInit(loginResponse, loginRequest.Password, jumpTo);
                    } else if ((int)jobj["code"] != 200 && jobj["msg"]!=null&&!string.IsNullOrEmpty(jobj["msg"].ToString())) { 
                        //弹框提醒
						Growl.WarningGlobal(jobj["msg"].ToString());
                    }
                }
				}else{
					Growl.InfoGlobal("调用第三方鉴权接口失败!");
				}

添加引用

using Newtonsoft.Json.Linq;

最终代码如下

using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Text;
using Cloud.Data.IService;
using Cloud.Data.Model;
using Cloud.Helper;
using Cloud.Wpf.Common;
using Cloud.Wpf.Model;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using HandyControl.Controls;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Cloud.Wpf.ViewModel
{
	// Token: 0x02000025 RID: 37
	public partial class LoginViewModel : GalaSoft.MvvmLight.ViewModelBase
	{
		// Token: 0x06000118 RID: 280
		public void Login(Cloud.Data.Model.LoginRequest loginRequest, string jumpTo = null)
		{
			this.dialogService.Waiting("登录中", true, "");
			Cloud.Data.Model.LoginResponse loginResponse = this.userService.Login(loginRequest).Check<Cloud.Data.Model.LoginResponse>();
			this.dialogService.WaitingClose();
			if (loginResponse != null)
			{
				string jsonParam = JsonConvert.SerializeObject(new
				{
					userId = loginRequest.StationCode,//设备代码
					loginName = loginRequest.UserName//登录id
				});
				HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:5184/getAuth");
				httpWebRequest.Method = "POST";
				httpWebRequest.ContentType = "application/json;charset=UTF-8";
				byte[] byteData = Encoding.UTF8.GetBytes(jsonParam);
				int length = byteData.Length;
				httpWebRequest.ContentLength = (long)length;
				Stream requestStream = httpWebRequest.GetRequestStream();
				requestStream.Write(byteData, 0, length);
				requestStream.Close();
				string responseString = new StreamReader(((HttpWebResponse)httpWebRequest.GetResponse()).GetResponseStream(), Encoding.GetEncoding("utf-8")).ReadToEnd();
				Log.Info("第三方接口返回值:" + responseString);
				if(!string.IsNullOrEmpty(responseString)){
					JObject jobj = JObject.Parse(responseString);
                if (jobj.HasValues) {
                    if ((int)jobj["code"] == 200 && jobj["data"] != null && jobj["data"]["isAuth"] != null && (bool)jobj["data"]["isAuth"] == true) {
                        //鉴权通过
						this.SystemInit(loginResponse, loginRequest.Password, jumpTo);

                    } else if ((int)jobj["code"] != 200 && jobj["msg"]!=null&&!string.IsNullOrEmpty(jobj["msg"].ToString())) { 
                        //弹框提醒
						Growl.FatalGlobal(jobj["msg"].ToString());
                    }
                }
				}else{
					Growl.WarningGlobal("调用第三方鉴权接口失败!");
				}
				
			}
		}
	}
}

保存,再次启动程序,用户已经不能正常登录系统
在这里插入图片描述
接口返回值如下
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/302509.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ThreadLocal内存泄漏与解决

目录 什么是Threadlocal&#xff1f; Threadlocal的基本使用 ThreadLocal的内存泄漏举例 场景1 场景2 场景3 场景4 内存泄漏原因分析 总结 什么是Threadlocal&#xff1f; ThreadLocal 是 Java 中的一个类&#xff0c;它提供了线程本地变量的支持。线程本地变量是指被…

互联网加竞赛 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

RBAC基于角色的访问控制

一 什么是RBAC 概念 RBAC 是基于角色的访问控制&#xff08;Role-Based Access Control &#xff09;在 RBAC 中&#xff0c;权限与角色相关联&#xff0c;用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的&#…

Django 4.2.7 ORM 连接MySQLServer 完成单表CRUD

文章目录 Django ORM介绍1.使用pycharm新建一个Django项目2.修改settings.py文件中 DATABASES3.创建APP4.创建模型5.操作数据库 Django ORM介绍 Django 模型使用自带的 ORM。 对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称 ORM &#xff09;用于实现面向…

Java程序员面试-场景篇

前言 裁员增效潮滚滚而来&#xff0c;特总结一些实际场景方案的面试题&#xff0c;希望对大家找工作有一些帮助。 注册中心 题目&#xff1a; 有三台机器&#xff0c;分别部署了微服务A、微服务B、注册中心&#xff0c;其中A和B都有服务接口提供并正常注册到了注册中心&…

SpringMVC概述

MVC介绍 MVC是一种设计模式&#xff0c;将软件按照模型、视图、控制器来划分&#xff1a; M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean&#xff1a;专门存储业务数据的&…

Docker Compose--部署SpringBoot项目--实战

原文网址&#xff1a;Docker Compose--部署SpringBoot项目--实战-CSDN博客 简介 本文用实战介绍Docker Compose部署SpringBoot项目。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题&#xff0c…

Java方法用法及解析

在 Java 中&#xff0c;方法&#xff08;Method&#xff09;是用于执行特定任务的代码块。它是一个函数&#xff0c;用于封装一段可重复执行的代码&#xff0c;并可以被其他代码调用。方法定义了一系列操作的步骤&#xff0c;并提供了一种结构化和可复用的方式来组织和执行这些…

MathType7.6安装教程

1.软件介绍 MathType是一款可以帮助用户快速完成数学公式编辑的应用软件&#xff0c;这款软件适合在进行教育教学、科研机构、论文写作的时候使用。我们可以直接通过这款软件来获取到大量数学上使用到的函数、数学符号等内容&#xff0c;然后使用这些内容来完成公式编辑。 不管…

【mars3d】new mars3d.layer.GeoJsonLayer(实现环状面应该怎么传data

问题&#xff1a;【mars3d】new mars3d.layer.GeoJsonLayer(实现环状面应该怎么传data 解决方案&#xff1a; 1.在示例中修改showDraw()方法的data数据&#xff0c;实现以下环状面效果 2.示例链接&#xff1a; 功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 export f…

深入理解Java源码:提升技术功底,深度掌握技术框架,快速定位线上问题

为什么要看源码&#xff1a; 1、提升技术功底&#xff1a; 学习源码里的优秀设计思想&#xff0c;比如一些疑难问题的解决思路&#xff0c;还有一些优秀的设计模式&#xff0c;整体提升自己的技术功底 2、深度掌握技术框架&#xff1a; 源码看多了&#xff0c;对于一个新技术…

真的干不过,00后整顿职场已经给我卷麻了,想离职了...

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&#x…

J2EE 实验一

实验一 基于Struts2的登录系统实现 一、目的与任务 目的&#xff1a;熟悉在集成开发平台上配置Struts2框架&#xff0c;学习Struts2编程 任务&#xff1a;在集成开发平台上创建Struts2项目&#xff0c;实现登录系统 二、内容、要求与安排方式 1、实验内容与要求&#xff1…

C盘突然满了,怎么清理

方法一 winr 输入%tem%按回车键&#xff0c;出现的这些都是缓存文件可以按删除键删掉 方法二 winr 输入cleanmgr按回车键&#xff0c;选择清理的盘符&#xff0c;这里选择C盘&#xff0c;点击确定删除 方法三 在系统设置里手动删除 找到电脑里面的设置选项&#xff0c;找…

第九节HarmonyOS 常用基础组件12-TextTimer

1、描述 通过文本显示计时信息并控制其计时器状态的组件。 2、接口 TextTimer(options?: {isCountDown?: boolean, count?: number, controller?: TextTimerController}) 3、参数 参数名称 参数类型 必填 描述 isCountDown boolean 否 是否倒计时。默认值&#…

LeetCode刷题--- 珠宝的最高价值

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

如何启用Windows电脑的内置Administrator账户

前言 不知道从什么时候开始&#xff0c;新电脑或者新系统开机之后都会出现一个界面让你创建一个账户&#xff0c;但这个账户有可能是本地账户&#xff08;Windows10&#xff09;还有强制你登录微软账户的&#xff08;Windows11&#xff09;。 好像曾经熟悉的电脑Administrator…

750ml离心瓶进口国产离心机通用750ml离心杯高低速离心机瓶

750ml低速离心瓶系列&#xff1a; 产品货号&#xff1a;ZY1136222 材质&#xff1a;PPCO 容量&#xff08;ml&#xff09;&#xff1a;750 尺寸&#xff08;O.DxH,mm&#xff09;&#xff1a;98.5x147 最大离心力&#xff08;xg&#xff09;&#xff1a;6000 产品货号&…

Vue2:通过props给组件传数据

一、业务场景 我们在使用Vue组件时&#xff0c;常常会复用Vue组件&#xff0c;那么&#xff0c;问题来了&#xff0c;复用的时候&#xff0c;业务数据不相同&#xff0c;怎么办了&#xff1f; 这里我们就需要学习新的属性&#xff1a;props来实现这个功能。 这样&#xff0c;组…

代码随想录day23 二叉岁终章

669. 修剪二叉搜索树 题目 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点&#xff0c;所以结果应当返回修剪好的二叉搜索树的新的根节点。 思考 这题有个…