探索黑客技术攻防,实战研究与安全创新

导航菜单

进程的冻结与解冻

在调试进程或为进程打补丁(这个补丁通常是内存补丁.文件补丁的话这样做是没有意义的)的时候,我们需要把进程的主线程挂起,以防止补丁程序在执行补丁代码的过程中被Windows打断。不过本文并不是要说如何去调试进程,或者是如何为进程打内存补丁,而是要探讨一下如何把一个进程的主线程挂起。

冻结进程

挂起一个进程的主线程有两种方法,第  种方法是使用CreateProcess函数创建一个进程,在创建进程时.给CraataProcess函数传递一个C~EATE_SUSPEN-DED参数,CREATE_SUSPENDED会使新建进程的主线程一开始就处于挂起状态。这种方法虽然受限于调用CreateProcess函数的父进程,但却是比较方便的一种方法。第二种方法相对于第一种方法要复杂一些,但是它用起来比较灵活,也不再受限于父进程的创建。这种方法是先得到目标进程的PID(PID就是进程的ID),然后遍历系统中所有的线程,并比较线程所属进程的PID是否与我们的目标进程的PID相等,相等的话就打开线程得到线程的句柄,并暂停这个线程,让其挂起。这一系列过程用语言描述确实不太容易,而且我的表达也不是很清楚,因此还是直接拿出源代码和大家一起来分析好了。

要得到目标进程的Pid,就要先遍历系统中所有的进程,实现代码如下。

这段代码很常见了。我就不做过多的解释了。实在不了解的朋友。找到目标进程的PID后,接下来就是遍历系统中所有的线程了。这与上面的结构差不多,只是在调用CreateTo01help32Snapshot函数时.不再使用TH32CS_SNAPPROCESS参数,取而代之的是TH32CS_SNAPTHREAD.换了这个参数就可以遍历系统中所有的线程了。遍历时.我们所使用的函数是THread32First和Thread32Next。在遍历系统中所有线程的时候,与遍历进程时是有所不同的,因为我们需要暂停目标进程的主线程。这两者不同之处的代码如下。

这段代码使用了OpenThread和SuspendTHread两个函数。SuspendThread函数的原型如下

它只有一个参数.就是要暂停线程的句柄。而得到线程句柄的函数OpenThread是在Windows 2000以上的系统中才有的,所以在VC++ 6.0下本身是没有这个函数的定义的,需要下载新的SDK来调用这个函数,下载地址和使用新的SDK在后面会给大家介绍。我们先看看OpenTHraad函数各个参数的具体意义,其原型如下:

我们使用OpenThread函数就可以得到SuspendThread函数需要的参数了.也就可以完成我们要冻结进程的功能了。以上就是第二种暂停一个线程的实现方法。

另外,新的SDK的下载地址是h tip://www.microsoft.com/rnsdownload/p!atformsdk/sdkupdate/,下载后需要添加到Vc++中,否则是没有办法使用的。添加方法是在vc++的菜单中选择"Tools ->Options->Dir ector Jes“,如图1和图2所示。添加成功以后,一定要把我们新添加的路径放在最上面,因为在搜索路径时有优先搜索功能,OpenThread函数在windows.h中,如果先搜索到旧的windows.H文件,就会提示没有定义OpenThread函数,因为旧的windows.h文件中根本就没有定义这个函数。

解冻进程

上面介绍了冻结进程的方法,下面再来说说解冻进程的实现。这与刚才的方法是完全一样的,只是不再调用SuspendThread函数,而是使用ResumeTHread函数来恢复刚才冻结进程的主线程。ResumeTHread函数的原型如下

这个函数同样只有一个参数.与SuspendTHread函数的参数相同。只要使用"::resumeThread( oth)”替换上面的"::Suspendthread(oth)"就可以恢复被挂起进程的主线程了。是不是很简单呢?最后,我给大家抓个图来看看效果如何,如图3所示。看见了吧7效果确实不错源代码我已随文提供,大家自己在vc下编译后试试效果吧。如果有什么疑问或者是发现的话,大家可以互相讨论.共同进步。

植入执行文件穿越软件防火墙现在的个人防火墙一般都Hook了NDIS协议驱动的hIDIS_PROTOCOL_BLOCK链,并Hook了TD! drivertcpip.sys的几个Device.天网应该是用了loAttacHDevice._aHook dispatch表会更简单一些。

Hook TDI主要是为了能够实现用户层的进程.IP地址和端口的控制(因为协议层是不可中断的)。当然,这方面的任务并不一定需要在TDl中实现,费尔防火墙使用了SPI实现.从这一点上看天网更安全,技术更复杂一些.Hook TDI非常麻烦.UnHook TDI需要重新启动电脑,因为Hook TDl SET_EVENT_HANDLE是不可逆的。如果防火墙只Hook了TCPII:.TCPIP_WAhIARP等几个特定的协议,我们可以编写一个NDIS协议驱动穿越它(比如WinCap).然而Hook所有的协议驱动并不难,就是烦了一些。

如果防火墙真的Hook了所有的协议或是IM类型的,那我们就只能HookNDIS.sYs的API,把我们的驱动设置成在miniport驱动之前启动(BOOT类型)了。好烦啊!我们接下来要说的是不用驱动实现穿越防火墙的方法,别扔番茄过来.如果你对上面的以驱动实现的反防火墙Rootkit有兴趣的话,我会在以后的文章中——叙述的。

植入程序的实现

我植入程序的思路如下。

1、修改执行文件(ex e).加入一个CODE段,如果操作系统支持SFC,则关闭它(这由安装程序实现1。

2、通过ESP获得Kernel32.dLL的base地址,获取所需要的APl和LIbrary(ws2_32.DLL)地址。

3、调用CreateTHread.创造个线程调用我们的Socket程序。

4、主线程继续进行。

首先声明一下,一是汇编程序是一门艺术,可以写得很好看。很有效率,当然我远没有达到这个境界,而且写得比较随意,没有仔细去优化,尽管在WinDBG下调试了很多次,也测试了很多经过植入的程序。浏览了代码5、6次,如果有出错的地方或缺乏效率的地方请多多包涵。二是阅读汇编代码并不有趣(我是这样认为的,如果能用C实现的话。我决不会去写汇编代码).所以如果接下来将近1 000行的汇编代码可能让你失去耐心,请见谅。

0K。终于完成植入代码了,没趴下吧?汇编代码是用masm6.11版本编译的(选择tiny模式)。休息一下.我们继续分析安装代码(安装植入代码进入执行文件)。

安装代码的实现

1、安装代码是用C编写的,我先列出安装程序的使用说明。

2、植入文件函数。

3、如果是Windows 2000或者更高版本的操作系统.如果植入的文件是属于系统保护的文件,我们需要关闭WFP功能。

4、如何替换正在运行的文件。如果是Windows  NT系统,我们使用"MoveFileEx(MOVEFILE DEL AY_UP,ITlL_REBOOT):”即可实现如果是Win32系统的话.我们修改wininit.ini或建立wininit.ini文件,加入以下代码即可。具体操作请见随文提供的源代码。

本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法行为。