Icesword 是如何列出隐藏进程

   icesword 是通过 PspCidTable 这个表来遍历进程的, PspCidTable 是一个没有被 ntoskrnl.exe 导出的。这就涉及到如何定位

  PspCidTable 的问题。icesword 是通过搜索特征串的方式定位 PspCidTalbe. PspCidTable 是一个 HANDLE_TALBE 结构.

  PsLookupProcessByProcessId 函数中会引用 PspCidTalbe 变量。icesword 从 PsLookupProcessByProcessId 函数的前几十个字节

  内搜索 PspCidTalbe 变量。在icesword 里面是不能调试的即使是用 windbg , softice,syser 调试器下断点调试,也是断不住的。

  当然了你也不能用调试器调试,因为 icesword.exe 会在一个timer 中不停的重新设置 int 1,int 3 的中断处理函数。设置成

  windows ntoskrnl.exe 中的缺省处理函数。即使你用硬件断点寄存器也是不管用的。那有的人就会说既然设置成 windows ntoskrnl.exe

  中的缺省处理函数就可以使用 windbg 双机调试.icesword 也做了处理,icesword 会通过 KdDebuggerEnabled 变量判断是否允许内核

  调试。如果允许调试的话. icesword 会调用 KdDisableDebugger 函数禁止内核调试。

  第一部分

  (写的太细了,因为怕被 rootkIT 的作者利用.所以就把第一部分给去掉了.如果需要可以单独和我联系)

  写第二部分

  这里顺便在说两个分析 icesword 中遇到的反调试小陷阱 这里把代码片段列出来,希望作者原谅

  .text:000xxxF0 mov [ebp+IoControlCode], eax

  .text:000xxxF3 mov eax, [esp+5Ch-6Ch] ; 反调试代码

  .text:000xxxF7 push eax

  .text:000xxxF8 mov eax, [esp+60h-6Ch]

  .text:000xxxFC pop ebx

  .text:000xxxFD cmp eax, ebx

  .text:000xxxFF jz short loc_1240B ; 如果没有被调试则会跳转

  .text:000xxx01 mov eax, 200EDBh

  .text:000xxx06 not eax

  .text:000xxx08 push eax

  .text:000xxx09 pop edi

  .text:000xxx0A stosd

  .text:000xxxF3 mov eax, [esp+5Ch+6Ch] 当单步执行到这条指令或者在这条指令上设置断点的时候,因为当调试器在这条指令上弹出的时候会

  用到被调试程序的堆栈来保存 EFLAGS,CS,EIP, (如果 int 1,或 int 3 处理函数用任务门就可以解决这个问题。)例如 当代码执行到这条指令时

  ESP = 805E4320h 执行完这条指令是 eax 的值为 [ESP+5Ch-6Ch]=[ESP-10h]=[805E4320h-10h]=[805E4310h] 的值。

  当单步执行到 .text:000xxxF8 mov eax, [esp+60h-6Ch] 指令的时候 ESP=805E432Ch 以为其中入栈了一个 eax 所以 ESP=805E432Ch,

  执行完 .text:000xxxF8 mov eax, [esp+60h-6Ch] 条指令的时候 eax = [ESP+60h-6Ch]=[ESP-Ch]=[805E432Ch-Ch]=[805E4310h]

  如果不调试的情况下 读的是同一个地址的值,所以两个值比较应该是相同的 也就是 .text:000xxxFD cmp eax, ebx 这条指令的比较结果

  应该是相同的。这个指令 .text:000xxxFF jz short loc_1240B 执行后直接跳转到。

  如果是被调试器调试的情况下 .text:000xxxFF jz short loc_1240B 不会跳转。 如果不跳转时下面的代码 会覆盖掉系统的当前 ETHREAD

  指针。接下来在调用很多系统函数都会导致系统崩溃,并且是崩溃到系统模块里面,这样给你定位错误带来误导。哈哈

  .text:000xxx68 push 1 ; Alignment

  .text:000xxx6A push 40h ; Length

  .text:000xxx6C push CurrentEProcessObject ; Address

  .text:000xxx72 call ds:ProbeForRead

  这里是故意做个异常来实现跳转。如果你在 .text:000xxx72 call ds:ProbeForRead 指令上单步执行的时候调试器会跑飞了,

  也就是说从调试器退出了,没有继续跟踪下去。

  第三部分

  接下来说我们的 PspCidTable 我们找到了 PspCidTable 变量后, PspCidTable [这个 HANDLE_TABLE 的句柄表中,保存着所有进程和线程对象的指针。

  PID(进程ID)和 ThreadID(线程ID)就是在这个句柄表中的索引。这个 HANDLE_TABLE 不属于任何进程,也没有链在 HANDLE_TABLE 链上。全局变量

  PspCidTable 中是指向这个 HANDLE_TABLE 的指针。这个 HANDLE_TABLE 还有一点和别的 HANDLE_TABLE 都不同,就是它的 HANDLE_TABLE_ENTRY 中的

  第一个32bIT 放着的是对象体指针(当然需要转换)而不是对象头指针(对象指针就是对象体指针)。] (特别注明 在[]的话不是俺写的是在网上抄来的

  这里特别感谢 “JIURL玩玩Win2k进程线程篇 HANDLE_TABLE” 文章的作者:JIURL )

  我们之要想到办法遍历这个 PspCidTable 句柄表就可以遍历到系统的所有进程。icesword 为了遍历这个表他使用了系统为公开的 ntoskrnl.exe

  的导出函数 ExEnumHandleTable 。

  icesword 定位到 ntoskrnl.exe 导出的 ExEnumHandleTable函数。

  这个函数是未公开的函数。

  这个函数的函数原形可能是 VOID STDCALL ExEnumHandleTable (PULONG HandleTable, PVOID Callback, PVOID Param, PHANDLE Handle OPTIONAL);

  其中的参数 PULONG HandleTable 就可以用 PspCidTable 做参数.

  PVOID Callback 的类型为 bool (*EXENUMHANDLETABLECALLBACK)(HANDLE_TALBE_ENTRY*,DWORD PID,PVOID Param) 函数指针。

  PVOID Param 参数就是传送给回调函数的参数。

  PHANDLE Handle OPTIONAL 这个参数俺还没搞懂什么意思。在说俺也用不到他,所以也不管他了随他去吧。

  当调用 ExEnumHandleTable 函数的时候 函数在每次枚举到表中的一个句柄时都会调用一次回调函数。

  当调用的 Callback 回调函数返回值为 0 时继续枚举句柄表,如果返回 1 时则停止枚举。

