LNK2019: unresolved external symbol @__security_check_cookie@错误原因以及解决方法分析

qin_pp 2013-05-30 03:18:42
在进行内核程序开发过程,我们可能会碰到这个错误。这个错误在编译(Compile阶段)表示正常执行,但是在链接(link阶段)就出出现。另外以一种表现形式为error LNK2001: unresolved external symbol @__security_check_cookie@4。
原因分析:
上述错误解析为:链接阶段有不能识别的解析符号出现,这是因为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
如下图:


两个的区别就是User或者Kernal而已。
更过详细的内容见microsoft 解释http://support.microsoft.com/kb/894573/zh-cn

期待共同学习进步!!!
...全文
748 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qin_pp 2013-05-31
  • 打赏
  • 举报
回复
引用 2 楼 sugar13 的回复:
C语言下定义个 extern int __security_cookie = 0; extern void __security_check_cookie(int){} C++语言下定义个 extern "C" int __security_cookie = 0; extern "C" void __security_check_cookie(int){} 也可以吧..VC6不自带bufferoverflowU.lib之类的库,也懒得去找
有理,回头试一下,只是这是link阶段报错,试一下后再看看啊!
qin_pp 2013-05-31
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
ID:共同学习进步0000001 开个张!
谢谢支持,一起研究,希望有windows驱动开发的一起探讨。
失散糖 2013-05-31
  • 打赏
  • 举报
回复
引用 4 楼 I_FU_LE_YOU11 的回复:
[quote=引用 2 楼 sugar13 的回复:] C语言下定义个 extern int __security_cookie = 0; extern void __security_check_cookie(int){} C++语言下定义个 extern "C" int __security_cookie = 0; extern "C" void __security_check_cookie(int){} 也可以吧..VC6不自带bufferoverflowU.lib之类的库,也懒得去找
有理,回头试一下,只是这是link阶段报错,试一下后再看看啊![/quote] 之前在VC6下用freetype遇到过这个问题,看到未解决的符号就自己定义一下下,也不记得当时具体写的什么,可能写的有出入吧,反正是这么个思路..release下能link过,debug下仍然是无效方法... 后来一狠心就不使用lib库,而是直接把freetype的源码加入工程,就回避了这个问题...现在想重新模拟一下这个问题,发现模拟不出来了....
失散糖 2013-05-30
  • 打赏
  • 举报
回复
C语言下定义个 extern int __security_cookie = 0; extern void __security_check_cookie(int){} C++语言下定义个 extern "C" int __security_cookie = 0; extern "C" void __security_check_cookie(int){} 也可以吧..VC6不自带bufferoverflowU.lib之类的库,也懒得去找
赵4老师 2013-05-30
  • 打赏
  • 举报
回复
ID:共同学习进步0000001 开个张!

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