[分析引擎开发笔记]行为监控

2014-1-9 Nie.Meining Life


行为监控的核心是API拦截。由于模块动态加载以及的ASLR等问题,API地址不能直接硬编码,或者至少需要监控模块加载并硬编码API偏移。

行为监控还有一个关键问题是,拦截到相关API后,需要提取出用户需要的大量辅助数据。由于分析引擎是基于硬件模拟器实现的,并且我不希望对操作系统内部做任何更改,因此需要解析各种内核数据结构,硬编码一大堆……似乎不是一个很好的方式……

具体一点,例如大量API的参数中只有handle,用户希望那个知道handle对应的东西是什么,因此需要从句柄表中索引出真正的object,再取得object的对象名。根据对象的不同,对象名不一定都在对象头中,甚至不一定在对象体中(对象的类型对象允许定义自己的名称parse方法),有时候对象的完整名称还会需要拼接,例如文件对象、注册表对象等。之前逆向注册表对象时还做过一个笔记:《KeyObject结构中的Name信息》。此外还有一些更加麻烦的东西,比如通过socket取得IP/Port等(socket_id在底层的表示实际上是一个FileObject的handle,需要到FileObject->FsContext中读取ip、端口、socket版本号等信息)。除了这些需要逆向的工作,还有一些虽然技术难度不大但比较繁琐的工作,例如用户希望从网络数据包中提取url等。

20170331184001.png



阅读全文>>

评论(0) 浏览(1009)

内核呓语系列4 —— 系统调用

2014-1-6 Nie.Meining Coding

内核通过系统调用向应用层提供接口,应用层代码通过中断(Windows int 0x2e,Linux int 0x80)或sysenter的形式进入系统调用。相信很多玩过rootkit的朋友最初就是从ssdt hook开始的,网上也有大量介绍ssdt的文章,因此本篇也不对ssdt的原理、调用流程什么的进行说明了,就挑一些有意思的周边东西讲讲。

首先Windows和Linux都有一张SSDT表,Linux的SSDT表中各个函数的地址可以在编译内核后的system.map文件中找到。Windows由于子系统集成到了内核中,因此win32k.sys还扩展了一张Shadow SSDT表。win32k.sys模块并不常驻内存,Shadow SSDT地址也未导出,因此hook其中的函数需要多做一些工作。关于子系统的问题可以参见本系列的前两篇文章。

此外,来自应用层的东西通常是不可信的,所以系统调用必须进行参数检查。可能为了效率问题,Windows引入了PreviousMode的概念。通常只在KeGetPreviousMode() != KernelMode时进行参数检查。写过驱动的朋友应该知道,Windows执行体中同样功能的函数通常有两套,NtXXX和ZwXXX。其实NtXXX才是真正完成功能的函数,而调用ZwXXX的目的就是改变PreviousMode为KernerMode再调用NtXXX,省去参数检查的麻烦。可以找个函数验证一下:

阅读全文>>

评论(0) 浏览(30347)

[分析引擎开发笔记]写PE行为

2013-12-30 Nie.Meining Life

有时候API监控与样本行为可以有多对一的关系,例如从写文件行为中分化出写PE文件的行为:

kfbjpe.png

虽然从技术上来讲,写PE文件也是一个写文件行为,但是在结果呈现上抽象成另一种行为会带来意想不到的效果,毕竟用户看到写PE文件行为时基本可以判定样本感染或释放了PE文件,属于典型的敏感行为。

类似的“虚拟”行为还有很多,能直接提高系统的用户体验,这就是经常了解用户需求的重要性

阅读全文>>

评论(0) 浏览(1201)

内核呓语系列3 —— windows会话管理

2013-12-24 Nie.Meining Coding

今天接着讲windows子系统。上文提到,任何一个应用程序,包括CUI程序,都运行在Windows子系统中,实际上会话管理器smss.exe是个特殊情况,另外System和Idle也是特殊情况(它们根本没有对应的程序文件),这个留到以后讲进程的时候再细讲吧。

smss.exe之所以特殊是因为windows子系统窗口管理分为“会话 --> 窗口站 --> 桌面”三级架构,而会话正是由smss.exe创建的,此时还没有windows子系统。实际上smss.exe是Windows启动后创建的第一个用户模式进程,windows环境子系统进程csrss.exe正是由smss.exe所创建,win32.sys也是由smss.exe加载(MmLoadSystemImage + call oep)。

接下来smss还会创建winlogon.exe,提供登陆认证。winlogon.exe负责登陆界面、锁屏界面等实现。想起了当年广为流传的输入法漏洞、粘滞建漏洞等绕过登录认证的方法……这里就不详细解释了。

说到会话管理,xp中winlogon.exe登陆界面和第一个用户会共享session,但后来因为session隔离(见session隔离故事),导致某些需要与用户桌面进行交互的服务(例如一些木马程序的截屏功能)需要进行更多的操作来指定session和桌面。

阅读全文>>

评论(0) 浏览(38062)

ObCallback回调钩子检测

2013-12-20 Nie.Meining Coding

在 PatchGuard 的摧残下,通过 ObRegisterCallbacks 函数注册回调钩子已经成了 RK/ARK 中的主流技术之一。注册回调钩子的具体做法可以参考MSDN上的示例代码:http://code.msdn.microsoft.com/windowshardware/ObCallback-Sample-67a47841

今天研究了一下检测这类回调钩子的方法,发出来跟大家分享。本人水平有限,错漏之处还请大家指正。

首先关注的还是注册回调钩子时调用的 ObRegisterCallbacks 函数,MSDN上的函数声明如下:

NTSTATUS ObRegisterCallbacks(
	_In_   POB_CALLBACK_REGISTRATION CallBackRegistration,
	_Out_  PVOID *RegistrationHandle
);

也就是说调用该函数后,我们会得到一个神奇的 RegistrationHandle 指针,而该指针指向的数据结构必然用于描述本次注册的回调钩子(否则 ObUnRegisterCallbacks 就摘不掉钩子了)。

经过一番逆向和调试,发现这个数据结构由三个部分顺序组织在内存中:

阅读全文>>

评论(1) 浏览(37914)

Powered by emlog