QQ蠕虫的行为检测方法
QQ蠕虫是一种利用QQ等腾讯公司相关产品进行传播的一种特殊蠕虫,该蠕虫的基本原理是利用了QQ帐户的快速登录机制,只要当前系统中有一个QQ帐户成功登录,就可以通过后台接口实现该帐户相关应用的快速登录而不需要再次输入帐户密码。登录后蠕虫可以访问QQ应用的各种网络接口,例如:通过接口实现加QQ好友、加入QQ群、发消息、发日志、发微博、上传群共享文件等操作,且完全不需要用户同意。借用这种技术,QQ蠕虫可以实现非常快速的传播。这种蠕虫诞生于QQ体系之上,其影响和传播主要集中在国内地区,因此国外品牌的杀软对这类蠕虫识别和支持非常有限,国内的杀软品牌对该蠕虫检测也不是特别理想,从而导致了该QQ蠕虫的传播更加快速,影响范围更广。
基于以上信息,利用WinPcap技术抓取网络数据包,对HTTP POST包进行分析,过滤出对域名qq.com访问的数据包,但是由于WinPcap考虑到很多数据结构需要自己封装且第一阶段比赛时间结束只有几天,所以决定使用sharpPcap+C# 代替常用的 WinPcap+VC来捕获数据包
(1)经典的HTTP请求方式:
1
2
3
4
5
|
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/4.0
Accept-language: fr
|
(2)我们注意到HTTP请求报文中的第一行是以GET打头的,它实际上是HTTP请求的一种方法,类似的还有POST、HEAD等等。一般熟知的大概就是GET和POST。
(3)利用这个我们就可以用 sharpPcap 技术抓取网络数据包,在数据包中判断TCP数据报文里是否保存了HTTP数据。如果有HTTP数据且是请求报文,就获得了HTTP的 GET、POST 请求数据后进行解析,数据的解析可以通过Content-Type分析数据格式,并按照相应的解析方式进行解码,解码过程中还有对于中文字符的处理等等。
基于sharpPcap,C#写的抓包程序源代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SharpPcap;
namespace SharpPcapTest
{
class Program
{
static void Main(string[] args)
{
PacketArrivalForm packArrivalForm = new PacketArrivalForm();
packArrivalForm.ShowDialog();
FileOperate fileOperate = new FileOperate();
string ver = SharpPcap.Version.VersionString;
Console.WriteLine(“SharpPcap {0}, Example1.IfList.cs”, ver);
String strTemp = “SharpPcap” + ver + “/n”;
fileOperate.wtiteToTxtFile(@“./123.txt”, strTemp);
// Retrieve the device list
var devices = LivePcapDeviceList.Instance;
// If no devices were found print an error
if (devices.Count < 1)
{
Console.WriteLine(“No devices were found on this machine”);
return;
}
Console.WriteLine(“/nThe following devices are available on this machine:”);
Console.WriteLine(“—————————————————-/n”);
/* Scan the list printing every entry */
/*获取驱动列表*/
foreach (var dev in devices)
{
//Console.WriteLine(“{0}/n”, dev.ToString());
fileOperate.wtiteToTxtFile(@“./123.txt”, dev.ToString());
strTemp += dev.ToString();
}
//在对话框中显示相关的设备信息
ShowForm showForm = new ShowForm();
showForm.setRichTextBoxStr(strTemp);
showForm.ShowDialog();
/*接收数据包时间等各种数据*/
int i = int.Parse(Console.ReadLine());
LivePcapDevice device = devices[i];
// Register our handler function to the ‘packet arrival’ event
device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrival);
// Open the device for capturing
int readTimeoutMilliseconds = 1000;
device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);
Console.WriteLine();
Console.WriteLine(“– Listening on {0}, hit ‘Enter’ to stop…”,device.Description);
strTemp = “Hour/tMinute/tSecond/tMillisecond/tlen/n”;
fileOperate.wtiteToTxtFile(@“./data.txt”, strTemp);
// Start the capturing process
device.StartCapture();
// Wait for ‘Enter’ from the user.
Console.ReadLine();
// Stop the capturing process
device.StopCapture();
Console.WriteLine(“– Capture stopped.”);
// Print out the device statistics
Console.WriteLine(device.Statistics().ToString());
fileOperate.wtiteToTxtFile(@“./data.txt”, device.Statistics().ToString());
Console.Write(“Hit ‘Enter’ to exit…”);
Console.ReadLine();
}
private static void device_OnPacketArrival(object sender, CaptureEventArgs e)
{
FileOperate fileOperate = new FileOperate();
var time = e.Packet.Timeval.Date;
var len = e.Packet.Data.Length;
Console.WriteLine(“{0}:{1}:{2},{3} Len={4}”,time.Hour, time.Minute, time.Second, time.Millisecond, len);
string strTemp = time.Hour.ToString() + “/t” + time.Minute.ToString() + “/t” + time.Second.ToString() + “/t” + time.Millisecond.ToString() + “/t/t” + len.ToString() + “/n”;
Console.WriteLine(e.Packet.ToString());
strTemp += “/n” + e.Packet.ToString() + “/n”;
fileOperate.wtiteToTxtFile(@“./data.txt”, strTemp);
}
}
}
|
设备信息截图:
获取数据包数据截图:
完整程序下载:http://pan.baidu.com/s/1i3vEX1r
来源:Gulity-Thron 团队
Copyright © hongdaChiaki. All Rights Reserved. 鸿大千秋 版权所有
联系方式:
地址: 深圳市南山区招商街道沿山社区沿山路43号创业壹号大楼A栋107室
邮箱:service@hongdaqianqiu.com
备案号:粤ICP备15078875号