时间: 2024-09-10 03:11:23

Icesword 是如何列出隐藏进程的相关文章

利用global API hooks在Win7系统下隐藏进程

本文讲的是利用global API hooks在Win7系统下隐藏进程, 0x00 前言 在之前的文章<Powershell tricks::Hide Process by kd.exe>介绍过通过kd.exe隐藏进程的技巧,最大的缺点是需要开启Local kernel debugging模式,等待重启才能生效  这次介绍另外一个隐藏进程的方法--利用global API hooks  优点是即时生效,不需要等待系统重启 0x01 简介 本文将要参照Sergey Podobry的文章,对该方法

[原创]一个简单的windows HOOK - 隐藏进程管理器中特定的进程

一个简单的windows HOOK - 隐藏进程管理器中特定的进程  (适用平台:windows 2000 sp4,windows XP sp2)           屏蔽任务管理器中的进程名称有很多种方法,可以在ring0级做文章: 修改内核进程链表,拦截内核API等.我这里只给出win32下的实现,原 理是最普通的 windows 钩子机制.实现语言 win32 汇编 (masm32):   0 在DllEntry中处理资源取得和产生"工作"线程: mov eax,_hinstan

ring0检测隐藏进程

//网上得到一篇好文章 Ring0下搜索内存枚举隐藏进程 ,但是拿里面的代码来使用的时候发现并没有太多效果 //于是修改之,终于实现了最初的目标 //由于直接搜索内存,跟系统调度没什么关系,所以能够枚举到各种方法隐藏的进程 包括断链.抹PspCidTable...  //甚至能枚举到已经"死掉"的进程,本程序通过进程的ExitTime来判断进程是不是已经结束 //除非能够把EProcess结构修改掉,但这个实现难度可能比较大,不知有没有哪位大侠试过(PID我修改过),欢迎讨论 // /

