配置文件中的数据库连接串加密了,你以为我就挖不出来吗?

一:背景

1. 讲故事

前几天在调试物联柜终端上的一个bug时发现 app.config 中的数据库连接串是加密的,因为调试中要切换数据库,我需要将密文放到专门的小工具上解密,改完连接串上的数据库名,还得再加密贴到 app.config 中,烦的要死,内容如下:

<appSettings><!-- 数据库连接字符串 --><add key="OLEDBConnStr" value="XfES27am6Muw48iB1GlMVqvUbq7/Pp9n4XbZJsDu19YDr/Zdb3m7KT6haD7f9HLj/ZEvIiZbmSU4O5L9g03Y5IUB6KLCZI7s3nDLwTIC+bXLf5quu/r8ZAI+rgNnsNZdwoDfquRLQy5Cf2X8/MFDOcMNaZYMpTYeHsZoEERU/TP9t3n5QllJTihrmDFbiGHLqe1kfN3uB3g1kgs0oobIEfNPr09kQ/pFgzZi/kZCrK10PLZZ0pFj1YU5ReFqBsdBlecV3D2Zl3lx1Ibls24t7w==" /></appSettings>

改完bug之后,我就想这玩意能防的了谁呢?私以为搞这么麻烦也就防防君子,像我这样的 晓人,加不加密都是等于没加密,照样给你脱库。。。????????????

二:使用 ILSpy 去脱库

1. 从DAL/Repository层去反编译代码

要想得到明文的数据库连接串,可以从代码中反推,比如从 DAL 或者 Repository 中找连接串字段 ConnectionString,我这边的终端程序是用 wpf 写的,采用的是经典的三层架构,所以在 bin 下可以轻松找到,如下图:

接下来用 ILSPy 反编译这个 dll。

从上图中可以看出,连接串的明文是存放在: OleDbHelper.ConnectionString 中的,然后可以看到,程序中定义了一个 Decrypt 方法专门用来解密连接串,哈哈,有了这个算法,是不是就可以脱库啦???如下代码所示:

class Program{static void Main(string[] args){var str = "XfES27am6Muw48iB1GlMVqvUbq7/Pp9n4XbZJsDu19YDr/Zdb3m7KT6haD7f9HLj/ZEvIiZbmSU4O5L9g03Y5IUB6KLCZI7s3nDLwTIC+bXLf5quu/r8ZAI+rgNnsNZdwoDfquRLQy5Cf2X8/MFDOcMNaZYMpTYeHsZoEERU/TP9t3n5QllJTihrmDFbiGHLqe1kfN3uB3g1kgs0oobIEfNPr09kQ/pFgzZi/kZCrK10PLZZ0pFj1YU5ReFqBsdBlecV3D2Zl3lx1Ibls24t7w==";Console.WriteLine(Decrypt(str));}public static string Decrypt(string str){if (!string.IsNullOrEmpty(str)){DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();byte[] key = Encoding.Unicode.GetBytes("Oyea");byte[] data = Convert.FromBase64String(str);MemoryStream MStream = new MemoryStream();CryptoStream CStream = new CryptoStream(MStream, descsp.CreateDecryptor(key, key), CryptoStreamMode.Write);CStream.Write(data, 0, data.Length);CStream.FlushFinalBlock();return Encoding.Unicode.GetString(MStream.ToArray());}return "";}}

不过还好,数据库也是在客户那边独立部署的,不存在走外网的情况,不然就玩大了。。。接下来我们来看看如何去防范。

2. 加壳/混淆/加密狗

现在市面上商业版和免费版都提供了给C#代码进行加密和混淆,不过我没用过,我想最多在反编译代码后阅读性上增加了一些障碍,这也不过是时间问题罢了,毕竟SqlConnection,SqlCommand 这些FCL的类你是没法混淆的,我从这些类上反推可以很轻松的就能找到明文的 ConnectionString ,所以这条路我觉得是走不通的。

3. 将解密算法放在 server 端

