icesword 是如何列出隐藏进程(icesword pspcidtable) 【百科全说】-凯发k8官方旗舰厅

腾讯视频/爱奇艺/优酷/外卖 充值4折起

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 时则停止枚举。

04/14 16:00
在winnt下 "真正隐藏进程 "这一说法,可以讲是根本不可能实现,只要我们的程序是以进程内核的形式运行,都是不可能逃离ctrl alt del的法眼。那么奇怪了,这岂不是与我们的标题《winnt & win2k下实现进程的完全隐藏》相矛盾吗?是的,实际上应该是:以非进程方式执行目标代码,而逃避进程查看器的检查,从而达到 "进程隐藏 "的目的。 我们这里用的,是在宿主进程中,以线程的方式执行我们的代码。实现起来非常简单。首先,我们先建立一个不执行任何语句的线程 复制代码 代码如下: dw
11/22 04:03
hidetoolz(隐藏进程工具)是一款非常好用的隐藏进程工具,该软件界面简洁,操作简单,能完美隐藏正在进行的程序,最重要的是,其他软件也很难检测出用户所隐藏的进程,支持隐藏还原,使用非常方便!使用电脑的过程中,打开运行任何一款程序都叫做进程,我们也可以通过任务管理器随时查看正在运行的程序软件.对于进程出于某些原因,有的时候我们可能需要将其隐藏起来,那么该怎么隐藏进程呢?接下来就和小编一起来看看hidetoolz软件隐藏进程的方法吧! hidetoolz进程隐藏方法 1.下载hidetoolz到
04/19 00:03
在之前的教程中,小编跟大家分享过通过关闭进程来关闭软件的方法,但是,如果不想某一款软件被发现并关闭的话,可以选择在电脑里下载一款进程隐藏器.那么,进程隐藏器哪个好?下面,给大家推荐7款进程隐藏器,并附上进程隐藏器的软件介绍和下载地址,一起来看看! 一.hide process tools hide process tools是一个系统进程隐藏工具,它可以帮您彻底隐藏进程不被进程管理器及其它软件结束,完全替换掉传统的隐藏方式,漂亮的真彩色界面让及每个程序的图标及运行情况让你一目了然. 二.hide
04/16 22:02
ps -ef|grep local=no|grep -v grep|cut -c 9-15|xargs kill -9 管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。下面说说用管道符联接起来的 几个命令: “ps - ef”是red hat 里查看所有进程的命令。这时检索出的进程将作为下一条命令“grep local=no”的输入。   “grep local=no”的输出结果是,所有含有关键字“local=no”的进程,这是oracle数据库中远程连接进程的
11/30 16:31
学会如何在dos中分析进程的方法,在无法进人桌面环境时就显得非常有用。?丝吹姆椒ê芗虻ィ?/p> 步骤1:在win7旗舰版中“运行”栏中使用“cmd”命令打开“命令提示符”窗口。 步骤2:输入“tasklist”命令并按enter键,在随即得到的如图所示反馈信息中,就可以看到本机的所有进程了。 从上图中可以看出,本机的进程显示结果由五部分组成:图像名(进程名)、pid、会话名、会话#、内存使用。此时,如果要关闭某个进程(如要终止本机的“qq.exe”进程),就应该首先使用t
05/03 09:52
从2.6.16版本的kernel开始,我们可以使用proc文件系统中的smaps来查找这个问题。下边是一个列出所有进程占用swap分区情况的列表。可以通过简单修改就可以用于统计在/proc/$pid/smaps查出。以下是脚本: for i in `cd /proc;ls |grep "^[0-9]"|awk ' $0 >100'` ;do awk '/swap:/{a=a $2}end{print '"$i"',a/1024"m"}' /proc/$i/smaps ;done |sort
06/28 22:22
常规篇: 首先,用ps查看进程,方法如下: 代码如下: $ ps -ef -- smx 1822 1 0 11:38 ? 00:00:49 gnome-terminal smx 1823 1822 0 11:38 ? 00:00:00 gnome-pty-helper smx 1824 1822 0 11:38 pts/0 00:00:02 bash smx 1827 1 4 11:38 ? 00:26:28 /usr/lib/firefox-3.6.18/firefox-bin smx 185
01/10 07:48
kill kill 命令:发送指定的信号到相应进程.不指定信号将发送sigterm(15)终止指定进程.若仍无法终止该程序可用"-kill" 参数,其发送的信号为sigkill(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号.root用户将影响用户的进程,非root用户只能影响自己的进程 -l <信号变化哦啊>,若不加信号的编号参数,则使用"-l"参数会列出全部的信号名称 -a 当处理当前进程时,不限制命令名和进程号的对应关系 -p
03/03 09:18
linux 中ps命令是process status的缩写.ps命令可以列出系统中当前运行的进程,所列出的进程是执行ps命令这个时刻正在运行的进程. 如果要动态显示进程信息,需要使用top命令. 通过ps命令,可以确定哪些进程正在运行和运行状态.进程是否结束.进程是否僵死,哪些进程占用过多资源等. 要杀死进程,使用kill命令,例:kill 12345 (12345为进程的pid) linux进程有5种状态 1.运行(正在运行或在运行队列中等待) 2.中断(休眠中,受阻,或等待某个条件的形成或接
网站地图