真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何解決配置文件中的數(shù)據(jù)庫(kù)連接串加密了問(wèn)題

這篇文章主要介紹“如何解決配置文件中的數(shù)據(jù)庫(kù)連接串加密了問(wèn)題”,在日常操作中,相信很多人在如何解決配置文件中的數(shù)據(jù)庫(kù)連接串加密了問(wèn)題問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何解決配置文件中的數(shù)據(jù)庫(kù)連接串加密了問(wèn)題”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)公司擁有一支富有激情的企業(yè)網(wǎng)站制作團(tuán)隊(duì),在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕10年,專(zhuān)業(yè)且經(jīng)驗(yàn)豐富。10年網(wǎng)站優(yōu)化營(yíng)銷(xiāo)經(jīng)驗(yàn),我們已為上千多家中小企業(yè)提供了成都網(wǎng)站制作、做網(wǎng)站解決方案,按需求定制制作,設(shè)計(jì)滿(mǎn)意,售后服務(wù)無(wú)憂(yōu)。所有客戶(hù)皆提供一年免費(fèi)網(wǎng)站維護(hù)!

一:背景

1. 講故事

前幾天在調(diào)試物聯(lián)柜終端上的一個(gè)bug時(shí)發(fā)現(xiàn) app.config  中的數(shù)據(jù)庫(kù)連接串是加密的,因?yàn)檎{(diào)試中要切換數(shù)據(jù)庫(kù),我需要將密文放到專(zhuān)門(mén)的小工具上解密,改完連接串上的數(shù)據(jù)庫(kù)名,還得再加密貼到 app.config  中,煩的要死,內(nèi)容如下:

改完bug之后,我就想這玩意能防的了誰(shuí)呢?私以為搞這么麻煩也就防防君子,像我這樣的 曉人,加不加密都是等于沒(méi)加密,照樣給你脫庫(kù)。。。???

二:使用 ILSpy 去脫庫(kù)

1. 從DAL/Repository層去反編譯代碼

要想得到明文的數(shù)據(jù)庫(kù)連接串,可以從代碼中反推,比如從 DAL 或者 Repository 中找連接串字段  ConnectionString,我這邊的終端程序是用 wpf 寫(xiě)的,采用的是經(jīng)典的三層架構(gòu),所以在 bin 下可以輕松找到,如下圖:

如何解決配置文件中的數(shù)據(jù)庫(kù)連接串加密了問(wèn)題

接下來(lái)用 ILSPy 反編譯這個(gè) dll。

如何解決配置文件中的數(shù)據(jù)庫(kù)連接串加密了問(wèn)題

從上圖中可以看出,連接串的明文是存放在: OleDbHelper.ConnectionString 中的,然后可以看到,程序中定義了一個(gè) Decrypt  方法專(zhuān)門(mén)用來(lái)解密連接串,哈哈,有了這個(gè)算法,是不是就可以脫庫(kù)啦???如下代碼所示:

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 "";         }     }

如何解決配置文件中的數(shù)據(jù)庫(kù)連接串加密了問(wèn)題

不過(guò)還好,數(shù)據(jù)庫(kù)也是在客戶(hù)那邊獨(dú)立部署的,不存在走外網(wǎng)的情況,不然就玩大了。。。接下來(lái)我們來(lái)看看如何去防范。

2. 加殼/混淆/加密狗

現(xiàn)在市面上商業(yè)版和免費(fèi)版都提供了給C#代碼進(jìn)行加密和混淆,不過(guò)我沒(méi)用過(guò),我想最多在反編譯代碼后閱讀性上增加了一些障礙,這也不過(guò)是時(shí)間問(wèn)題罷了,畢竟SqlConnection,SqlCommand  這些FCL的類(lèi)你是沒(méi)法混淆的,我從這些類(lèi)上反推可以很輕松的就能找到明文的 ConnectionString ,所以這條路我覺(jué)得是走不通的。

3. 將解密算法放在 server 端

既然 解密算法 埋在客戶(hù)端你都能挖出來(lái),那把它放在 server 端不就可以啦?在程序啟動(dòng)的時(shí)候,調(diào)用一下 webapi 進(jìn)行解密,這樣你總沒(méi)轍了吧  ???哈哈,大家可以開(kāi)動(dòng)腦子想一想,這種方法可行不可行?誠(chéng)然,解密算法搬走了,再用 ILSpy  去挖已經(jīng)沒(méi)有任何意義了,但這里有一個(gè)重要突破點(diǎn),不管是用什么形式解密的,最后的連接串明文都是存放在 OleDbHelper.ConnectionString  這個(gè)靜態(tài)變量中,對(duì)吧!接下來(lái)的問(wèn)題就是有沒(méi)有辦法把進(jìn)程中的這個(gè)靜態(tài)變量給挖出來(lái)?你說(shuō)的對(duì),就是抓程序的 dump文件 用 windbg 去挖。

三:使用 windbg 去脫庫(kù)

1. 思路

要想挖出 OleDbHelper.ConnectionString,其實(shí)也很簡(jiǎn)單,在 CLR via C#  第四章中關(guān)于對(duì)象類(lèi)型和類(lèi)型對(duì)象的解讀有這么一張圖,很經(jīng)典。

如何解決配置文件中的數(shù)據(jù)庫(kù)連接串加密了問(wèn)題

從上圖中可以看到,靜態(tài)字段是在 Manager 類(lèi)型對(duì)象 中,實(shí)例字段都是在 Manager 對(duì)象 中,對(duì)照這張圖,我只需要通過(guò) windbg 找到  OleDbHelper 類(lèi)型對(duì)象,也就是所謂的 EEClass。

2. windbg 挖礦實(shí)戰(zhàn)

使用 !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 導(dǎo)出方法描述符的詳細(xì)信息,找到 OleDbHelper類(lèi)型對(duì)象 的 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類(lèi)型對(duì)象 在堆上的內(nèi)存地址。

使用 !dumpclass 導(dǎo)出 Class: 08ecab30 ,從而找到 OleDbHelper類(lèi)的靜態(tài)字段

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:     2       MT    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

從上面導(dǎo)出信息中可以看到 OleDbHelper類(lèi)中 有兩個(gè)靜態(tài)字段: ConnectionString 和  SecurityConnectionString。

使用 !do 打印出兩個(gè)靜態(tài)字段

如何解決配置文件中的數(shù)據(jù)庫(kù)連接串加密了問(wèn)題

看到?jīng)]有,上圖中的兩個(gè)紫色框框就是明文的 ConnectionString 哈,怎么樣??不?。

到此,關(guān)于“如何解決配置文件中的數(shù)據(jù)庫(kù)連接串加密了問(wèn)題”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


分享題目:如何解決配置文件中的數(shù)據(jù)庫(kù)連接串加密了問(wèn)題
分享網(wǎng)址:http://weahome.cn/article/jhsepj.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部