既然 解密算法 埋在客户端你都能挖出来,那把它放在 server 端不就可以啦?在程序启动的时候,调用一下 webapi 进行解密,这样你总没辙了吧 ???哈哈,大家可以开动脑子想一想,这种方法可行不可行?诚然,解密算法搬走了,再用 ILSpy 去挖已经没有任何意义了,但这里有一个重要突破点,不管是用什么形式解密的,最后的连接串明文都是存放在 OleDbHelper.ConnectionString 这个静态变量中,对吧!接下来的问题就是有没有办法把进程中的这个静态变量给挖出来?你说的对,就是抓程序的 dump文件 用 windbg 去挖。

三:使用 windbg 去脱库

1. 思路

要想挖出 OleDbHelper.ConnectionString,其实也很简单,在 CLR via C# 第四章中关于对象类型和类型对象的解读有这么一张图,很经典。

从上图中可以看到,静态字段是在 Manager 类型对象 中,实例字段都是在 Manager 对象 中,对照这张图,我只需要通过 windbg 找到 OleDbHelper 类型对象,也就是所谓的 EEClass

2. windbg 挖矿实战

  • 使用 !name2ee 找到 Decrypt 方法描述符(MethodDesc)


0:000>  !name2ee xxx.Utilities.dll xxx.Utilities.Database.OleDbHelper.Decrypt
Module:      08ed7cdc
Assembly:    xxx.Utilities.dll
Token:       060002aa
MethodDesc:  08ed83b0
Name:        xxx.Utilities.Database.OleDbHelper.Decrypt(System.String)
JITTED Code Address: 048b6af0

上面的 MethodDesc: 08ed83b0 就是方法描述符的地址。

  • 使用 !dumpmd 导出方法描述符的详细信息,找到 OleDbHelper类型对象 的 EEClass 地址


0:000> !dumpmd 08ed83b0
Method Name:  xxx.Utilities.Database.OleDbHelper.Decrypt(System.String)
Class:        08ecab30
MethodTable:  08ed8468
mdToken:      060002aa
Module:       08ed7cdc
IsJitted:     yes
CodeAddr:     048b6af0
Transparency: Critical

上面的 Class: 08ecab30 就是 OleDbHelper类型对象 在堆上的内存地址。

  • 使用 !dumpclass 导出 Class: 08ecab30 ,从而找到 OleDbHelper类的静态字段


0:000> !dumpclass 08ecab30
Class Name:      xxx.Utilities.Database.OleDbHelper
mdToken:         02000033
File:            D:\code\A18001\Source\Main\TunnelClient\bin\Debug\xxx.Utilities.dll
Parent Class:    795115b0
Module:          08ed7cdc
Method Table:    08ed8468
Vtable Slots:    4
Total Method Slots:  6
Class Attributes:    100081  Abstract,
Transparency:        Critical
NumInstanceFields:   0
NumStaticFields:     2MT    Field   Offset                 Type VT     Attr    Value Name
799bfd60  4000152       74        System.String  0   static 04c28270 ConnectionString
799bfd60  4000153       78        System.String  0   static 04c299e8 SecurityConnectionString

从上面导出信息中可以看到 OleDbHelper类中 有两个静态字段: ConnectionString 和 SecurityConnectionString

  • 使用 !do 打印出两个静态字段

看到没有,上图中的两个紫色框框就是明文的 ConnectionString 哈,怎么样?????不????。

四:总结

当认识到上面的两种脱库方式,你应该就能想到,其实你在程序中连接数据库,这本身就是一种错,操作系统都能给你盗版,何况你这区区一个小软件?个人觉得完全杜绝的方式那应该就是:灭掉本地的sqlserver,让所有的数据获取都由远端的 webapi 提供,当然这又是在脱离业务聊技术啦!????????????

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于.NetCore3.1系列 —— 日志记录之自定义日志组件

