再过几天期末考试了,还有好多要复习。。蛋都快碎了。最近在看老狼的gh0st内核编程,想了很久要不要写文章,最后还是觉得很有必要,原因过一会讲。
先送上老狼的gh0st无加密(lxe格式)视频下载地址:
http://phith0n.400gb.com/u/29415/3193732
其中包含的gh0st源码(乱七八糟的被我的卡巴斯基杀过一遍,仅仅是源码):http://www.400gb.com/file/23820009
在写东西前我要说一下,我虽然说研究远控的源码,但我告诉你我以前包括以后从未也从不想使用远控来控制中国人的电脑。我希望你们大家也一样,仅仅只是对编程感兴趣,而不是为了违法的目的去使用代码。
好了,进入主题。老狼的gh0st内核编程教程,我认为是国内绝无仅有的一套比较全的远控编写的教程,它很详细,基本上就是教你重新打造一款远控,使用gh0st内核。
但是为什么我还要写这一套文章,既然教程都有了。我认为这套教程有一些很致命的问题:
1.不想吐槽老狼英语口语水平
2.老狼在教程伊始没有系统地给大家介绍远控的概念。什么是服务端,什么是客户端之类的问题。(好像老狼在他之前其他教程里讲过,但在网上传的最多的只有这个教程,所以很多朋友看教程的时候还是一知半解)
3.主控端代码在vs2010中编写,但被控端代码却在古老的VC6下创建。不知道老狼为什么这么做,使用VC6还得下载sdk。所以我在编写的时候,是将主控端、被控端这些工程放在VS2010下同一个解决方案中,方便代码的管理。
4.老狼的代码与教程有一些错误,而且他遇到问题、解决问题的方法不太符合面向对象的思想,还有些问题的解决只是解决了表面的问题,并没有真正找到问题的根源。这也是很多软件漏洞多发的关键,一个漏洞如果不从根源上修复,可能在其他代码中存在一个新的漏洞。
5.教程中很多地方(可以说大部分地方)只是复制的gh0st代码,并没有详细的讲解。
当然这只是我的见解,不是说我可以做的更好,只是我在学习过程中发现的问题。我的能力不可能做出这样一套完善的教程,我写文章的目的只是像一个批注,在大家观看教程的过程中给大家一点帮助。我的文章不能替代老狼的教程。
在这里,先给大家一个大局观:gh0st是什么,大概原理是什么。
gh0st是一款基于C/S架构的远程管理软件(我只是就事论事,不想讨论C/S架构过时或不过时)。所谓远程管理,就是我在我的电脑上通过一些手段,可以操作其他电脑。什么是C/S架构,C表示Client,S表示Server,也就是客户端和服务端的意思。可以这样理解C/S,现在有两台电脑,一台是Server,一台是Client,server电脑就会开启一个端口,并一直监听这个端口中的信息。client来连接这个端口,连接成功后,两台机器就能互相发送信息了。(具体的原理建议大家去看socket通信)
gh0st用的是C/S架构中的反向连接。我用主控端和被控端来称呼黑客的电脑和肉鸡的电脑。反向连接的意思就是我主控端作为server,被控端作为client,主控端监听一个固定的端口,并有一个固定的IP。然后被控端来连接这个IP的该端口,这就是所谓的上线。
在实际情况中,黑客的电脑并不是都有固定的IP,我在我们寝室使用的是一个路由器,于是我的IP只是内网IP,192.168.x.x。而且,如果我换一个地方上网,IP也会变。这样我的被控端是找不到我的IP的。所以很多远控对待该问题,有两个解决方案:
1.DNS上线
花生壳、3322提供了免费的动态域名服务,其实就是提供了DNS服务。我们把自己的IP绑定到DNS服务器上,被控端通过对DNS的解析,找到主控端的IP,再连接。下次换地方上网了,只需要更改自己绑定到DNS上的IP即可。
2.FTP(HTTP)上线
我们把自己的IP写入一个文本文件1.txt,放在ftp(http)服务器上,比如ftp://leavesongs.com/1.txt。被控端去下载该txt,在其中找到主控端的IP。再连接。
当然gh0st对他们都是支持的。
再讲讲gh0st这个软件的组成。老狼给的gh0st最终编译好就是一个exe文件,点击打开后是一个主控端的样子:
在build选项卡中,填好相关信息,可以生成一个exe文件,这就是所谓的被控端。
但是我们打开源码看,其实它是主要由三个部分组成,一是带界面的主控端,一个是动态链接库dll,一个是加载dll的exe。我们被控端的所有功能都是写在dll当中的。而并不是写在exe文件中。
大局观大概就是这些。再说一下gh0st核心内容。
在传输数据方面,主控端使用IOCP模型,关于该模型请google。在主控端中,由CIOCPServer类实现。在被控端中,数据传输使用CClientSocket类实现。数据传输是远控的核心,所以这两个类也就成了gh0st的核心类。当然,在传输过程中,gh0st使用zlib进行压缩,减小数据包的大小。
在被控端管理方面,gh0st使用了一个很好的方案。先做了一个CManager类,作为所有管理功能的基类,其他的比如系统管理类CSystenManager就继承了CManager。大大地增加了代码的重用性。
在主控端方面,有这样一个回调函数NotifyProc,所有被控端发来的消息,都会经过此函数,在该函数中使用switch语句,处理各个消息。使得代码看起来井井有条。
在稳定性方面,被控端宿主为svchost以系统服务启动,并有守护线程,用心跳包机制防止以外掉线。
说了半天了……西安这又是一个炎热的下午。希望你能看懂我的文章,并对远控有一个更深的理解。下次我会开始写一些gh0st的源码,和老狼视频里一些难以理解的地方。再次强调,本文不能替代老狼的视频,想学习的同学务必认真地看老狼的教程,你会受益良多。