迟到的Windows安全总结
我已经快两年没用过Windows了,从13年低,到17年中,莫名其妙的开始,无法忍受的结束。从来也没想过要一直研究Windows内核,也许是基于惯性,也可能是人性的懒惰,却在前几年一直做这么一件事情。在吉胜实习实在是消耗了太多热情,后期只感到疲惫——那些无聊的商业竞争,对用户赤裸裸的不在乎,让我感到伤心。去360的第一天,就感到不舒服;我的同事们都很不错,老大也对我非常好;但是一天天下来,我觉得我不能再继续下去了,不能把一生都消耗在抢夺浏览器入口上。
Ma' in wojel ba'ax ka lelo' u k'áat u ya'al
我已经快两年没用过Windows了,从13年低,到17年中,莫名其妙的开始,无法忍受的结束。从来也没想过要一直研究Windows内核,也许是基于惯性,也可能是人性的懒惰,却在前几年一直做这么一件事情。在吉胜实习实在是消耗了太多热情,后期只感到疲惫——那些无聊的商业竞争,对用户赤裸裸的不在乎,让我感到伤心。去360的第一天,就感到不舒服;我的同事们都很不错,老大也对我非常好;但是一天天下来,我觉得我不能再继续下去了,不能把一生都消耗在抢夺浏览器入口上。
分析漏洞或者提取病毒行为,调试器是必不可少的,不过面对rootkit或者其它有驱动辅助的程序,OD或者windbg硬上可能会蓝屏,驱动级的anti还是不容小觑的;此外不少企业或者团队还希望有自己的模拟器,可以去半自动跑一些样本。不管怎么说,内核HOOK框架都是必不可少的。
内核HOOK需要关注的类型并不多:SSDT、ShadowSSDT、IDT内核关口HOOK;文件系统过滤,可以自建控制设备和卷设备过滤,也可以使用MiniFilter;网络控制,TDI/WPF驱动必不可少,甚至需要自己的NDIS驱动;重点当然是内核入口,现在的主流是KiFastCallEntry,我们也是处理了这个点。
现在的主流虚拟机产品充分利用硬件虚拟技术,如intel-vt和AMD-SVM,虚拟效率高、透明性好,VMM的处理器虚拟化、内存虚拟化、I/O虚拟化等物理资源虚拟的实现都是软硬件结合,充分了解虚拟化原理才能做到很好的检测虚拟机运行。本文将介绍intel-vt虚拟机各个方面的实现原理,了解与真实机的不同,进行针对性的检测。
虚拟机环境在操作系统和硬件资源之间增加一层VMM(虚拟机监视器),这里的操作系统也称为客户机;VMM更像是传统的物理操作系统,管理着硬件资源;客户机执行某些敏感操作——中断、某些寄存器操作、IO指令操作等时,会退出到VMM层,由VMM做相应的转换、运算或者修改操作之后再进入客户机。
WDF提供的这个宏用于实现面向对象编程中常见的存取器函数(我都忘了这个的确切名字是什么了,不同语言有不同的称谓),就是调用某个函数来获取某个结构的某个成员。完整定义如下:
初学windows分页分段机制,!pte命令是最常用的,PDE和PTE的默认值0xC0600000和0xC0000000很容易让人迷惑。有个朋友跟我吐槽说经常搞混这两个值和虚拟地址转物理地址过程。这里简单说一下。
这两个所谓的默认值指的是进程PDE和PTE所在的虚拟地址,注意不是物理地址。0xC0600000表示页目录的起始加载地址,0xC0000000表示页表起始加载地址。
进程创建、dll加载,都要用到section。我们可以hook相关的函数,比如ZwMapViewOfSection,替换section。可以通过section_object得到对应的文件对象。
dll加载时会映射到进程地址空间,成为进程的一部分,就像一个箱子被扔到屋里,成为了屋子的一部分。编写dll有一些基本的原则,比如一定要有成对的管理函数:申请和释放、获取和解除等,好的dll应该有好的封闭性和完整性。进程加载导入表中的dll有一个固定的顺序:
看到一段很有意思的代码。DPC/Dispatch Level的同步操作,除了当前CPU,其他的都插入一个DPC,利用两个全局变量同步。
一篇记录。在我把《windows核心编程》放回家之前打算再读一遍,倒着来,果然收获不小,能更清晰的了解到这本书讲得多么好。昨天晚上看了最后面的结构化异常处理,这里写个小心得。
win64系统调用比win32要简洁不少,因为寄存器增多,切换起来更方便了。还是看CreateFile的例子,直接看ntdll!ZwCreateFile。