现在的位置: 首页 > 综合 > 正文

rootkit开发

2013年09月03日 ⁄ 综合 ⁄ 共 753字 ⁄ 字号 评论关闭

进程和线程

rootkit开发者应该知道,管理运行中代码的主要机制是线程,
并非进程。Windows内核基于线程而不是进程的数量对进程进行调度。
假如丰在两个进程,一个是单线程的,另一个具有9个线程。则系
统将为每个线程分配10%的处理时间。单线程的进程只能获得10%的CPU
时间,而具有9个线程的进程会得到90%的时间。当然,这是一个人为示例,
因为其它因素(如优先级)也在调度过程中发挥作用。但以下事实仍存在:
当其它所有因素相同时,调度工作完全基于线程数目,而不是进程数目。
什么是进程?在Windows系统中,进程只是一组线程共享以下数据的一种方式:
* 虚拟地址空间(即CR3的值)
* 访问令牌,包括SID
* Win32内核对象的句柄表
* 工作集(进程“拥有”的物理内存)

rootkit出于多种目的(如潜行和代码注入)必须处理线程和线程结构。它不必
创建新进程,而是创建新线程并将其分配给现有进程。需要创建一个全新进程
的情况很少。

  当切换到一个新线程的上下文时,旧线程的将态会保存起来。每个线程都有自
己的内核堆栈,因此将线程状态推入到线程内核堆栈的顶部。若新线程属于另一
个进程,则将新进程的页目录地址加载到CR3中。页目录地址可以在进程的KPROCESS
结构中找到。一旦发现了新线程中内核堆栈,就从该堆栈的顶部弹出新线程的上下文,
并开始执行新线程。若rootkit修改了进程的页表,该修改将作用于该进程中的所有
线程,因为这些线程都共享同一个CR3值。

//关闭内存保护机制
__asm
{
push eax
mov eax,CR0
and eax,0xFFFEFFFF
mov CR0,eax
pop eax
}

//恢复内存保护机制
__asm
{
push eax
mov eax,CR0
or eax,NOT 0xFFFEFFFF
mov CR0,eax
pop eax
}

抱歉!评论已关闭.