自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

配置文件中的數(shù)據(jù)庫連接串加密了,你以為我就挖不出來嗎?

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

[[337741]]

一:背景

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)典的三層架構,所以在 bin 下可以輕松找到,如下圖:

 

接下來用 ILSPy 反編譯這個 dll。

 

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

  1. class Program 
  2.     { 
  3.         static void Main(string[] args) 
  4.         { 
  5.             var str = "XfES27am6Muw48iB1GlMVqvUbq7/Pp9n4XbZJsDu19YDr/Zdb3m7KT6haD7f9HLj/ZEvIiZbmSU4O5L9g03Y5IUB6KLCZI7s3nDLwTIC+bXLf5quu/r8ZAI+rgNnsNZdwoDfquRLQy5Cf2X8/MFDOcMNaZYMpTYeHsZoEERU/TP9t3n5QllJTihrmDFbiGHLqe1kfN3uB3g1kgs0oobIEfNPr09kQ/pFgzZi/kZCrK10PLZZ0pFj1YU5ReFqBsdBlecV3D2Zl3lx1Ibls24t7w=="
  6.  
  7.             Console.WriteLine(Decrypt(str)); 
  8.         } 
  9.  
  10.         public static string Decrypt(string str) 
  11.         { 
  12.             if (!string.IsNullOrEmpty(str)) 
  13.             { 
  14.                 DESCryptoServiceProvider descsp = new DESCryptoServiceProvider(); 
  15.                 byte[] key = Encoding.Unicode.GetBytes("Oyea"); 
  16.                 byte[] data = Convert.FromBase64String(str); 
  17.                 MemoryStream MStream = new MemoryStream(); 
  18.                 CryptoStream CStream = new CryptoStream(MStream, descsp.CreateDecryptor(keykey), CryptoStreamMode.Write); 
  19.                 CStream.Write(data, 0, data.Length); 
  20.                 CStream.FlushFinalBlock(); 
  21.                 return Encoding.Unicode.GetString(MStream.ToArray()); 
  22.             } 
  23.             return ""
  24.         } 
  25.     } 

 

不過還好,數(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# 第四章中關于對象類型和類型對象的解讀有這么一張圖,很經(jīng)典。

 

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

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

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

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

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

使用 !dumpmd 導出方法描述符的詳細信息,找到 OleDbHelper類型對象 的 EEClass 地址

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

上面的 Class: 08ecab30 就是 OleDbHelper類型對象 在堆上的內(nèi)存地址。

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

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

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

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

 

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

四:總結

 

當認識到上面的兩種脫庫方式,你應該就能想到,其實你在程序中連接數(shù)據(jù)庫,這本身就是一種錯,操作系統(tǒng)都能給你盜版,何況你這區(qū)區(qū)一個小軟件?個人覺得完全杜絕的方式那應該就是:滅掉本地的sqlserver,讓所有的數(shù)據(jù)獲取都由遠端的 webapi 提供,當然這又是在脫離業(yè)務聊技術啦!

本文轉載自微信公眾號「一線碼農(nóng)聊技術」,可以通過以下二維碼關注。轉載本文請聯(lián)系一線碼農(nóng)聊技術公眾號。

 

責任編輯:武曉燕 來源: 一線碼農(nóng)聊技術
相關推薦

2022-02-28 07:37:02

Java配置參數(shù)

2021-07-26 09:43:24

代碼MapStructs項目

2023-09-21 15:20:49

算法開發(fā)

2021-01-06 10:52:02

MySQL數(shù)據(jù)庫安全

2015-06-01 15:11:37

數(shù)據(jù)庫update

2023-02-07 13:51:11

SQLupdate語句

2020-05-29 10:18:58

python開發(fā)代碼

2024-05-27 09:52:00

Nacos加密配置

2022-11-21 10:49:29

Nacos配置加密

2017-12-13 14:41:45

2011-03-28 13:25:27

MySQL數(shù)據(jù)庫哈希加密

2022-06-01 11:52:42

網(wǎng)站客戶端網(wǎng)絡

2018-12-07 13:16:14

硬件元器件BOM

2011-08-22 16:08:48

2021-10-18 09:09:16

數(shù)據(jù)庫

2020-04-09 10:49:19

VMware主機配置

2009-01-20 13:57:02

網(wǎng)絡硬盤Google云計算

2009-02-09 12:52:32

文件加密Oracle數(shù)據(jù)庫

2021-02-02 11:13:41

BigDecimal支付電商

2024-03-13 10:40:00

性能探測工具SQL語句數(shù)據(jù)庫
點贊
收藏

51CTO技術棧公眾號