内核呓语系列2 —— windows子系统

2013-12-18 Nie.Meining Coding

上一篇写到Windows将图形支持作为windows子系统的一部分放到了内核支持中。其实windows子系统既有内核部分也有用户态部分,其内核部分由win32.sys实现,负责窗口管理(会话、窗口站、桌面)和GDI。win32.sys对应用层不处理任何IO请求,只作为内核功能扩展导出Shadow SSDT表向用户层提供大量系统服务。因此基于这个定位,win32.sys不是一个完整的内核驱动,而是一个内核动态链接库,其加载方式是 MmLoadSystemImage + call oep。

任何一个线程,只要调用了Shadow SSDT中的函数则会转变成一个GUI线程(PsConvertToGuiThread),纳入csrss.exe的管理范畴。转换过程包括分配子系统相关的对象、切换一个更大的内核栈(KeSwitchKernelStack)、切换为 KeServiceDescriptorTableShadow 等。具体可以参考wrk。另外,win32.sys 并不常驻内存,因此在有些进程中可能看不到Shadow SSDT表(例如 system):

nhyy2_1.png

阅读全文>>

评论(2) 浏览(27064)

[分析引擎开发笔记]硬件模拟器

2013-12-18 Nie.Meining Life

最初选择硬件模拟器作为基础架构,主要出于以下几个方面考虑:

1. 可以模拟多种硬件架构,这样针对不同的分析环境提供统一的分析方法,如x86架构的Windows/Linux系统、arm架构的Android系统等……

2. 这种软件模拟硬件的方法,容易从虚拟硬件层提取原始数据进行分析,实现不对虚拟操作系统做任何更改,在对抗检测虚拟机的样本时,有一定优势。不过硬件模拟器这种译码执行的方式也肯定会带来性能损失……

3. 方便在不修改虚拟操作系统的情况下实现远程屏幕控制。我们正在测试的深度分析客户端截图:

image003.png

阅读全文>>

评论(0) 浏览(816)

内核呓语系列1 —— 系统结构

2013-12-17 Nie.Meining Coding

学习内核有一段时间了,做了不少底层开发、驱动开发相关的东西,因此打算写一个系列,把一些内核相关的东西梳理梳理。

首先声明,这个系列不是系统地介绍内核原理,主要是整理一些底层开发中涉及到的东西,相当于一个开发笔记汇总,想到什么写什么,也许同样做底层开发的朋友们看到后能产生共鸣。我争取把这个系列坚持记录下去,水平有限出错难免,还望路过的大牛们多加指点。

废话不说了,进入正题。

作为内核相关的文章,还是从系统结构讲起吧。Windows和Linux内核一样,基本结构分3层,自底向上分别是硬件设备(即HAL层,提供硬件抽象)、系统环境(提供系统服务)、应用环境(使用系统服务):

nhyy1_1.png

阅读全文>>

评论(0) 浏览(36073)

驱动中获取进程名的正确方法

2013-12-16 Nie.Meining Coding

这是个古老的话题,没有技术含量,只不过看到很多驱动代码在取进程总喜欢去读偏移 EPROCESS.ImageFileName,感觉比较误导新人

这个方法其实很不科学,硬编码偏移带来的兼容性问题以及16字节截断的问题(Win7过后是15字节)就不用说了,关键是这个 EPROCESS.ImageFileName 其实并不靠谱

咱们可以做个实验,随便打开一个程序,比如记事本notepad.exe。然后看看ImageFileName:

procname1.png

阅读全文>>

评论(1) 浏览(30010)

[分析引擎开发笔记]读写监控

2013-12-14 Nie.Meining Life

只拦截NtWriteFile/NtReadFile对很多程序是无效的(例如记事本notepad.exe),因为这些程序采用了文件映射的方式,例如记事本同志:

20170331190144.png

评论(0) 浏览(417)

Powered by emlog