前言回顾&#xff1a;日志记录之日志核心要素揭秘在上一篇中&#xff0c;我们通过学习了解在.net core 中内置的日志记录中的几大核心要素&#xff0c;在日志工厂记录器(ILoggerFactory)中实现将日志记录提供器(ILoggerProvider)对象都可以集成到Logger对象组合中&#xff0c;这…

c语言glut打正方形,OpenGL绘制正方形并用键盘移动

准备工作&#xff1a;在OpenGL中&#xff0c;基本图形元素如点、线、折线和多边形都是由一个或多个顶点所定义。OpenGL的7种基本图元&#xff1a;WeChat77732bbab74bef94d9f34e151bce8b6e.pngWeChat26002917d9408c5eef2f9637246fd9a6.pngOpenGL绘制正方形与OpenGL绘制三角形类似…

.NET或.NET Core Web APi基于tus协议实现断点续传

【导读】前两天我采用技巧式方案基本实现大文件分片上传&#xff0c;这里只是重点在于个人思路和亲身实践&#xff0c;若在实际生产环境要求比较高的话肯定不行&#xff0c;仍存在一些问题需要深入处理&#xff0c;本文继续在之前基础上给出基于tus协议的轮子方案&#xff0c;本…

省钱攻略送上!戴尔官网OptiPlex商用台式机到手仅需2279元!速速抢购!

如何用最少的钱磕到性价比超优的设备&#xff1f;两三千元左右的价格能买到狠货吗&#xff1f;来戴尔小企业官网&#xff0c;助力业务在线&#xff0c;Slay全场&#xff01;粉丝额外宠粉福利1.关注公众号 2.通过戴尔官网客服采购电脑产品3.发送订单截图至公众号后台就会有机会…

如何面对人生危机?

点击蓝字关注&#xff0c;回复“职场进阶”获取职场进阶精品资料一份一名读者提问&#xff1a;洋哥&#xff0c;我7年前从大厂出来&#xff0c;创业多年。连续失败&#xff0c;没买车也没房&#xff0c;女朋友也和我分手了&#xff0c;父母也对我失望至极。最近我开始焦虑、失眠…

不用虚机不用Docker使用Azure应用服务部署ASP.NET Core程序

一般我们写好了应用程序想要部署发布它&#xff0c;要么发布到物理机&#xff0c;要么发布到虚拟机&#xff0c;要么发布到容器来运行它。现在有了Azure应用服务&#xff0c;我们可以完全不用管这些东西&#xff0c;只管写好自己的代码&#xff0c;然后使用VisualStudio的发布功…

数码管显示1到8c语言,单片机控制八只数码管滚动显示1~8 附PROTEUS软件仿真图

数码管显示是每一个单片机初学者都必须学的&#xff0c;而单片机驱动数码管的数字循环显示实验&#xff0c;又是单片机基础中的基础&#xff0c;同时也是学好C语言编程的关键&#xff0c;此实验在硬件上可以弄清楚单片机驱动原理和数码管的显示原理&#xff0c;在软件上可以帮助…

.NET Core + Consul 服务注册与发现

在分布式架构中&#xff0c;服务治理是必须面对的问题&#xff0c;如果缺乏简单有效治理方案&#xff0c;各服务之间只能通过人肉配置的方式进行服务关系管理&#xff0c;当遇到服务关系变化时&#xff0c;就会变得极其麻烦且容易出错。Consul[1] 是一个用来实现分布式系统服务…

.NET Core + Spring Cloud:API 网关

API 网关是系统的唯一入口&#xff0c;调用任何服务的请求都需要经过网关层&#xff0c;最终才可能到达目标服务&#xff0c;既然是必经之路&#xff0c;那我们可以在网关层进行一些通用的操作&#xff0c;如&#xff1a;认证、鉴权、限流、智能路由、缓存、日志、监控、超时、…

VS Code 黑宝书背后的故事

