当前位置: 首页 > news >正文

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";//ContentTypebyte[] 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: 37public partial class LoginViewModel : GalaSoft.MvvmLight.ViewModelBase{// Token: 0x06000118 RID: 280public 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("调用第三方鉴权接口失败!");}}}}
}

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

相关文章:

  • Docker进阶数据卷目录挂载及在线部署
  • RT-Thread GD32F4xx实现SD卡热插拔检测功能
  • 达摩研究院Paraformer-large模型已支持windows
  • mysql服务多实例运行
  • HCIP-2
  • 访问学者申请需要注意什么?
  • 拼多多根据ID取商品详情原数据 API 实现实时数据获取的完整指南
  • 奥伦德光电耦合器5G通信领域及其相关领域推荐
  • 【动态规划】20子数组系列_环形子数组的最大和_C++(medium)
  • Linux部署WBO在线白板
  • create_metrology_model
  • MYSQL篇--sql优化高频面试题
  • 数据库系统原理总结之——数据库编程
  • 贝叶斯优化的基本流程
  • 做一个个人博客第一步该怎么做?
  • ----------
  • 自己简单写的 事件订阅机制
  • 2017年终总结、随想
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript设计模式系列一:工厂模式
  • mysql常用命令汇总
  • REST架构的思考
  • SQLServer之创建显式事务
  • vuex 笔记整理
  • 程序员最讨厌的9句话,你可有补充?
  • 开发基于以太坊智能合约的DApp
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何进阶一名有竞争力的程序员?
  • 设计模式 开闭原则
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 为什么要用IPython/Jupyter?
  • 携程小程序初体验
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 智能网联汽车信息安全
  • Hibernate主键生成策略及选择
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​ArcGIS Pro 如何批量删除字段
  • ​第20课 在Android Native开发中加入新的C++类
  • ​批处理文件中的errorlevel用法
  • # include “ “ 和 # include < >两者的区别
  • #162 (Div. 2)
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #Z0458. 树的中心2
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (007)XHTML文档之标题——h1~h6
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models