天天看點

LNK2019: unresolved external symbol @__security_check_cookie

在進行核心程式開發過程,我們可能會碰到這個錯誤。這個錯誤在編譯(Compile階段)表示正常執行,但是在連結(link階段)就出出現。另外以一種表現形式為error LNK2001: unresolved external symbol @[email protected]。

原因分析:

上述錯誤解析為:連結階段有不能識别的解析符号出現,這是因為microsft自從vs2002開始引入了一種新的編譯開關選項“/GS”(好像表示的是Generation Security),表示生成安全的檢測代碼,我們在編輯核心驅動程式階段,需要将link标簽下面的工程選項進行替換為我們設定的工程的選項,這樣,就将“/GS”開關給關閉了。那麼,在我們自身編寫的程式中不會出現錯誤,但是在連接配接階段,調用WDK内部函數時候,這些函數設定的預設檢測security_cookie選項的,但是,我們進行了連結開關選項“/GS”關閉,是以,就會出現不能識别的問題。至于什麼是Security_cookie,這個問題就要涉及到函數調用過程中的緩沖區溢出漏洞攻擊,microsoft為了解決這個問題,在vs2002之後的庫裡面添加了進行緩沖區溢出檢測,防止函數調用過程中出現緩沖區漏洞攻擊,保證函數正确傳回不被攻擊利用。這一領域的鬥争漫長而且精彩異常。如何防範以及具體的緩沖區溢出檢測技術,比較繁雜。

大家隻要知道,這個問題關鍵就是我們關閉了這個生成檢測開關,但是庫函數中預設的是調用這個檢測來防範緩沖區漏洞攻擊。

說到這裡,大家應該很清楚怎麼解決這個問題了。

解決方法:

既然是由于連結階段不能識别安全檢測緩沖區漏洞攻擊security_cookie,那麼我們隻需要将這個庫在連結階段加上就好了。以VC6.0為例說明【project】->【Setting】->【link】->【Object/lib Module】添加這個安全檢測技術需要的庫就可以了。

注意,如果是編寫使用者态的程式,那麼需要添加的庫就是bufferoverflowU.lib

如果是編寫的是核心态的程式,那麼需要添加的庫就是bufferoverflowK.lib

如下圖:

LNK2019: unresolved external symbol @__security_check_cookie

兩個的差別就是User或者Kernal而已。

更過詳細的内容見microsoft 解釋http://support.microsoft.com/kb/894573/zh-cn

期待共同學習進步!!!

更多1

繼續閱讀