久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

141次閱讀
沒有評論

共計 3727 個字符,預(yù)計需要花費 10 分鐘才能閱讀完成。

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

一:背景

1. 講故事

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

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

二:使用 ILSpy 去脫庫

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

要想得到明文的數(shù)據(jù)庫連接串,可以從代碼中反推,比如從 DAL 或者 Repository 中找連接串字段  ConnectionString,我這邊的終端程序是用 wpf 寫的,采用的是經(jīng)典的三層架構(gòu),所以在 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   } }

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

2. 加殼 / 混淆 / 加密狗

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

3. 將解密算法放在 server 端

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

三:使用 windbg 去脫庫

1. 思路

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

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

2. windbg 挖礦實戰(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 類型對象 的 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 類型對象 在堆上的內(nèi)存地址。

使用 !dumpclass 導(dǎo)出 Class: 08ecab30,從而找到 OleDbHelper 類的靜態(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 類中 有兩個靜態(tài)字段:ConnectionString 和  SecurityConnectionString。

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

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

到此,關(guān)于“如何解決配置文件中的數(shù)據(jù)庫連接串加密了問題”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-27發(fā)表,共計3727字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 北京市| 万宁市| 西城区| 阳城县| 印江| 太原市| 九台市| 喀喇| 西丰县| 治多县| 叙永县| 南陵县| 轮台县| 汉寿县| 淅川县| 巴彦县| 宜都市| 威远县| 大关县| 金坛市| 融水| 和硕县| 三亚市| 新疆| 宁明县| 蒙阴县| 宿州市| 晋宁县| 富阳市| 竹北市| 七台河市| 宣化县| 孝昌县| 隆回县| 阿克陶县| 武宁县| 大港区| 衢州市| 绥滨县| 宣化县| 巫溪县|