003_Windows下盗取帐号密码的木马程序
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
本课题研究的意义
“知己知彼,百战不殆”,作为一个网络安全工作者,如果想找出防御木马盗取帐号与密码的有效途径,就必须认真地研究木马攻击的技术。在研究木马的攻防过程中,如果能够理清木马所使用手段的发展脉络,就有可能进一步找出木马发展的趋势,并提早思考应对策略。这样的话,我们至少可以为我们所拥有的帐号与密码增加几分安全感。而这个木马程序的设计正是属于第三代木马,当然在整个第三代木马的范围内,它只是一个小小的缩影。不过作为现在主流的木马类型,它所拥有的记录键盘的功能正是我们所需要的。因此希望通过这次的设计,去了解整个帐号被盗的过程,从而找出应对的方法,使我们的帐号与密码更加的安全。
2 需求分析
2.1 木马的分类
根据木马对计算机采取的动作方式,木马可以分为以下几类:
1.远程控制型
这是当今最广泛的特洛伊木马,这种木马起到了远程监控的功能,只要被控主机联到网络,控制者就可以任意控制目标主机。 【www.think58.com计算机毕业论文网】
2.密码发送型
这种类型的木马专门找到所有的隐藏的密码,并且在受害者不知道的情况之下把他发送给控制者,它可以采取多种方式来发送,最基本的方法是通过电子邮件来发送。 [资料来源:http://think58.com]
3.键盘记录型
这种木马比较简单,它只做一种事情,就是记录受害者的键盘动作。
4.毁坏型
大部分木马只是窃取信息,不做破害性的事件,但是毁害型木马却以毁害并且删除文件为己任。
5.FTP型
这种木马打开21号端口,让每个FTP客户端不要密码就可以连接到受控主机,随意窃取受害主机的文件。
6.DoS攻击型
通过植入木马,可以把受控主机当作一个个肉鸡,控制者可以操纵大量的肉鸡来同时对某个主机发起DoS攻击
7.代理型
骇客在进行入侵的时候,为了隐藏自己的信息,他可以找一个代理,通过控制这个代理来达到入侵的木的,就像操纵傀儡一般。
8.反弹端口型
对于有放火墙的受害者,木马可以通过反连端口的方式来达到操纵受害主机的目的,也就是说,木马自己穿越防火墙主动去连接控制者,因为一般木马会采用常用的端口,比如80端口,而且现在的防火墙往往采用严进宽出的方案,所以这种控制很有用。
2.2 木马的特点
2.2.1隐秘性
也就是说,一旦一个木马通过个种手段被引入了主机(这个过程称为 ”植入”),那么它首先要找到一个地方来隐藏起来,等待时机发作,在被植入的主机看起来就好像什么事情都没有。木马能隐藏起来的原因有如下几个:
[资料来源:www.THINK58.com]
1.木马往往比较小,才几十k左右,这样即使执行起来也占不了系统太多的资源。
2.木马往往会隐身在系统文件夹里面,而且或者直接代替了系统文件,或者采用和系统文件相似的文件名,这样即使发现有木马入侵的痕迹,但是你也不能辨认 是哪个文件。
3.木马执行时往往不会在系统中显示出来。 [资料来源:www.THINK58.com]
2.2.2 自动运行性
一个好的木马绝对不可能奢望对方来点击运行,也不能只执行一次,然后随着系统的关机而不再运行,这样的只发作一次的木马是没有什么作用的。木马往往具有自动运行性,也就是说要么随机子的启动运行而发作,要么等某个条件来触发,而这个触发条件应该是很常用的。
2.3 功能需求分析
这个设计属于第三代的键盘记录木马。这种特洛伊木马是非常简单的。它们只做一件事情,就是记录受害者的键盘敲击。更高级的可以在LOG中或者在COOKS中直接找密码。这种特洛伊木马随着Windows的启动而启动。它们记录你使用帐号和密码敲击键盘时的按键情况。也就是说你按过什么按键,种植木马的人都知道,从这些按键中他很容易就会得到你的密码信息,甚至是你的信用卡账号。根据这些这个设计应该具有以下功能:自动隐藏、自动运行和最重要的键盘记录。 本文来自think58
2.3.1 自动隐藏
在任务栏里面实现隐藏是最基本也是最简单的隐藏方式。如果在windows的任务栏里出现一个莫名其妙的图标,那么程序会无条件的失去意义。所以要实现自动隐藏,不管是加载时的隐藏还是运行时的隐藏,对一个木马程序来说是非常重要的。要实现在任务栏中隐藏在编程时是很容易实现的。我以我的设计语言VB为例。在VB中,只要把from的Visible属性设置为False,ShowInTaskBar设为False程序就不会出现在任务栏里了。
另外在Win9x时代,简单地注册为系统进程就可以从任务栏的进程中消失。可是在Windows高版本盛行的今天。这种方法遭到了惨败。注册为系统进程不仅仅能在任务管理器中看到,而且可以直接在Services中直接控制停止。
不过就算这样,我们仍然有方法去消失掉进程,比如,将进程名改为和系统进程名相似,让别人一时间看不出来。另外还有方法就是用HOOK函数实现将进程注入到其他进程当中,比如EXPLORER。EXE。 内容来自think58 [资料来源:http://THINK58.com]
2.3.2 自动运行
一个好的木马绝对不可能奢望对方来点击运行,也不能只执行一次,然后随着系统的关机而不再运行,这样的只发作一次的木马是没有什么作用的。木马往往具有自动运行性,也就是说要么随机子的启动运行而发作,要么等某个条件来触发,而这个触发条件应该是很常用的。而对于此设计而言,不论是那种自动运行方式都是可以的,他的关键不在这个上面,他的关键仍然在键盘记录上,那是一个庞大的工程。而实现自动运行这一功能却有许多的方法,你完全可以根据自己的需要去找寻最适合你自己的方式。
以下是实现自动运行的方式,具体怎么实现的这里就不做介绍了。
1.在Win.ini中启动
2.在System.ini中启动
3.利用注册表加载运行
4.在Autoexec.bat和Config.sys中加载运行
5.在Winstart.bat中启动
6.启动组
7.*.INI
8.修改文件关联
9.捆绑文件
10.反弹端口型木马的主动连接方式
另外,经过熊猫烧香的启发现在很多木马也可以利用AUTORUN.INF来实现自动运行。 本文来自think58
2.3.3 键盘记录
这个功能是该设计的最重要的部分,他既是核心也是基础,因为我们所需要的所有信息都是由这个部分完成的。实现键盘记录这个功能时,大多数人想到的应该是使用钩子技术,HOOK用户的击键行为。其实除此之外,还有一API函数,同样可以轻松进行键盘记录,那就是GetAsyncKeyState,这个函数根据虚拟键表判断按键类型。返回值为一个16位的二进制数,如果被按下则最高位为1,即返回-32767,但是如果需要对键盘进行全局性的记录,则需要与另一个API函数GetKeyState配合使用才能实现。原因在于GetAsyncKeyState函数只在按键的瞬间执行一次,如果按下的键是开关键(如:caps lock),那么过了那一瞬间GetAsyncKeyState函数则不起任何作用。而这个时候就需要用GetKeyState来判断该开关键是否按下。
那这两个函数组合起来的实际作用是什么呢?为什么又要将这两个函数组合起来用?其实原因很简单,因为每个键的虚拟码是唯一,在这样一种情况下,不管你是在大写情况还是小写情况下,你按下的键记录下来的信息都是一样的。这个时候就需要一次判断,你需要判断有两个键是否按下,一个是caps lock是否按下,一个是shift是否按下,因为shift不属于开关键,那它自然就不需要用GetKeyState函数,但是caps lock是一个开关键它在这种情况下就需要用GetKeyState函数。所以在这种特例下我们就需要用GetKeyState函数了。另外insert这个键也是一种特例它也需要用GetKeyState函数来判断。
think58好,好think58 [资料来源:http://think58.com]
与HOOK函数相比使用这两个函数进行键盘记录虽然在程序上显的比较冗长,但是它却更加的简单,而且也不容易出现错误。而HOOK函数虽然使用起来,在代码上看起来可能比较简单,但是它却很容易暴露在杀毒软件的查杀之下。
另外,还有一种键盘记录方式,那就是使用一个功能强大的SendMessage函数,在其它API函数的配合下,直接抓取玩家输入的游戏帐号和密码!但是这个方法实现难度很大,在Win9X下运行虽然没问题,但是现在大家使用的操作系统都是WinNT/2000以上的,在这些系统当中禁止不同的进程间相互访问数据,如果要用SendMessage函数实现键盘记录则需要用到其它API创建一个数据共享或者编写一个DLL文件实现数据共享才行。
2.4 性能需求
1.整个设计都应该尽量遵守所有木马程序的共通点——简约而不简单。也即用最少的代码实现最大的功能,这样做的目的在于,最后所生成的可执行文件小便于隐藏,而且这样的文件执行起来也不占用太的系统资源,使使用计算机的人不容易发现自己已经中招了。
2.该设计虽然为木马程序,但是也必须设计一个友好界面去简化一些如修改代码之类的麻烦事情。
3.该设计本身运行对计算机硬件平台应无要求,对操作系统平台应满足基本不受WIN系列的版本影响而失去作用。 [来源:http://www.think58.com]
2.5 程序开发环境介绍
该设计使用语言为Microsoft Visual Basic6.0,所使用的操作系统为WinXP SP2。另外硬件环境为,CPU为AMD xp2000+;内存 DDR333 256M。
3 木马程序的设计与实现
3.1 设计
3.1.1 设计逻辑图
图1 设计逻辑图
如图1所示,设计思路为,当用户开启计算机的时候程序随着计算机的启动而运行。当用户进行登陆帐号操作的时候,程序开始进行键盘操作的记录,并在用户登陆完成后,保存记录。而在程序的整个运行期间,程序都应该是处于隐藏状态。
该设计以键盘记录功能为中心,用自动运行功能与自动隐藏功能去完善整个木马程序的设计。以此保证该木马程序的生命力和使命完成情况。
think58 [资料来源:www.THINK58.com]
[资料来源:www.THINK58.com]
3.1.2 具体功能划分
根据设计功能需求分析,该设计主要划分为三个模块,最终的设计为这个三个模块的有机组合完成。
1.自动隐藏模块
该模块是保证整个木马程序能顺利运行的关键所在。就想前面介绍的一样,如突然跳一个不明的程序出来运行,那么程序将无条件的失去意义。所以,在木马程序运行期间,都应该保证,程序是隐藏起来的。这样我们才有机会去做我们想做的事情。
2.自动运行模块
一个好的木马绝对不可能奢望对方来点击运行,也不能只执行一次,然后随着系统的关机而不再运行,这样的只发作一次的木马是没有什么作用的。木马往往具有自动运行性,也就是说要么随机子的启动运行而发作,要么等某个条件来触发,而这个触发条件应该是很常用的。不管怎么做,我们最终所必须要实现的就是,不能使木马程序只运行一次,只运行一次就失去了我们的目的,进行键盘记录盗取帐号与密码。所以,考虑好这个模块是很关键的,它是我们有没有必要进行其他模块编写的理由。
3.键盘记录模块
这个模块是整个程序的核心与基础所在,我们所要获取的所有信息都是由这个模块完成。所以在进行这个模块的设计时我们应考虑的更加严谨,应该尽量减少BUG的存在。
在设计这个模块时, HOOK函数是一个很不错的想法。其实除此之外,还有一API函数,同样可以轻松进行键盘记录,那就是GetAsyncKeyState,这个函数根据虚拟键表判断按键类型。返回值为一个16位的二进制数,如果被按下则最高位为1,即返回-32767,但是如果需要对键盘进行全局性的记录,则需要与另一个API函数GetKeyState配合使用才能实现。原因在于GetAsyncKeyState函数只在按键的瞬间执行一次,如果按下的键是开关键(如:caps lock),那么过了那一瞬间GetAsyncKeyState函数则不起任何作用。而这个时候就需要用GetKeyState来判断该开关键是否按下。 think58好,好think58
另外,使用一个功能强大的SendMessage函数,在其它API函数的配合下,直接抓取玩家输入的游戏帐号和密码。
但是,HOOK函数的隐藏性不是很好,他很容易就被杀毒软件发现,特别是专杀工具。而SendMessage函数这个方法实现难度很大,在Win9X下运行虽然没问题,但是现在大家使用的操作系统都是WinNT/2000以上的,在这些系统当中禁止不同的进程间相互访问数据,如果要用SendMessage函数实现键盘记录则需要用到其它API创建一个数据共享或者编写一个DLL文件实现数据共享才行。这样的话无形中给设计带了很多逻辑上的问题。最后,GetAsyncKeyState函数虽然代码上会带来一点冗长,但是它不存在隐藏性,与逻辑上的问题。
copyright think58 [版权所有:http://think58.com]