- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
下载
第5章 充分利用Win32编程技术
本章介绍常见编程错误,可以帮助程序员避开简单的编程陷阱。本套书的每一卷的第 5章都
包含这些内容,每一卷的内容不同:
第1卷:概述及解决方案总结
第2卷:避免非法的有效性
第3卷:R P C错误及内核模式的分类符
第4卷:缓冲区溢出及其他错误
第5卷:内存滥用及计算错误
并非所有的这些陷阱都会出现在 Wi n 3 2编程过程中(例如,有些是基于网络服务的)。然而,
既然在所有Wi n d o w s应用程序中都应该避免这些常见编码错误,那么在此提供所有这些错误的
清单可以为使用本套书更加方便。
本书是“Wi n 3 2开发人员参考库”套书的第 4卷,本章中所提供的错误说明与例子将有助于
读者在从事开发工作的过程中避免出现缓冲器溢出与其他错误。下面将对这些错误情况进行说
明。
5.1 缓冲器溢出
缓冲器溢出可能会导致各种各样的问题,开发人员的简单错误或者他人对系统进行的攻击
都有可能会导致出现缓冲器溢出问题。虽然避免缓冲器溢出的工作并不困难,但如果在软件开
发过程中没有考虑避免缓冲器溢出问题,则有可能会导致非常严重的后果。为了有效地避免缓
冲器溢出问题,应该在软件开发的过程中遵守以下设计规则:
• 在访问某个缓冲器时,应该记住检查实际的缓冲器大小,而不能只是查看关于缓冲器的已
经最大大小。
• 注意算术计算中的溢出问题,从而确保缓冲器检查时不会因为算术计算的溢出而出错。
• 验证对枚举型数的进行的算术计算结果值仍然是有效枚举数。
• 不能期望缓冲器大小已经经过了测试,而应该进行实际的测试工作。
为了避免缓冲器溢出,还必须注意以下问题:
• 在使用偏移地址时,应该确保结果地址位置没有越过缓冲器的两个边界。
• 在进行复杂的大小计算时,应该确保缓冲器总大小大于固定尺寸。
• 注意没有以N U L L 结尾的字符串,对于这种字符串,如果已知字符串大小,就应该使用这
个信息。
• 在完成枚举数计算之后,检查计算结果是否在枚举数的最小值到最大值之间。
• 在进行外部数据与内部数据的比较时,首先进行数据尺寸的比较,然后使用其中尺寸较小
的进行比较。
第5章 充分利用Win32编程技术使用25
下载
5.1.1 简单缓冲器溢出
简单缓冲器溢出问题的最佳解决方案就是在对缓冲器引用之前首先检查缓冲器的边界。但
是,有两种情况应该引起特别的重视。
一种需要引起注意的情况是在向堆栈缓冲器中写入数据。如果在向堆栈缓冲器中写入数据
的过程中超过了缓冲器的边界,就可能会使得返回地址指向一个任意值,从而导致错误代码的
执行。另一种需要引起注意的情况是无终止符字符串。在许多情况下(例如内核模式与网络结
构),字符串都是直接用大小指定,而不是给出 N U L L作为终止符。在这些情况下,就不能利用
N U L L终止符,而必须使用字符串大小。
一条通用的规则就是,应该记住根据缓冲器的上界与下界检查缓冲器的访问,而不能仅仅
根据已知的最小/最大值进行检查。
实例
N T S T A T U S
AppBug(IN UNICODE_STRING *String)
{
NTSTATUS Status;
UNICODE_STRING CapturedString;
WCHAR *Buffer =NULL;
try {
P r o b e F o r R e a d ( S t r i n g ,
sizeof (UNICODE_STRING),
4 ) ;
CapturedString =*String;
P r o b e F o r R e a d
文档评论(0)