这是去年刚来北京时做的一个工具,用来自动判断某文件是否属于病毒,完成的版本只能用做演示,后来工作忙起来了,就没时间再回去修改。现在看看,好像快烂在电脑里了。还不如分享出来,希望给他人有所帮助。
实现的功能:
1. 利用微软的Detours实现API inline hook
2. 实现简单的沙箱功能
a. 文件重定向
b. 注册表重定向
c. 进程、线程控制
3. 被控进程与控制进程数据实时交互
4. 进程行为判断规则功能,自动识别程序是否恶意
这是去年刚来北京时做的一个工具,用来自动判断某文件是否属于病毒,完成的版本只能用做演示,后来工作忙起来了,就没时间再回去修改。现在看看,好像快烂在电脑里了。还不如分享出来,希望给他人有所帮助。
实现的功能:
1. 利用微软的Detours实现API inline hook
2. 实现简单的沙箱功能
a. 文件重定向
b. 注册表重定向
c. 进程、线程控制
3. 被控进程与控制进程数据实时交互
4. 进程行为判断规则功能,自动识别程序是否恶意
这是去年十月份刚来北京时帮朋友做的一个poc。当时已经很久没有碰Web了,所以做起来遇到点小麻烦,但是最终搞定。
主要目的是在有XSS漏洞的论坛上发帖(包含恶意JS),当用户访问该贴时,帖中的JS代码会获得访问者的cookie,然后用改访问者的身份信息自动发一个具有同样功能的帖子。依次类推,实现Worm的功能。
获得Cookie的方法不难。伪造用户数据也不难。难点在于,怎样将一段js代码本身当做该段js代码中的一部分post出去。去几个论坛调查了几次,并结合自己的研究,通过以下方法解决:
1. 利用arguments.callee.toString();获得当前函数的string文本
2. 去掉将该段文本中的”换行“
3. encodeURIComponent()转义
对一个第一次出国的人来说,只要前往的国家没什么危险,我想或多或少都是神往的。我也不例外。
因为工作之需,我获得了一次去捷克公司总部培训加游玩的机会。算上来回共计8天。我很欣慰现在我还能坐在这里写博客,因为我走之前连遗书都写好了。
下面说一说这次行程的大致过程,我一直拖到现在才写,其实是因为一来不想有炫耀之嫌,二来出行时间较长东西较多,我也容易漏掉点什么,三来也一直找不到兴致。因为文字会很多,所以我分上下篇来写。这是上篇。
总体来说,这次去捷克之行的心态是有点复杂的。一开始得知要去捷克时充满了狂喜和忐忑。狂喜的原因自然不用多说,忐忑则是因为途经的国家都不是说英语的,我很担心自己的英语水平,而且第一次出去,就这么遥远且这么周折,谁还不提点心掉点胆。签证的申请也不是很顺利,但还还好走之前最后一天成功拿下。
踏上Air France的航班后,看到飞机上有不少中国人,我稍微平静了些。随后有几次与老外对话的机会,说的不错,所以慢慢的,英语的问题渐渐不再放在心上。十一个小时的飞行,是件挺折磨身心的事儿。我怀疑这样的航班坐多了,肯定会很厌倦。尤其是这十一个小时是在天上呆着的,并且还要倒时差。我坐在经济舱,所以苦上加苦,只能忍着,还好有新鲜感和兴奋感支撑着我。在飞机上的第一餐,要了个French meal,结果夜里别人在睡觉,我去了三趟厕所。快到巴黎的时候又吃了份早餐,依然是冷的蔬菜、香肠等等,所以这时候,担心英语的心放下来了,饮食问题却接踵而至。
于是终于到了巴黎——戴高乐机场。第一感觉,机场挺破,顿时觉得还是浦东机场好啊——刚踏上别国领土,爱国之心果然随之而来。出关的时候需要排一个小时左右的队,期间发现黑皮肤的亚、非洲人很爱插队。欧洲的可乐很贵,自动售货机里要买2.5欧一瓶,不知道是不是在机场里出售的缘故。热爱本国语言的法国人民不说英语,以至于我要买一杯hot drinks except coffee,服务员就是听不懂。机场上WIFI是要收费的,法国人民的狐臭原来和他们产的香水一样名不虚传。
因工作需要,要定期收集卡饭论坛的病毒样本板块的病毒样本,所以就考虑用 Python做个爬虫,然后自动下载附件。
核心功能有3个:
1· 登录
2· 伪造cookie保持session
3. 下载样本
顾名思义,她是白色的彩虹机,是一种立拍得老式照相机。宝丽来出品。
她有自己的型号,但她身上的那条彩虹条纹,俨然已成为她的代名词。
我用她拍过几次照片,每次都很心疼,因为相纸17块一张,而且我每次都拍不好。
所以我只能用卡片机来拍她。
这东西美得让人怀疑她不属于这个时代。
只是我能力有限,也配不上用她。不然就想着找一个晴天,把她挂在脖子上,去拍草坪和树荫底下的恋人。
好把自己置身于时间之外。
其实电影早看了,只是一直想好好回味这段话——周迅在片尾说的那段,感人得一塌糊涂,搞得我眼泪都在眼睛里打转了。
我不怕死
我怕的是我爱的人不知我因何而死
我身在炼狱留下这份记录,
是希望家人和玉姐原谅我此刻的决定,
但我坚信,
你们终会明白我的心情。
我亲爱的人,
我对你们如此无情,
只因民族已到存亡之际,
我辈只能奋不顾身,挽救于万一。
我的肉体即将陨灭,灵魂却将与你们同在。
敌人不会了解,老鬼、老枪不是个人,
而是一种精神、一种信仰。只有信仰,才是无可替代的力量…
第八期来得迟了点,其实这个工具8月份完成了80%,9月份主要是重构优化了一下。
预备知识:
一个ICO文件,其实是由不同尺寸的BMP文件组成的,即可以将ICO理解为一个BMP数组,{48*48,36*36,24*24…}
windows会根据需要,选择适当大小的图片。比如,“平铺”选择的是48*48的,“列表”选择的是16*16的
工具原理:
1·遍历文件夹,扫描“是PE&会显示图标”的文件,选择其ICON_GROUP的第一个图标资源作判断
2·枚举该图标里的所有尺寸的图片,与Pattern中的相应尺寸的图片 比较每个像素的RGB,容差在某个范围内,则认为HIT
3·当该图标的某个尺寸的图片的所有像素HIT的百分比在某个范围内,则认为图标HIT,即认为是文件夹图标病毒
优势:
相比 通过提取文件CRC来判断一个文件夹病毒,通过图标来判断更为可控,更为迅速。而且,调整好几个阀值之后,理论上不会误报。
后续开发计划:
增加免疫功能;增加修复功能;增加实时监控功能
说明:
由于我目前收集的样本数有限,所以Pattern比较少,检测效果可能不是很好。以后我会扩充Pattern。
呃,第一个VC游戏。为了迎接趋势科技3CIT的新文化参加的比赛。
方块是3 C i T这4个字母,所以要得分其实蛮难的。
这个东西是想练练手的,因为觉得自己大部分是分析别人写的东西,所以觉得自己也应该写点东西出来。
这个东西主要有两个功能:扫描网内的机器,猜测密码以及判断是否有MS08-067攻击的漏洞。
做的过程中还是学到不少东西的。内网连接,怎么猜密码,怎么利用管道,怎么利用漏洞等等。
下载地址:
点击下载此文件
闪电杀毒手2.5发布出去有一段时间了,最近收到几个Bug反馈。
通常发布出去的Release产品,如果遇到没有预料到的异常,通常都会弹出Windows默认的错误窗口Windows Error Reporter.
这时用户就傻了:交互不友好;RD也傻了:不知道异常的具体信息。
SetUnhandledExceptionFilter可以设置在WER弹出之前的最后一次异常处理的机会。所以只要设置好我们的异常处理函数就可以捕获到Unhandled Exception。SetUnhandledExceptionFilter(CleanToolExceptionFun);
LONG WINAPI CleanToolExceptionFun(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
}
在这个函数里你可以做以下几件事:
1·获得异常的ExceptionRecord和Context
2·获得异常编号
3·获得异常的模块
4·获得堆栈的信息
5·程序继续执行还是退出
1和2都好办,直接通过传递进来的参数就可以获得:
ExceptionInfo->ExceptionRecord->ExceptionAddress;
3通常的做法是,通过ExceptionRecord获得异常的内存地址,调用VirtualQuery获得Handle,再通过GetModuleFileName获得出现异常的文件路径。
MEMORY_BASIC_INFORMATION mbi = {0};
if (FALSE == ::VirtualQuery( addr, &mbi, sizeof(mbi) ) ) return;
UINT_PTR h_module = (UINT_PTR)mbi.AllocationBase;
::GetModuleFileNameW((HMODULE)h_module, sz_module, len);
return;
4的做法是通过StackWalk64函数便利堆栈。
StackWalk64(IMAGE_FILE_MACHINE_I386,hCurrentProcess,hCurrentThread,&sStackFrame,pContext,0,0,0,0)
5是通过函数的返回值来确定的。
在实现的过程遇到几个好玩的问题:
1·如果exe调用dll,dll中要使用AFX_MANAGE_STATE(AfxGetStaticModuleState())之后,dll的资源才能被访问到;但是如果dll调用exe,则必须使用AFX_MANAGE_STATE(AfxGetAppModuleState())。
2·StackWalk64的问题:在Release版本下,Stackwalk64获得的堆栈信息不完整,具体表现为:如果异常是由MFC的模块抛出的,那么获得的堆栈将缺少栈最上方我们自己的模块的信息。比如A->B->MFC,则获得的栈为(至顶向下):MFC->A。但是在Debug的版本下不存在这个问题。为此我还特意用OD调试了Release版本,发现堆栈是完整的,那么只能认为是StackWalk的问题了。
3·在便利异常的模块的节表的时候,Release版本下程序偶尔会莫名其妙地退出。
4·Release编译的优化问题:如果我直接写int i = 5/0,编译时会直接报错。如果我写成:
int i = 0;
AfxMessageBox(L”%d”, 5 /i),编译就可以通过。汗……