病毒行为监测工具(Malware Behavior Interceptor)。

这是去年刚来北京时做的一个工具,用来自动判断某文件是否属于病毒,完成的版本只能用做演示,后来工作忙起来了,就没时间再回去修改。现在看看,好像快烂在电脑里了。还不如分享出来,希望给他人有所帮助。

实现的功能:
1. 利用微软的Detours实现API inline hook
2. 实现简单的沙箱功能
a. 文件重定向
b. 注册表重定向
c. 进程、线程控制
3. 被控进程与控制进程数据实时交互
4. 进程行为判断规则功能,自动识别程序是否恶意

JS实现循环感染XSS Worm。

这是去年十月份刚来北京时帮朋友做的一个poc。当时已经很久没有碰Web了,所以做起来遇到点小麻烦,但是最终搞定。

主要目的是在有XSS漏洞的论坛上发帖(包含恶意JS),当用户访问该贴时,帖中的JS代码会获得访问者的cookie,然后用改访问者的身份信息自动发一个具有同样功能的帖子。依次类推,实现Worm的功能。

获得Cookie的方法不难。伪造用户数据也不难。难点在于,怎样将一段js代码本身当做该段js代码中的一部分post出去。去几个论坛调查了几次,并结合自己的研究,通过以下方法解决:
1. 利用arguments.callee.toString();获得当前函数的string文本
2. 去掉将该段文本中的”换行“
3. encodeURIComponent()转义

用NetFilter在Linux下实现一个小型防火墙MiniFirewall。

这是去年十月份刚来北京时帮朋友做的一个poc。现在发出来应该没什么问题了。当时做的时候,遇到了不少问题,发出来希望能给他人有所帮助。

基本原理:
1. server端:
a.编译成Kernal Module,然后利用NetFilter建立挂钩函数,在挂钩函数里做包的处理工作。
b.建立文件系统/proc存储防火墙规则
2. Client端:通过对文件系统/proc的读写访问,与server端交互,进行防火墙规则的设定

入手9700。

我承认我是BB控。

喜欢了很久的9700,由于嫌他米太贵,好一点的基本都至少2500+,所以一直没舍得入手。

最近打着奖励自己前一段时间做私活太辛苦的理由,并且作为不玩游戏的激励,终于狠下心,入手全新零通话T-Mobile 9700一枚。

喜欢得不得了。祝愿自己到后年不再换手机orz

捷克之行(上篇)——身在Brno心在Shanghai。

对一个第一次出国的人来说,只要前往的国家没什么危险,我想或多或少都是神往的。我也不例外。
因为工作之需,我获得了一次去捷克公司总部培训加游玩的机会。算上来回共计8天。我很欣慰现在我还能坐在这里写博客,因为我走之前连遗书都写好了。

下面说一说这次行程的大致过程,我一直拖到现在才写,其实是因为一来不想有炫耀之嫌,二来出行时间较长东西较多,我也容易漏掉点什么,三来也一直找不到兴致。因为文字会很多,所以我分上下篇来写。这是上篇。

总体来说,这次去捷克之行的心态是有点复杂的。一开始得知要去捷克时充满了狂喜和忐忑。狂喜的原因自然不用多说,忐忑则是因为途经的国家都不是说英语的,我很担心自己的英语水平,而且第一次出去,就这么遥远且这么周折,谁还不提点心掉点胆。签证的申请也不是很顺利,但还还好走之前最后一天成功拿下。

踏上Air France的航班后,看到飞机上有不少中国人,我稍微平静了些。随后有几次与老外对话的机会,说的不错,所以慢慢的,英语的问题渐渐不再放在心上。十一个小时的飞行,是件挺折磨身心的事儿。我怀疑这样的航班坐多了,肯定会很厌倦。尤其是这十一个小时是在天上呆着的,并且还要倒时差。我坐在经济舱,所以苦上加苦,只能忍着,还好有新鲜感和兴奋感支撑着我。在飞机上的第一餐,要了个French meal,结果夜里别人在睡觉,我去了三趟厕所。快到巴黎的时候又吃了份早餐,依然是冷的蔬菜、香肠等等,所以这时候,担心英语的心放下来了,饮食问题却接踵而至。

于是终于到了巴黎——戴高乐机场。第一感觉,机场挺破,顿时觉得还是浦东机场好啊——刚踏上别国领土,爱国之心果然随之而来。出关的时候需要排一个小时左右的队,期间发现黑皮肤的亚、非洲人很爱插队。欧洲的可乐很贵,自动售货机里要买2.5欧一瓶,不知道是不是在机场里出售的缘故。热爱本国语言的法国人民不说英语,以至于我要买一杯hot drinks except coffee,服务员就是听不懂。机场上WIFI是要收费的,法国人民的狐臭原来和他们产的香水一样名不虚传。

宝丽来白彩虹。

顾名思义,她是白色的彩虹机,是一种立拍得老式照相机。宝丽来出品。
她有自己的型号,但她身上的那条彩虹条纹,俨然已成为她的代名词。
我用她拍过几次照片,每次都很心疼,因为相纸17块一张,而且我每次都拍不好。
所以我只能用卡片机来拍她。

这东西美得让人怀疑她不属于这个时代。
只是我能力有限,也配不上用她。不然就想着找一个晴天,把她挂在脖子上,去拍草坪和树荫底下的恋人。
好把自己置身于时间之外。

《风声》

其实电影早看了,只是一直想好好回味这段话——周迅在片尾说的那段,感人得一塌糊涂,搞得我眼泪都在眼睛里打转了。

我不怕死
我怕的是我爱的人不知我因何而死
我身在炼狱留下这份记录,
是希望家人和玉姐原谅我此刻的决定,
但我坚信,
你们终会明白我的心情。
我亲爱的人,
我对你们如此无情,
只因民族已到存亡之际,
我辈只能奋不顾身,挽救于万一。
我的肉体即将陨灭,灵魂却将与你们同在。
敌人不会了解,老鬼、老枪不是个人,
而是一种精神、一种信仰。

只有信仰,才是无可替代的力量…

BlackHat之路第八期:文件夹病毒专杀工具。

第八期来得迟了点,其实这个工具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。

BlackHat之路第七期:Worm_downad扫描器

这个东西是想练练手的,因为觉得自己大部分是分析别人写的东西,所以觉得自己也应该写点东西出来。
这个东西主要有两个功能:扫描网内的机器,猜测密码以及判断是否有MS08-067攻击的漏洞。

做的过程中还是学到不少东西的。内网连接,怎么猜密码,怎么利用管道,怎么利用漏洞等等。

下载地址:
点击下载此文件

利用SetUnhandledExceptionFilter对Release程序进行异常处理。

闪电杀毒手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),编译就可以通过。汗……