VA2FO插件更新0.2,增加FO转VA功能。

插件介绍:一个可以直接在OD里实现“物理地址和虚拟地址相互转换”的插件。详细请看上一篇文章

这个功能早就想加进去了,这几天才终于抽出点时间实现。

目前增加了“物理地址”转“虚拟地址”的功能,所以现在这个版本包含了“虚拟地址”和“物理地址”“相互转换”的功能,并且修复了上个版本的几个小问题。

病毒行为监测工具(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端交互,进行防火墙规则的设定

利用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),编译就可以通过。汗……

使用C#监听Outlook特定新邮件。

这个月开始要上夜班,由于做事是on email的,所以部门以前的做法是,隔一段时间起床刷一下邮件。我受不了,所以做了个工具,用来监听outlook的新邮件,并做声音提示。

其实关键代码没有几行,难度在于这些函数在MSDN里基本找不到。术语上叫做基于Office的Add-in的开发。
但是这里我并没有实现成插件,只是截获了Outlook的NewMailEx事件,然后通过回调函数做判断。

核心代码如下:

public void _tMonitorOutLook()
{
ApplicationClass outLookApp = new ApplicationClass();
outLookApp.NewMailEx += new ApplicationEvents_11_NewMailExEventHandler(outLookApp_NewMailEx);
MessageBox.Show(“开始监听Outlook邮件!”);
while (true)
{
Thread.Sleep(10);
}
}

private static void outLookApp_NewMailEx(string EntryIDCollection)
{
ApplicationClass outLookApp = new ApplicationClass();
NameSpace outLookNS = outLookApp.GetNamespace(“MAPI”);
MAPIFolder outLookFolder = outLookNS.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
string storeID = outLookFolder.StoreID;

MailItem mail = (MailItem)outLookNS.GetItemFromID(EntryIDCollection, storeID);

//判断标题
Regex rx = new Regex(s_strRegex);
if (rx.IsMatch(mail.Subject))
NewPspCaseArrived(“有新邮件到达:” + mail.Subject);

}

原理如下:
1·修改NewMailEx的回调函数,指向我们自己的函数
2·NewMailEx会传递一个EntryID过来,作为参数1,我们再获得收件箱的StoreID,作为参数2,然后调用GetItemFromID,就可以获得新邮件的实例
3·接下来就可以做自己想做的事情了

我的工具截图如下:

如果你感兴趣,可以从以下链接下载:
点我下载

当然,如果你使用的是Outlook,而且你还会写一点正则表达式,那么你也可以使用这个工具监听你的邮件了。只要你把监听文件夹改成一个不想关的文件夹就可以了。不过别忘了,需要.Net Framework 2.0(+)。

杀毒手的跨版本升级方式探索。

随着杀毒手的版本越来越多,因此各版本之间如何平滑升级是我们必须考虑的问题。

1·从2.3版本,程序每次启动时都会强制更新index.dll,即“更新组件”。
因此,“最新的更新组件+完整的update.ini”,可以让2.3开始的版本可以平滑升级,包括跨版本升级。
不过,需要注意的是这个“完整的update.ini”,“完整”是指,当前最新版本里应该“完整”地包括哪些内容,而非“需要更新的内容”。如果是后者,跨版本升级就会出现问题。

2·对于2.3以前的版本,我建议使用“一个版本,一个update.ini”的方式来保证跨版本升级。
杀毒手目前流传在外的版本有1.53和2.0,如何让这两个版本平滑升级到2.3?
(1)2.0—>2.3:
维护一个update20.ini,确保2.0的版本能更新到2.3的index.dll,其他组件可不考虑;而2.3的index.dll指向新的更新源update23.ini,用来更新其他组件至最新版本。

(2)1.53—>2.3:
首先保证1.53能升级到2.0,更新到2.0后,重复(1),即可更新到2.3。
1.53—>2.0的更新同样采用“专属update.ini”的方式,确保1.53的index.dll能更新到2.0的index.dll

3·不过这样就带来一个问题,因为1.53和2.0已经流传在外了,也就是说,他们的更新源已经固定了,怎么来为他们配置“专属update.ini”?
这里只能说我们运气好了,幸好目前只流传两个版本,最新版本是2.0,所以说,需要升级的只有1.53,那么1.53肯定能升级到2.0的index.dll,所以,如果要保证1.53能平滑升级到2.3,只要现在更新一下2.0的index.dll,更改其的更新源,不等于1.53升级到2.0的更新源,且不等于2.3的index.dll的更新源

4·因此保证(1)和(2)都成功,只要现在发布一个新的版本,让2.0的index.dll指向一个新的更新源A,2.3的index.dll也指向一个新的更新源B

趋势科技闪电杀毒手2.0发布。

2.0终于发布啦,核心开发人员减少至我和另一位同事。
2.0主要对UI做了一些重新设计和效率的优化,以及恶意软件的模块翻新,还有其他模块的微调。
UI重新设计,恶意软件,自动升级,架构等都担在了我身上。
3.0将侧重扫描和专杀的制作,同时病毒码也将逐渐积累

感受还是挺多的,越来越发现设计的重要性,同时自己也越来越有想法,看来我在大学里的积淀还是有用处的。
界面设计我还是很满意的,都是通过代码写出来的,都知道vc做界面不容易。

下载地址:
http://www.trendmicro.com/download/zh-cn/product.asp?productid=52