书名:Windows黑客编程技术详解
ISBN:978-7-115-49924-0
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 甘迪文
责任编辑 傅道坤
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书介绍的是黑客编程的基础技术,涉及用户层下的Windows编程和内核层下的Rootkit编程。本书分为用户篇和内核篇两部分,用户篇包括11章,配套49个示例程序源码;内核篇包括7章,配套28个示例程序源码。本书介绍的每个技术都有详细的实现原理,以及对应的示例代码(配套代码均支持32位和64位Windows 7、Windows 8.1及Windows 10系统),旨在帮助初学者建立起黑客编程技术的基础。
本书面向对计算机系统安全开发感兴趣,或者希望提升安全开发水平的读者,以及从事恶意代码分析研究的安全人员。
甘迪文,北京邮电大学网络空间安全学院在读研究生,Write-Bug技术共享平台(www.write-bug.com)创始人,2019年秋季将步入清华大学攻读软件工程专业的博士学位。对信息安全领域兴趣颇深,常利用课余时间自学和钻研安全开发技术。擅长Windows系统安全程序开发,熟悉Windows内核编程,闲来无事之时喜欢开发功能各异的小软件。
本书能够出版发行,需要感谢的人很多,由于篇幅有限,不能一一列举。感谢人民邮电出版社傅道坤编辑对本书的认可与支持,没有他,本书只是我个人的一个想法而已。感谢北京邮电大学崔宝江老师在我研究生期间的传道、授业、解惑,他使我的技术水平得到历练和提升。感谢中国农业大学李婉婷、李思捷和夏琨三位好友,他们对本书的撰写提出许多关键建议,并对书稿文笔进行修改润色,让书稿更加通俗易懂。最后,感谢家人一直以来的支持与鼓励。
信息安全行业是一个朝阳行业,国家、企业以及高校都予以高度重视。其中,Windows系统的市场占有率高达90%以上,因此Windows系统上的安全需求更多,安全攻防更激烈。
我从本科开始就对黑客技术感兴趣,通过自学,积累了许多这方面的开发技术,并逐渐有了自己的心得和感悟。到了研究生阶段,之前积累的知识帮助我快速而高效地完成了项目的安全开发工作,但是却发现周围仍有很多安全相关专业的同学仍陷于开发难的苦恼中,于是便萌生了写作本书的想法,希望通过分享自己积累的心得体会,让更多的初学者能少走些弯路。
古人云“知其然,知其所以然”。作为一个初学者,首先要做到的是“知其然”,即学会怎么去做;然后再去理解这样做的缘由,即“知其所以然”。本书着重于“知其然”阶段,编写一本能够让初学者看懂的技术科普书。所以,本书在详细介绍每一种黑客技术时,均是按照下述7个模块进行写作的。
本书所包含的知识点循序渐进,语言平实,每个技术点条理清晰,主要有3个突出的特点。
由于本书是基于每一个技术点去撰写的,章节独立性较高。所以,读者可以按顺序阅读,也可以选择自己感兴趣的章节跳读。对于每一章的阅读,建议依次按照背景、函数介绍、实现原理、编码实现、测试和总结的顺序进行阅读,这样才能更好地提高自己的安全开发水平。
本书分为“用户篇”(第1~11章)与“内核篇”(第12~18章)两篇,总计18章。为了帮助读者更好地了解本书所讲的内容,下面列出了每章所讲的主要内容。
由于本书中的代码均使用C/C++来编写,因此掌握C/C++语言的概念可以更容易理解本书。如果不具备编程知识,也可继续学习并理解所有技术点的开发流程。对于书中的内核层开发部分,即使读者没有接触过内核开发,也可根据本书的内容一步步学习内核开发技术。
最后需要提醒大家的是:
根据国家有关法律规定,任何利用黑客技术攻击他人计算机的行为都属于违法行为。希望读者在阅读本书后一定不要使用本书介绍的技术对他人的计算机进行攻击,否则后果自负。
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
本书提供如下资源:
要获得以上配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
如果您是教师,希望获得教学配套资源,请在社区本书页面中直接联系本书的责任编辑。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。
如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
平常计算机上使用的应用程序(例如截屏软件、音乐播放器、图片查看器等),都运行在用户层上,属于用户程序。在Windows系统上开发的用户程序,本质上是通过调用WIN32 API函数来实现程序功能的。WIN32 API是一些预先定义的函数,目的是提升开发人员的开发效率,无需访问源码或理解内部工作机制的细节。
与普通的用户程序一样,病毒木马也是通过调用WIN32 API函数来实现窃取用户数据的。实质上,它也是一个应用程序,是一个隐蔽而特殊的软件。 本书根据病毒木马运行在用户层还是内核层,分成了用户篇和内核篇两部分。首先介绍用户篇,总计11章,主要内容有开发环境、基础技术、注入技术、启动技术、自启动技术、提权技术、隐藏技术、压缩技术、加密技术、传输技术和功能技术等。
俗话说“工欲善其事,必先利其器”。选择一个好用的开发平台,会让程序开发事半功倍。对于Windows下的黑客来说,首选的开发平台自然是VS“大礼包”——Microsoft Visual Studio。它在Windows程序开发路上是一块不错的“垫脚石”,可以使编程过程更加灵活、得心应手。
Microsoft Visual Studio是流行的Windows平台应用程序的集成开发环境,目前最新版本为Microsoft Visual Studio 2017版本,基于.NET Framework 4.5.2。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等。所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework和Microsoft Silverlight 及Windows Phone。
本章将介绍VS 2013的安装过程、使用VS 2013开发项目过程中的编译设置以及Debug模式与Release模式的注意事项。
本书所有的程序开发均是在VS 2013上完成的,在正式介绍VS 2013开发环境之前,需要到官网上下载安装文件镜像VS 2013.5_ult_chs.iso以及多字节MFC库安装文件vc_mbcsmfc.exe。
上述两个安装文件下载完毕之后,就可以进行安装了,本书使用的操作系统是64位Windows 10。安装步骤如下所示。
首先,直接双击运行VS 2013.5_ult_chs.iso,虚拟镜像文件就会自动加载。打开加载文件的根目录,找到vs_ultimate.exe文件并双击运行。设置VS 2013安装目录,并勾选同意许可条款选项,如图1-1所示,然后单击下一步。
然后,选择要安装的功能模块。为了安装完整,本书安装了全部功能。选择完毕后,单击安装按钮进行安装,如图1-2所示。
图1-1 设置安装路径
图1-2 选择安装模块
之后要等待一段时间,根据计算机配置的不同等待时间也不同。快则10到20分钟,慢则要一个多小时,而且中途还需要重启安装,如图1-3所示。
在VS 2013安装完成之后,继续安装多字节MFC库,这个库在开发MFC工程项目时需要用到。单击vc_mbcsmfc.exe程序,选择安装目录以及勾选同意许可条款选项,并单击安装按钮进行安装,如图1-4所示。
图1-3 等待安装
图1-4 安装多字节MFC库
上述都安装完成后,即可使用VS 2013来创建MFC项目、控制台项目或是DLL项目了。
初学编程时,大多数教程使用的开发环境是VC 6.0。VC 6.0编译的是控制台程序或者DLL,直接编译出来就可以在其他平台上运行或者调用,不需要额外加载运行库DLL等。若想使用VC 6.0编译出来的MFC程序,编译的时候设置在静态库中使用MFC,即将MFC所需的DLL组件静态编译到程序里,这样程序在任意平台上运行时都不需要额外附加MFC所需的DLL文件。
随着技术提升,高效而稳定的开发环境成为大家追求的目标。因此,VC 6.0慢慢淡出了视线,转而使用VS 2010、VS 2012、VS 2013、VS 2015,甚至现在的VS 2017。尽管VS系统开发环境的功能确实比较全面,能够提升开发效率,但是,在VC 6.0中一些习以为常的习惯(例如编译的设置等),都悄无声息地透露着区别。所以,本书的目的就是教你在使用VS 系列开发环境的时候,如何设置编译选项,使得生成出来的程序可以直接在其他计算机上运行,就像VC 6.0一样,不需要额外加载DLL文件。
之所以把控制台程序和DLL程序的编译设置放在一起,是因为它们的设置是一样的。本书以VS 2013开发环境为例,演示具体的操作步骤。
打开项目工程之后,右击项目工程,选中并单击“属性”,打开属性页。属性页界面如图1-5所示。
图1-5 属性页界面
在“平台工具集”里选择“Visual Studio 2013 - Windows XP (v120xp)”,即带有“Windows XP (v120xp)”字样的选项,这表示程序兼容XP系统,它可以在XP系统下正常运行。设置兼容XP系统的界面如图1-6所示。
图1-6 设置兼容XP系统
继续上面的操作,单击左侧“C/C++”前面的三角形标号,展开选项;然后,单击“代码生成”选项,这时便可以在右侧页面看到“运行库”的默认值是“MDd”。如果此时你的项目是Debug模式的,则选择“MTd”;若是Release模式的,则选择“MT”。其中MT是“Multithread, Static Version”的缩写,即多线程静态版本;d是“Debug”的缩写,即Debug模式。运行库的设置界面如图1-7所示。
图1-7 选择运行库
根据上面两步操作——设置兼容XP系统和静态编译运行库,编译出来的控制台程序和DLL程序就能直接在Windows系统上加载运行了。
对于MFC程序,除了上面两步操作之外(注意,MFC程序的编译设置也要进行上面两步操作),还需要额外的操作,就是在“MFC的使用”选项中设置“在静态库中使用MFC”。这样,VS开发环境就会把MFC所需的DLL文件都静态编译到程序里,因此生成的文件也自然会变大。但是,这样的程序就可以直接在其他Windows系统的计算机上运行,并且不需要额外加载其他文件。静态编译MFC库的设置界面如图1-8所示。
图1-8 静态编译MFC库
上述罗列了控制台程序、DLL程序以及MFC程序在VS系列开发环境中的编译设置,大家按照以上操作,设置兼容XP系统、选择静态版本的运行库,如果是MFC程序,则还需要额外设置静态编译MFC库,这样生成的程序就可以不依赖于开发环境而独立运行在其他Windows系统之上。
以前有网友向我提出过这样的一个问题:“程序在Debug模式下运行正常,而在Release模式下运行却出错。”当时就下意识地认为,这不可能,肯定是改动代码了!但是当自己编写的程序也遇到类似情况后,我才开始正视这个问题,并研究相应的解决方法。希望下面的思路有助于读者避开陷阱,少走弯路。
在VS开发环境中,Debug模式和Release模式并没有本质上的区别,它们编译使用的都是同一份源码,这是众所周知的。
其中,Debug通常称为调试版本。通过一系列编译选项的配合,编译结果通常包含调试信息,而且不进行任何优化,这为开发人员提供强大的应用程序调试能力。而Release通常称为发布版本,是为用户使用的。一般,客户不允许在发布版本上进行调试,所以它不保存调试信息,同时,它往往进行各种优化,以期达到代码量最小和速度最优,为用户的使用提供便利。
也就是说,Debug模式和Release模式的唯一区别,就是在VS开发环境里编译选项的区别。在明确了这一点之后,就不得不重新思考程序的编译设置了。
首先,程序在Debug模式下正常运行,所以,代码肯定是没有问题的,这排除了代码有问题的假设。
然而,程序在Release模式下编译通过,运行却出错了。通过上面的介绍,我们知道Debug模式和Release模式只是编译选项的区别,所以确定出错是由一些编译设置的问题导致的。
考虑到程序里面可能使用到了开源的第三方库,而且第三方库也是自己编译出来的。在Release模式下出错的位置,也是在执行第三方库代码时候报错的位置。这样一来,便确定了出错原因:在调用第三方库时,Debug模式和Release模式的编译选项和第三方库的编译选项可能没有对应,这很有可能就是运行库的设置问题。
在Release模式下,打开项目工程的属性页后,展开“C/C++”,单击“代码生成”,更改“运行库”里的选项,依次更改为“多线程(/MT)”“多线程调试(/MTd)”“多线程DLL(/MD)”“多线程调试DLL(/MDd)”进行测试。运行库的设置界面如图1-9所示。
经测试发现,在更改为“多线程调试(/MTd)”的时候,生成的程序可以正常运行,问题得以解决。正如之前所介绍的,在“/MTd”中,MT表示“Multithread, Static Version”,d表示“Debug”。该程序是在Release模式下,一开始便选择了“/MT”去编译。设置为“多线程调试(/MTd)”的时候,程序正常,原因是第三方库在Release模式下编译的时候,运行库设置为“多线程调试(/MTd)”,从而导致这个问题的产生。
图1-9 运行库设置
代码在Debug和Release模式中都是相同的,如果出现类似编译错误的情况,则不妨参考本章的检查方法,先判断程序中是否导入了第三方库,程序与第三方库的运行库是否对应等。总之,可以依次选择“运行库”中的设置,测试一遍看看再说。