猜sql server密碼用sqlconnection的話cpu100%,內存只升不降。最後直接用odbc api解決。

猜sql server密碼幹什麼。玩過黑克得都知道。

用c#做個猜sql server密碼的程序,聽起來挺簡單吧。

sqlconnection類,構造連接字符串,然後try open()方法,如果沒有catch到異常正常open了,那麼說明密碼猜對了,如果open有異常,那麼如果是異常的number是10060/10061,那麼連接不上,如果是18452則是不允許連接,如果是18456則是密碼錯誤是吧,很簡單吧。

 

但是事實卻並沒有這麼美好。這樣猜密碼造成的結果就是cpu佔用率100%,內存佔用直線上升,甚至卡死機器。

 

這位說了,sqlconnection用完了close或者dispose了嗎。

全加上了,一樣。即使using(sqlconnection……)這種也一樣。

而且肯定不是程序邏輯問題造成的,我儘量弄成最簡單的幾行了,我特意連遞歸都沒用,直接本線程完了啓動另一線程代替遞歸。

 

看着這樣的程序應該是挺小的一個小玩意吧,偏偏他就這麼大,內存呼呼的只升不降,真是百思不得其解

 

我用vs2010帶的那個性能分析工具看了一下

cpu佔用率高全都被sqlconnection.open()這句佔了,內存也是因爲這個,難道因爲連接池還是什麼?怎麼關呢?

 

沒辦法,sqlconnection是不能用了,我想用system.data.odbcconnection吧,一樣!!!

========================================

怎麼辦呢,要想不卡內存少,直接用tcpclient發送數據模擬sqlserver登錄最好,但是我sniffer了一下,sql server連接好像那都是加密的是吧。

 

再就是直接用sql server驅動的api,看了一下是sqlsrv32.dll,不會用啊,還有一種是odbc32.dll裏面的api也挺麻煩啊。

========================================

最後找了一個折中的辦法,用ado

在vs裏添加com引用Microsoft ActiveX Data Objects 2.0 Library,ado有好幾個版本,選一個最低的吧,越低應該越快吧,反正就open一下就完了。

 

然後sqlconnection那裏改成adodb.connection,是個接口而不是類,ado裏沒有類。

構造連接字符串多了一句。driver={SQL Server};

就是用sql server的驅動了

然後繼續猜密碼。

cpu佔用依然很高,基本固定在70/80%左右,但是比sqlconnection那100%還是強多了,起碼機器還能動嘛。

好處是內存,用ado,整個程序內存基本在30兆不動,而且open了我都不close,峯值才33兆,這比sqlconnection那動輒上到500、600百兆強老了,主要是看sqlconnection那內存嘩嘩的只升不降看着揪心啊。

========================================

用ado猜到密碼後,下面就可以用sqlclinent命名空間的類去執行一些東西了

 

 

 

疑問:sqlconnection爲什麼只升不降?我對數據庫非常不熟,聽說有個連接池,聽說即使close或者disopse也不會析構,而是放到連接池中等待再次連接,只有多了纔會析構是吧。用sqlconnection的時候比如程序到了500兆了,突然一下子就降到200兆(疑似gc了),然後又嘩嘩的升了,是不是就是這麼造成的呢。

 ==========================

 

下午找到了一個終極解決辦法,用odbc32.dll的SQLDriverConnect這個api,這應該是除了直接用socket模擬sql server登錄和直接用sql server驅動外,最高效的辦法了。果然,cpu佔用率比用ado又小了,內存佔用也小了,只有20來兆了。但是用完了得用sqlfree**的api釋放內存,不然內存也是隻升不降。

 

但是奇怪的是,它返回的native error number,如果密碼錯誤,是18456是一樣的,但是如果“服務不能存在或被拒絕”這種本來應該返回10060或者10061的,但是sqlerror api卻返回的是17,這個17號錯誤查詢sql server文檔的錯誤和事件參考(數據庫引擎) > 數據庫引擎錯事件和錯誤 > 系統錯誤消息 > ,並沒有這一號錯誤啊。

發佈了31 篇原創文章 · 獲贊 10 · 訪問量 65萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章