说起木马没有人不知道吧,想必各位大哥的灰鸽子里都有数也数不清,让我等小菜羡慕不已的肉鸡吧,本人天生愚钝,

怎么也用不明白这个灰鸽子,又要域名又要FTP的.还好在下学过点编程,既然别人的不好用自己写一个得了,自己写的

不应该不会用了吧,哪我们就开始我们的木马之旅吧.

1.通信技术

    几乎所有的网络程序都要涉及到socket的编程,然而socket到底是什么呢?

    socket是在Unix系统上提出来的,一开始主要用于本地进程通信,但很快用到了C/S(client/server)体系中用于网络中两台主机之间的

    通信.说的形像点,socket像一个管子(或许有点不太恰当),你用它把两台主机连接起来,然后在管子的一头放东西,在另外一头就可以

    接收这些东西了.有了这个管子当然我们还要有操作这个管子的工具,这些工具就是socket函数.基本的socket函数如下:

int socket(int family, int type, int protocol);
int closesocket(int socket);
int bind(int s, const struct sockaddr * name, int namelen);
int listen(int s, int backlog);
int accept(int s, struct sockaddr *addr, int *addrlen);
int connect(int s, struct sockaddr *name, int namelen);
int send(int s, const char *buf, int len, int flags);
int sendto(int s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen);/* 用于UDP */
int recv(int s, char *buf, int len, int flasg);
int recvfrom(int s, char *buf, int len, int flags, struct sockaddr *from, int *fromlen);/* 用于UDP */

    基本函数就这些了,是不是很少呀,原来哪么厉害的木马就是用这么几个函数写成的呀,嘿嘿

    好了下面我就以一个例子给大家介绍一个这几个函数的用法,木马程序应该算是比较典型的C/S体系,所以下面将有两个程序,

    一个server,一个client

server端的流程如下(括号内为使用的socket函数):

生成socket(socket)->

将生成的socket与本地的IP地址和指定端口绑定(bind)->

在此socket上监听(listen)->

接受来自客户端的连接请求(accept : accept将会返回一个新的socket,以后的通信都在此socket上进行)->

开始用accept新生成的socket上进行通信(send, sendto, recv, recvfrom)->

通信完毕关闭连接(closesocket : accept生成的socket和原始的监听socket都要关闭)

client端的流程如下:

生成socket(socket)->

与指定的服务端(connect : 指定了IP地址和端口)->

开始通信(send, sendto, recv, recvfrom)->

通信结束关闭连接(closesocket)

当然这只是最基本的一些东西,写在这里只是想告诉哪些没有学习过网络编程的人,其实很简单的.

(如果有时间不要总想着搞别人机子,好好学习天天向上,嘿嘿)


有了以上的基础,我们已经可以写出最简单的木马了,只要我们把想执行的命令发给服务端然后

服务端执行就可以了,怎么发挥就看你自己了.


2.自启动技术

我们的木马可以通信了,但总不能让受害人自己去执行吧(哪有这么傻的人呀,也介绍我一个)

2.1 加到开始菜单的启动里.

2.2 加到计划任务里并设成每次启动时执行.

2.3 加到注册表的启动里,以下为涉及到的键值.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Runservices 
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\currentversion\runonce
HKEY_CURRENT_USER\SOFTWARE\Microsoft\windowsnt\currentversion\windows 
建一个字符串名为load键值为自启动程序的路径但是要注意短文件名规则 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\windowsNT\CurrentVersion\Winlogon

2.4 写成Windows的服务,并设为自动.(提供示例代码)

2.5 替换windows的正常但无实际用处的服务或程序.

2.6 利用autorun.inf,现在U盘病毒最常用的方法.以下为一个autorun.inf文件内容

[AutoRun]
open=要执行的文件名
shellexecute=要执行的文件名
shell\Auto\command=要执行的文件名
shell=Auto

2.7 利用文件关联,

正常情况下txt文件的打开方式为Notepad.exe文件,如果一旦中了文件关联类的木马,这样打开一个txt文件,

原本应该用Notepad打开该文件的,现在却变成了启动木马程序了

HKEY_CLASSES_ROOT\exefile\shell\open\command,这里是exe文件的打开方式,默认键值为:"%1"%*.

如果把默认键值改为horse.exe "%1"%*,您每次运行exe文件,这个horse.exe文件就会被执行,其它的类似

以下注册表键也涉及到文件关联

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts

2.8 利用windows启动文件

可以利用的文件有Win.ini,system.ini,Autoexec.bat,Config.sys


3.隐藏技术

木马的泛滥也提高的人们的安全意识,人们都会打开任务管理器看看有没有什么可疑进程,又或者用netstat -an看看有没有什么可疑端口

3.1 进程的隐藏

1.起一个好名字,不要叫什么MyDoor,MyHorse什么的傻子都看出来了不是什么好东西,比如叫什么svchost呀,rundll32,这样就会好的多了

2.写DLL木马,直接用rundll32启动,这样只会多一个rundll32进程而已.

其命令行下的使用方法为:Rundll32.exe DLLname,Functionname [Arguments]  

DLLname为需要执行的DLL文件名;Functionname为前边需要执行的DLL文件的具体引出函数;[Arguments]为引出函数的具体参数.  

这里要注意三点:

1.Dll文件名中不能含有空格,比如该文件位于c:\Program Files\目录,你要把这个路径改成c:\Progra~1\;  

2.Dll文件名与Dll入口点间的逗号不能少,否则程序将出错并且不会给出任何信息! 

3.这是最重要的点:Rundll不能用来呼叫含返回值参数的Dll,例如Win32API中的GetUserName(),GetTextFace()等.

3.用DLL直接插入系统进程比如explorer,svchost等等(以前的,提供例程)

4.编写驱动,进行内核级进程的隐藏.(学习中...提供示例和网页)


3.2 端口的隐藏

1.用一个周知口,但前题是这个端口没有在主机上被使用,比如7.21.22.23......

2.使用嗅探型木马,既监听所有数据包再进行分析.(提供例程)


3.3 文件隐藏

1.和进程隐藏一样起一个好点的名字.

2.把文件属性设为系统+隐藏

3.在windows下无法以设备名来命名文件或文件夹,这些设备名主要有aux、com1、com2、prn、con、nul等,但windows2000/XP

 有个漏洞可以以设备名来命名文件或文件夹,让木马可以躲在那里而不被发现.

 具体方法是:用命令提示符窗口,然后输入md c:con\命令,可以建立一个名为con的目录.默认请况下,windows是无法建立这

 类目录的,正是利用了windows的漏洞我们才可以建立此目录.

4.利用NTFS流

  首先用记事本新建两个文本文档,分别名为“1.txt”“2.txt”,其内容为“正常文件、数据流文件”,打开CMD命令行窗口,

  进入两个文件所在文件夹,输入 type 2.txt>1.txt: shujuliu.txt,回车.即可将文件2.txt的内容加入1.txt,

  内容以数据流方式保存,该数据流名为shujuliu.txt.在资源管理器中查看宿主文件1.txt,发现文件的修改日期和文件大小

  都无变化,现在删除2.txt,执行命令:notepad 1.txt:shujuliu.txt ,即可查看数据流文件中的文件内容了.(提供例程)