AloneMonkey

阅读WRK 源代码时,我们会频繁地看到许多有关当前线程或进程的基本操作。内核层函数KeGetCurrentThread 是一个重要的函数,它返回当前处理器上正在运行的线程的KTHREAD 结构指针。通过此结构信息,可以进一步得到KPROCESS、ETHREAD 和EPROCESS 结构。在WRK 中,KeGetCurrentThread 是这样实现的: FORCEINLINE &nbsp […]

每个程序都有自己的LDT,但是同一台计算机上的所有程序共享一个GDT。LDT描述局部于每个程序的段,包括其代码、数据、堆栈等。GDT描述系统段,包括操作系统本身。 ①全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的 […]

在从用户模式切换到内核模式的完整过程分析有讲到在用户态的代码执行了SYSENTER指令之后,处理器中的控制单元将寄存器MSR_IA32_SYSENTER_EIP的值装载到指令指针寄存器eip中。 从wrk中可以看到对它的初始化 VOIDKiLoadFastSyscallMachineSpecificRegisters(    IN PLONG Context&nbsp […]

Object Hook简单的来说就是Hook对象,这里拿看雪上的一个例子,因为是在win7 32位上的,有些地方做了些修改。 _OBJECT_HEADER: kd> dt _OBJECT_HEADERnt!_OBJECT_HEADER   +0x000 PointerCount     : Int4B   +0x […]

在暴力搜索内存进程对象反隐藏进程这篇文章中,我们提到: Object Header偏移0×008处Type成员为对象类型值,相同类型的对象具有相同的值.  自Window  7开始, _OBJECT_HEADER及其之前的一些结构发生了变化.  lkd> dt _object_header nt!_OBJECT_HEADER +0×000 PointerCoun […]

Inline hook通俗的说就是对函数执行流程进行修改,达到控制函数过滤操作的目的。理论上我们可以在函数任何地方把原来指令替换成我们的跳转指令,也确实有些人在inline的时候做的很深,来躲避inline 的检测,前提是必须对函数的流程和指令非常熟悉,且这种深层次的inlline 不具有通用性,稳定性也是问题。 Inline hook原理:解析函数开头的几条指令,把他们Copy到数组保存起来,然 […]

在TerminateProcess流程追踪、PspTerminateThreadByPointer的实现中讲到,进程的终止,最终都是通过PspTerminateThreadByPointer终止线程来实现的。而PspTerminateThreadByPointer不管是通过终止本身,还是通过插APC最终都是调用PspExitThread来完成终止过程。 那来分析下PspExitThread的执行流 […]

类似于进程的创建过程:进程创建过程分析NtCreateProcess-NtCreateProcessEx-PspCreateProcess。 线程的创建是从NtCreateThread函数开始的。NtCreateThread所做的事很简单,首先,对于非内核模式传递过来的调用,检查参数是否可写。处理InitialTeb参数,将它放到局部变量CapturedInitialTeb中。这些操作都是在try […]

我们前面说过几种隐藏进程的方法: 遍历进程活动链表(ActiveProcessLinks) 遍历PspCidTable表检测隐藏进程 但还是不能防止别人通过各种方法来隐藏进程,所以下面来介绍一种通过暴力搜索内存枚举进程的方法。 一个进程要运行,必然会加载到内存中。基于这个事实,隐藏进程要在目标机运行,在内存中一定会存在对应的EPROCESS结构体。基于系统内存搜索的进程监测技术利用EPROCESS […]