自开售以来&#xff0c;《Visual Studio Code 权威指南》就受到了许多读者朋友的青睐。在京东和当当两大平台上&#xff0c;都分别取得了不错的绩&#xff1a;当当&#xff1a;计算机新书热卖榜第一名京东&#xff1a;科技IT新书榜第一名那么&#xff0c;热销背后&#xff0c;这…

ASP.net Core MVC项目给js文件添加版本号

需求&#xff1a;使用ASP.net Core Mvc开发公司内部web系统&#xff0c;给视图中js(css,image也可以)文件添加版本号避免缓存问题。解决方法&#xff1a;利用Taghelper提供的标签&#xff08;asp-append-version&#xff09;可以实现<script src"~/Scripts/Biz/Village…

c语言网格搜索,基于C

引言教室作为学生长期使用的建筑类型&#xff0c;对光环境舒适度的需求尤为明显。相关研究表明&#xff0c;不仅照明会影响学习效率[1]&#xff0c;而且不当照明会引起使用者不适甚至损害视力[2]。随着多媒体教学设施的普及&#xff0c;幻灯片投影教学现已成为教师授课的主要形…

初识ABP vNext(1):开篇计划基础知识

点击上方蓝字"小黑在哪里"关注我吧审计(Audit)本地化(Localization)事件总线(Event Bus)多租户(multi-tenancy technology)DDD分层实体(Entity)值对象(Value Object)聚合根(Aggregate Root)仓储(Repository)应用服务(Application Services)数据传输对象(DTO)工作单元…

[开源] .Net ORM FreeSql 1.8.0-preview 最新动态播报

FreeSql 是 .NET 开源生态下的 ORM 轮子&#xff0c;在一些人眼里属于重复造轮子&#xff1a;不看也罢。就像昨天有位朋友截图某培训直播发给我看&#xff0c;内容为&#xff1a;“FreeSQL&#xff08;个人产品&#xff09;&#xff0c;自己玩可以&#xff0c;不要商用。ORM框架…

懂程序员的产品经理是什么样子?

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「155」篇原创敬上大家好&#xff0c;我是Z哥。在互联网行业&#xff0c;产品经理和程序员之间的关系很微妙。表面看上去水火不容&#xff0c;在一方的眼里看另外一…

初识ABP vNext(2):ABP启动模板

点击上方蓝字"小黑在哪里"关注我吧AbpHelper模块安装前言上一篇介绍了ABP的一些基础知识&#xff0c;本篇继续介绍ABP的启动模板。使用ABP CLI命令就可以得到这个启动模板&#xff0c;其中包含了一些基础功能模块&#xff0c;你可以基于这个模板来快速开发。开始首先…

关于Dapper实现读写分离的个人思考

概念相关为了确保多线上环境数据库的稳定性和可用性&#xff0c;大部分情况下都使用了双机热备的技术。一般是一个主库一个从库或者多个从库的结构&#xff0c;从库的数据来自于主库的同步。在此基础上我们可以通过数据库反向代理工具或者使用程序的方式实现读写分离&#xff0…

135. 分发糖果002(贪心算法+思路+详解)

一&#xff1a;题目 老师想给孩子们分发糖果&#xff0c;有 N 个孩子站成了一条直线&#xff0c;老师会根据每个孩子的表现&#xff0c;预先给他们评分。 你需要按照以下要求&#xff0c;帮助老师给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 评分更高的孩…

Enumerable 下又有新的扩展方法啦,快来一睹为快吧

一&#xff1a;背景1. 讲故事前段时间将公司的一个项目从 4.5 升级到了 framework 4.8 &#xff0c;编码的时候发现 Enumerable 中多了三个扩展方法&#xff1a; Append, Prepend, ToHashSet&#xff0c;想必玩过jquery的朋友一眼就能看出这三个方法的用途&#xff0c;这篇就和…

Jdbc创建表 利用循环添加数据 ,更新数据

一&#xff1a;上码 1.有的已经实现的就注释了 2.配置文件信息 package com.wyjedu.jdbc.PreparedStatement;import java.io.FileInputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet;…