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

2013-12-30 Nie.Meining Life

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

kfbjpe.png

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

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

阅读全文>>

评论(0) 浏览(1603)

内核呓语系列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) 浏览(38684)

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) 浏览(38617)

Win8中的MmVerifyCallbackFunction

2013-12-20 Nie.Meining Coding

看了下Win8中的MmVerifyCallbackFunction,依然守护 ObRegisterCallbacks 和 PspSetCreateProcessNotifyRoutine:

win8verfify1.png

不过检测方案和win7中是一样的:

阅读全文>>

评论(0) 浏览(29041)

[开发笔记]关于匈牙利命名法

2013-12-19 Nie.Meining Life

由于项目需要,这段时间都在研究linux内核。感觉linux内核代码跟wrk的代码相比,风格上的最大区别是命名法。linuxer似乎都觉得匈牙利命名法是没有必要,甚至在内核编码规范中也明确抵制匈牙利命名法。但作为一名长期使用匈牙利命名法的码农,我个人觉得这种命名法在开发过程中还是能带来很大帮助的,尤其是可能帮助你避免很多潜在的bug,提高代码的严谨性举几个例子:


1. 假设你要给某个变量赋值:

unsigned short usLocal = g_usGlobal;

是的,不用疯狂向上滚屏去寻找 g_usGlobal 的声明了,我们知道它的类型是unsigned short。更给力的是,你能立刻知道 g_usGlobal 是一个全局变量,于是你被迫去思考这个地方是否会出现多线程竞争的问题……

阅读全文>>

评论(1) 浏览(44036)

Powered by emlog