列出C#进程以及详细信息

建立一个listBox将进程名称遍历进去 this.listBox1.Items.Clear(); Process[] MyProcesses=Process.GetProcesses(); foreach(Process MyProcess in MyProcesses) { this.listBox1.Items.Add(MyProcess.ProcessName); } this.listBox1.SelectedIndex=0; 选中listBox里面的项后将进程详细信息显示在右面的La

隐藏任意进程、目录/文件、注册表、端口

查找进程,目录/文件,注册表等操作系统将最终调用 ZwQueryDirectoryFile,ZwQuerySystemInformation,ZwXXXValueKey 等函数.要想拦截这些函数达到隐藏目的,需先自己实现以上函数,并修改系统维护的一个SYSCALL 表使之指向自己预先定义的函数.因 SYSCALL 表在用户层不可见,所以要写 DRIVE 在 RING 0 下才可修改.关于如何修改已有文章详细介绍过,这里不在详述.(可以参见 sysinternals.com 或 WebCrazy

NT环境下进程隐藏的实现

在NT环境下隐藏进程,也就是说在用户不知情的条件下,执行自己的代码的 方法有很多种,比如说使用注册表插入DLL,使用Windows挂钩等等.其中比较有 代表性的是Jeffrey Richer在<Windows核心编程>中介绍的LoadLibrary方法和 罗云彬在<windows环境下32位汇编语言程序设计>中介绍的方法.两种方法的 共同特点是:都采用远程线程,让自己的代码作为宿主进程的线程在宿主进程的 地址空间中执行,从而达到隐藏的目的.相比较而言,Richer的方法由于可以使

WinNT及Win2K下实现进程的完全隐藏

面对众多的计算机高手,考虑许久,终于还是决定出来献丑一下,文章内尽量使用最简洁易懂的词汇及例子来介绍,希望能够对一些初学与进阶者有所帮助. 关于进程的隐藏,98下的例子数不胜数.WinNT/Win2K下的隐藏方法,西祠的高手shotgun在去年的6月就已经在网上发布出实例<揭开木马的神秘面纱<四>> ,我也多次拜读他的文章,对他的计算机水平及热心帮助朋友的作风十分敬佩.这里也可算是对shotgun的文章的补充与深入介绍吧,好了,闲话少说. 在WinNT下"真正隐藏进程&q

vbs枚举进程 vbs列出进程的详细列表_vbs

今天要说的是用VBS(VBScript脚本)来枚举Windows操作系统的进程,这样做的用处在什么地方呢?举个例子吧,比如你有时候想监控某个进程是否在运行,这就非常有用了. 示例: 用VBS脚本枚举进程 'enum.vbs Dim WMI,Objs,Process Set WMI=GetObject("WinMgmts:") Set Objs=WMI.InstancesOf("Win32_Process") Process="" For Each

[转贴]利用伪造内核文件来绕过IceSword的检测

[转贴]利用伪造内核文件来绕过IceSword的检测   作者:倪茂志邮件:backspray008@gmail.com完成于:2005.12.20 文章分为八个部分:   一.为什么需要伪造内核  二.伪造内核文件  三.隐藏进程  四.隐藏内核模块  五.隐藏服务  六.隐藏注册表  七.隐藏文件  八.关于端口 另:建议先看看最后那些参考文章. 一.为什么需要伪造内核:   I