天天看点

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

继续阅读