当前位置: 首页 > 科技观察

配置文件里的数据库连接串是加密的,你以为我挖不出来?

时间:2023-03-22 16:21:10 科技观察

1:背景1、前几天在物联网机柜终端调试bug的时候,发现app中的数据库连接串。去专门的小工具解密吧。更改连接字符串上的数据库名称后,您必须对其进行加密并将其粘贴到app.config中。太烦人了。内容如下:改完bug,不知谁能防得住么?我个人认为,闹出这种事,就是君子心存戒心了。对于我这种聪明人来说,加密不加密就等于不加密,反正我就让你出库了。..😄😄😄二:使用ILSpy去除库1.从DAL/Repository层反编译代码。如果想获取明文的数据库连接字符串,可以从代码中逆向获取,比如从DAL或者Repository中找到ConnectionString字段,我这边的终端程序是wpf写的,用的是经典的三层architecture,所以在bin下很容易找到,如下图:接下来使用ILSPy反编译dll。从上图可以看出,连接字符串的明文存放在:OleDbHelper.ConnectionString,然后可以看到程序中定义了一个Decrypt方法来解密连接字符串。Haha,withthisalgorithm,isitright?就可以脱库啦???如下代码所示:classProgram{staticvoidMain(string[]args){varstr="XfES27am6Muw48iB1GlMVqvUbq7/Pp9n4XbZJsDu19YDr/Zdb3m7KT6haD7f9HLj/ZEvIiZbmSU4O5L9g03Y5IUB6KLCZI7s3nDLwTIC+bXLf5quu/r8ZAI+rgNnsNZdwoDfquRLQy5Cf2X8/MFDOcMNaZYMpTYeHsZoEERU/TP9t3n5QllJTihrmDFbiGHLqe1kfN3uB3g1kgs0oobIEfNPr09kQ/pFgzZi/kZCrK10PLZZ0pFj1YU5ReFqBsdBlecV3D2Zl3lx1Ibls24t7w==";Console.WriteLine(Decrypt(str));}publicstaticstringDecrypt(stringstr){if(!string.IsNullOrEmpty(str)){DESCryptoServiceProviderdescsp=newDESCryptoServiceProvider();byte[]key=Encoding.Unicode.GetBytes("欧亚");byte[]data=Convert.FromBase64String(str);MemoryStreamMStream=newMemoryStream();CryptoStreamCStream=newCryptoStream(MStream,descsp.CreateDecryptor(key,key),CryptoStreamMode.Write);CStream.Write(数据,0,data.Length);CStream.FlushFinalBlock();returnEncoding.Unicode.GetString(MStream.ToArray());}return"";}}不过好在数据库也是独立部署在客户这边的,没有访问外网的事情,不然就太大了。.接下来,让我们看看如何预防。2.打包/混淆/加密狗现在市面上的商业版和免费版都提供了对C#代码的加密和混淆,但是我没有用过。我觉得顶多给反编译代码的可读性增加一些障碍。这只是时间问题。毕竟,不能混淆SqlConnection、SqlCommand和其他FCL类。我可以很容易地从这些类中找到明文ConnectionString,所以我认为这种方式行不通。的。3.将解密算法放在服务器端。既然解密算法都埋在客户端,你可以挖出来,那放在服务器端不就好了吗?程序启动的时候调用webapi解密,不会出错吧???哈哈,大家可以动动脑筋想想这个方法是否可行呢?解密算法确实搬走了,用ILSpy挖也没意义,但是这里有一个重要的突破。什么形式用于解密?连接字符串的最终纯文本存储在静态变量OleDbHelper.ConnectionString中,对吧!接下来的问题是有没有办法把进程中的这个静态变量挖出来?你没看错,就是抓取程序的dump文件,用windbg来挖。三:使用windbg去除库1、思路是挖出OleDbHelper.ConnectionString,其实很简单。在CLRviaC#第四章中,有这么一张图解释对象类型和类型对象,非常经典。从上图可以看出,静态字段在Manager类型对象中,实例字段都在Manager对象中。对比这张图,我只需要通过windbg找到OleDbHelper类型的对象,也就是所谓的EEClass。2.Windbg挖矿实际使用!name2ee找到Decrypt方法描述符(MethodDesc)0:000>!name2eexxx.Utilities.dllxxx.Utilities.Database.OleDbHelper.DecryptModule:08ed7cdcAssembly:xxx.Utilities.dllToken:060002aaMethodDesc:08ed8xxUtilities.Database.OleDbHelper.Decrypt(System.String)JITTEDCodeAddress:048b6af0上面的MethodDesc:08ed83b0是方法描述符的地址。使用!dumpmd导出方法描述符的详细信息,找到OleDbHelper类型对象的EEClass地址0:000>!dumpmd08ed83b0MethodName:xxx.Utilities.Database.OleDbHelper.Decrypt(System.String)Class:08ecab30MethodTable:08ed8468mdToken:060002aaModule:08ed7AddtedcIsTheClassabove:048b6af0Transparency:Critical:08ecab30是OleDbHelper类型对象在堆上的内存地址。使用!dumpclass导出Class:08ecab30找到OleDbHelper类的静态字段0:000>!dumpclass08ecab30ClassName:xxx.Utilities.Database.OleDbHelpermdToken:02000033File:D:\code\A18001\Source\Main\TunnelClient\bin\Debug\xxx.Utilities.dllParentClass:795115b0Module:08ed7cdcMethodTable:08ed8468VtableSlots:4TotalMethodSlots:6ClassAttributes:100081Abstract,Transparency:CriticalNumInstanceFields:0NumStaticFields:2MTFieldOffsetTypeVTAttrValueName799bfd60400015274System.String0static04c28270ConnectionString799bfd60400015378System.String0static04c299e8SecurityConnectionString从上面导出信息中可以看到OleDbHelper类中有两个静态字段:ConnectionString和SecurityConnectionString。使用!do打印出两个静态字段。看看能不能看出上图中的两个紫色方框就是明文的ConnectionString。这个怎么样?🐂不🐂。四:总结当你意识到以上两种卸载库的方法时,你应该能想到,其实你在程序中是连接数据库的,这本身就是一个错误,操作系统可以给你盗版副本,更不用说您所在地区的小软件了。?个人认为彻底杜绝的方法应该是:干掉本地的sqlserver,让所有的数据获取都由远程的webapi提供。当然,这是脱离了商务聊天技术!码农聊技术》,可通过以下二维码关注。转载本文请联系一线码农聊技术公众号。