- A+
*本文原创作者:鬼魅羊羔,本文属FreeBuf原创奖励计划,未经许可禁止转载
前言
有些时候,我们在使用电脑或者为客户去做一些安全检查的时候,难免碰见一些恶意程序或者病毒,大部分都是常见的,不稀奇的东西,当然了,也有可能会遇到一些特殊的病毒(例如那些一言不合就免杀了,而且相当顽固的病毒),特殊的病毒先不说,碰见常见的病毒,或者疑似病毒的东西,我们要怎么去查呢?常规的病毒分析步骤多,门槛高,对于初学者有些困难,老司机也得花不少时间去分析。虽然现在有很多主流的在线分析平台,可以供我们上传样本去实现自动化分析。
先说下写这个工具的初衷,因为工作中,经常做一些恶意程序分析工作,做的时间长了,真心比较枯燥,又累。。自己懒得分析的时候,还得去各种网站上查询某个程序的MD5样本是否被其他人发现过,或者提交过,但是轮番的打开网站,填写MD5,然后搜索,如果没有结果,还得再去上传,然后再等待结果,即便如此,那些我们查过的,遇到过的病毒或恶意程序的MD5,我们谁也不会记住在哪提交过啊。等再次遇到了,依旧重复各种动作,再去一堆网站上查,算是偷懒吧,顺手所以写了个小工具,去帮助我去互联网搜集一下相关病毒或可疑程序的信息。
这个工具呢,是用C#写的,主要通过MD5,自动去特定的网站搜索历史信息,并且把自己查过的内容,选择性的保存到本地,以便日后再查。
开发思路
找在线分析平台的MD5的查询地址和规律
主要涉及到的在线分析平台为:
https://habo.qq.com/file/showdetail?md5=
http://fireeye.ijinshan.com/analyse.html?md5=
http://www.threatexpert.com/report.aspx?md5=
获取查询到,和未查询到的网页信息特征
比如用哈勃分析系统举例,查询到的页面,和未查询到的页面,最明显的一个区别是,查询到的页面代码中,有var md5 = “关键字,而未查询到的木有。
所以,代码可以这么写:
string s0 = "var md5 = \"";
string url = "https://habo.qq.com/file/showdetail?md5=" + textBox1.Text;
WebRequest wRequest = WebRequest.Create(url);
WebResponse wResponse = wRequest.GetResponse();
Stream stream = wResponse.GetResponseStream();
StreamReader reader = new StreamReader(stream, System.Text.Encoding.Default);
string r = reader.ReadToEnd(); //url返回的值
wResponse.Close();
if (!r.Contains(s0))
{
MessageBox.Show("未找到匹配样本");
}
先将特征保存到s0变量中,将网站查询页面地址+textBox1.Text输入的内容保存到url变量中
然后通过webrequest方法进行操作,并将捕获到的页面内容存到r遍历中。
通过if进行判断,如果r变量中不包含s0变量中的信息,则提示“未找到匹配样本”,用else输出你想展示的东西;
例如:
else
{
Process.Start(url);
System.Threading.Thread.Sleep(5000);
if (MessageBox.Show("是否将该MD5本地保存?", "系统提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
StreamWriter fs3 = new StreamWriter(@"d:\MD5.txt", true);
fs3.WriteLine(url);
fs3.Close();
}
else
{
//
}
}
如果匹配成功,则通过process来打开完整的url页面。
这里用到了sleep,先说下原因。。。
因为打开链接后,我还想将这次打开的链接保存到本地,所以就选择性的弄了个提示框,延迟5秒的意思是,先打开浏览器,让大家先看到自己查看的内容是什么,有没有危害,是高风险呢,还是安全的,再决定这个MD5信息该不该保存到本地。
如果确定要保存的话,就通过:
StreamWriter fs3 = new StreamWriter(@"d:\MD5.txt", true);
fs3.WriteLine(url);
来写入文件。。本来打算把这个MD5.TXT创建到程序当前目录的,但是怕有人放到桌面,不小心删除了,或者系统重新做了,自己辛苦积累的MD5信息就没了。。所以就直接强迫大家存到D:\盘下了。。。
保存到本地,如何利用起来
这个有人觉得没什么卵用,但是个人觉得,还是有这么一个功能的好,将查询过的链接保存到本地,是为了让大家在没有网络的时候,也能知道自己有没有查过某个MD5信息。前边在查询完,让大家自主选择性保存MD5,也是这个意思,安全的,么有问题的,相信没人想保存,高风险的,有问题的,保存起来,等下次即使没有网了,还可以通过历史记录的方式,来判断下这个MD5所涉及的程序,有没有问题了。。。
下面说下本地如何去读取和操作。。。这个方法百度很多,很多。。我简单说下。。。
StreamReader objReader = new StreamReader(@"d:\MD5.txt");
ArrayList arrText = new ArrayList();
if (objReader.ReadToEnd().Contains(textBox1.Text))
{
string url2 = "https://habo.qq.com/file/showdetail?md5=" + textBox1.Text;
StreamReader objReader1 = new StreamReader(@"d:\MD5.txt");
if (objReader1.ReadToEnd().Contains(url2))
{
Process.Start(url2);
}
else
{
MessageBox.Show("该MD5值还你还没有检索过");
}
}
else
{
MessageBox.Show("该MD5值还你还没有检索过");
}
objReader.Close();
方法都一样,还是将文件存放路径保存到变量中,然后通过objReader.ReadToEnd().Contains(textBox1.Text)来匹配输入框中的内容,如果匹配成功,就打开网站链接。。这个就不多说了,简单的
整体搜索历史记录
这里我直接贴代码吧。。
StreamReader objReader = new StreamReader(@"d:\MD5.txt");
ArrayList arrText = new ArrayList();
string url1 = "https://habo.qq.com/file/showdetail?md5=" + textBox7.Text;
string url2 = "http://fireeye.ijinshan.com/analyse.html?md5=" + textBox7.Text;
string url3 = "http://www.threatexpert.com/report.aspx?md5=" + textBox7.Text;
string url4 = "http://md5.virscan.org/" + textBox7.Text;
string url5 = "https://virusscan.jotti.org/zh-CN/search/hash/" + textBox7.Text;
string url6 = "http://a.virscan.org/" + textBox7.Text;
if (objReader.ReadToEnd().Contains(textBox7.Text))
{
StreamReader objReader1 = new StreamReader(@"d:\MD5.txt");
if (textBox7.Text != null)
{
if (
objReader1.ReadToEnd().Contains(url1))
Process.Start(url1);
}
StreamReader objReader2 = new StreamReader(@"d:\MD5.txt");
if (objReader2.ReadToEnd().Contains(url2))
{
Process.Start(url2);
}
StreamReader objReader3 = new StreamReader(@"d:\MD5.txt");
if (objReader3.ReadToEnd().Contains(url3))
{
Process.Start(url3);
}
StreamReader objReader4 = new StreamReader(@"d:\MD5.txt");
if (objReader4.ReadToEnd().Contains(url4))
{
Process.Start(url4);
}
StreamReader objReader5 = new StreamReader(@"d:\MD5.txt");
if (objReader5.ReadToEnd().Contains(url5))
{
Process.Start(url5);
}
StreamReader objReader6 = new StreamReader(@"d:\MD5.txt");
if (objReader6.ReadToEnd().Contains(url6))
{
Process.Start(url6);
}
}
else
{
MessageBox.Show("该MD5值还你还没有检索过");
}
这里实现的功能是,在历史的MD5.txt中,搜索指定的MD5的相关历史链接,如果匹配到,则会将所有匹配到该MD5值的链接全部打开,这样就一目了然了。。。。
https://habo.qq.com/file/showdetail?md5=32d6c35357afc1df3378233a80cb1646
http://fireeye.ijinshan.com/analyse.html?md5=71989e3543b32330c43ea6a5acc41382
http://md5.virscan.org/54d833fbeed1015f079139d4c674efb3
http://a.virscan.org/54d833fbeed1015f079139d4c674efb3
http://www.threatexpert.com/report.aspx?md5=FD6260195E783C275D0F90047F5A3069
http://md5.virscan.org/c5a3bc9d76d42aacf4610c440657d27e
https://virusscan.jotti.org/zh-CN/search/hash/c5a3bc9d76d42aacf4610c440657d27e
http://a.virscan.org/c5a3bc9d76d42aacf4610c440657d27e
https://habo.qq.com/file/showdetail?md5=32d6c35357afc1df3378233a80cb1646
比如说:当我们查询c5a3bc9d76d42aacf4610c440657d27e这个MD5时,历史文件中,有3个网站都匹配过这个MD5值,点击查询,则会依次打开这三个网站,有关c5a3bc9d76d42aacf4610c440657d27e这个MD5的信息
http://md5.virscan.org/c5a3bc9d76d42aacf4610c440657d27e
https://virusscan.jotti.org/zh-CN/search/hash/c5a3bc9d76d42aacf4610c440657d27e
使用这个小工具有两个前提:
①电脑装了.NET4.0环境;
②你有一个查询MD5值的工具;
工具推荐使用winMD5,简单,轻便,还能批量。。
本来打算在工具里集成MD5查询功能,但是实在是懒得不行了。明天又得各种开会,这个留着后期再说吧。。。
工具截图:
如果查询的MD5值能匹配到的话,就会提示是否保存MD5信息。。
当查询历史记录时,MD5信息没有匹配到,就会有如下提示,在线查询也是如此:
这个截图,是历史记录一键查询功能,它会自动匹配到本地MD5.TXT中所查询过的内容,匹配成功后,则会依次打开相关联的所有站点。
注:里面那个上传样本功能直接忽略,只做了个打开按钮,打开的链接是对应平台的上传页面,为了好看。。
其实这个还少写了一个功能,就是批量查询,整个界面其实两个功能足够,一个批量查询,一个批量读取。。。
最近有些繁忙,没时间做更改了,将就着用吧。
网盘地址:传送门
*本文原创作者:鬼魅羊羔,本文属FreeBuf原创奖励计划,未经许可禁止转载